Skip to content

Commit

Permalink
Merge pull request #3 from tomvanbraeckel/update-tradelist
Browse files Browse the repository at this point in the history
Various improvements to the updates of the trade lists
  • Loading branch information
zackcoburn committed Dec 3, 2017
2 parents 6c57277 + 9638be3 commit 3bc9411
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 22 deletions.
48 changes: 42 additions & 6 deletions python/etherdeltaclientservice.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@
import sys
import web3

# for debugging, enable this line and add pdb.set_trace() where you want a breakpoint:
# import pdb

from web3 import Web3, HTTPProvider
from operator import itemgetter
from collections import OrderedDict
Expand Down Expand Up @@ -150,6 +153,23 @@ def updateOneSideOfOrderBook(self, myTokenKey, token, orderbook, new_orders):
#print("Orderbook size changed by " + str(len(orderbook) - orderbook_before) + " orders")
return orderbook

def updateTradeList(self, token, tradelist, new_trades):
tradelistsize_before = len(tradelist)
for trade in new_trades:
# Delete deleted trades if getting the 'deleted' property does not return the 'no such property' default value (which is 'None')
if trade.get('deleted', None) != None:
print("Deleting this trade from the trade list: " + str(trade))
tradelist = [x for x in tradelist if x['txHash'].lower() != trade['txHash'].lower()]
elif len([x for x in tradelist if x['txHash'].lower() == trade['txHash'].lower()]) > 0:
newtradebook = []
for y in tradelist:
if y['txHash'].lower() == trade['txHash'].lower(): newtradebook.append(trade)
tradelist = newtradebook
elif trade['tokenAddr'].lower() == token.lower():
tradelist.append(trade)
print("Trade list size changed by " + str(len(tradelist) - tradelistsize_before) + " trades")
return tradelist

def updateOrders(self, newOrders):
self.orders_sells = self.updateOneSideOfOrderBook('tokenGive', self.token, self.orders_sells, newOrders['sells'])
self.my_orders_sells = self.updateOneSideOfOrderBook('tokenGive', self.token, self.my_orders_sells, [x for x in newOrders['sells'] if x['user'].lower() == self.userAccount.lower()])
Expand All @@ -162,12 +182,11 @@ def updateOrders(self, newOrders):
self.orders_buys = sorted(self.orders_buys, key=itemgetter('price'), reverse=True)

def updateTrades(self, newTrades):
valid_new_trades = [x for x in newTrades if ('tokenAddr' not in x or x['tokenAddr'].lower() == self.token.lower()) and x not in self.trades]
if len(valid_new_trades) > 0:
#print("Adding " + str(len(valid_new_trades)) + " new trades to the list...")
self.trades.extend(valid_new_trades)
self.trades = sorted(self.trades, key=itemgetter('date', 'amount'), reverse=True)
# TODO: also maintain my_trades list
self.trades = self.updateTradeList(self.token, self.trades, newTrades)
self.my_trades = self.updateTradeList(self.token, self.my_trades, [x for x in newTrades if x['buyer'].lower() == self.userAccount.lower() or x['seller'].lower() == self.userAccount.lower()])

self.trades = sorted(self.trades, key=itemgetter('amount'))
self.trades = sorted(self.trades, key=itemgetter('date'), reverse=True)

def printMyOrderBook(self):
print()
Expand Down Expand Up @@ -203,6 +222,22 @@ def printTrades(self):
for trade in self.trades[0:numTrades]:
print(trade['date'] + " " + trade['side'] + " " + trade['amount'] + " @ " + trade['price'])

def printMyTrades(self):
print()
print('My recent trades')
print('----------------')
numTrades = 10
for trade in self.my_trades[0:numTrades]:
print(trade['date'] + " " + trade['side'] + " " + trade['amount'] + " @ " + trade['price'])

def printBalances(self, token, userAccount):
print("Account balances:")
print("=================")
print("Wallet account balance: %.18f ETH" % self.getBalance('ETH', userAccount))
print("Wallet token balance: %.18f tokens" % self.getBalance(token, userAccount))
print("EtherDelta ETH balance: %.18f ETH" % self.getEtherDeltaBalance('ETH', userAccount))
print("EtherDelta token balance: %.18f tokens" % self.getEtherDeltaBalance(token, userAccount))

def createOrder(self, side, expires, price, amount, token, userAccount, user_wallet_private_key, randomseed = None):
global addressEtherDelta, web3

Expand Down Expand Up @@ -296,6 +331,7 @@ def trade(self, order, etherAmount, user_wallet_private_key=''):
# Build binary representation of the function call with arguments
abidata = self.contractEtherDelta.encodeABI('trade', kwargs=kwargs)
print("abidata: " + str(abidata))
# Use the transaction count as the nonce
nonce = web3.eth.getTransactionCount(self.userAccount)
# Override to have same as other transaction:
#nonce = 53
Expand Down
43 changes: 43 additions & 0 deletions python/etherdeltaclientservice_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
# Real GRX token
token = '0x219218f117dc9348b358b8471c55a073e5e0da0b'

# Orders
# These are from the buy side of the order book because they have tokenGet so they are buying token and giving ETH for it
item1 = {'expires': '104468244', 'amount': '1e+24', 'r': '0x9bd8cb2564ba8369e3ebbd5af9c3638e0cb2a929e8d5683d60baa523d3a1056e', 'updated': '2017-11-20T06:06:11.498Z', 'ethAvailableVolumeBase': '0.09999999998012342', 'v': 27, 'availableVolume': '9.9999999980123425774079e+23', 'nonce': '1950327344', 'ethAvailableVolume': '999999.9998012343', 'user': '0x1a4cfe7277bfdbd108ef42a3db9e8a1c05428c6c', 'tokenGet': '0x219218f117dc9348b358b8471c55a073e5e0da0b', 'availableVolumeBase': '99999999980123420', 'amountGet': '1e+24', 's': '0x5d287a474c8573e8d369eaf1067cfae6577ca8846044dc7ef014dc3e49479790', 'price': '0.0000001', 'amountFilled': None, 'id': '44fb9c61e6ffc5b4bd340f04f02e2bc6c3adb33514a091131fcc3a7d28c40374_buy', 'amountGive': '100000000000000000', 'tokenGive': '0x0000000000000000000000000000000000000000'}
item1_deleted = {'deleted': True, 'expires': '104468244', 'amount': '1e+24', 'r': '0x9bd8cb2564ba8369e3ebbd5af9c3638e0cb2a929e8d5683d60baa523d3a1056e', 'updated': '2017-11-20T06:06:11.498Z', 'ethAvailableVolumeBase': '0.09999999998012342', 'v': 27, 'availableVolume': '9.9999999980123425774079e+23', 'nonce': '1950327344', 'ethAvailableVolume': '999999.9998012343', 'user': '0x1a4cfe7277bfdbd108ef42a3db9e8a1c05428c6c', 'tokenGet': '0x219218f117dc9348b358b8471c55a073e5e0da0b', 'availableVolumeBase': '99999999980123420', 'amountGet': '1e+24', 's': '0x5d287a474c8573e8d369eaf1067cfae6577ca8846044dc7ef014dc3e49479790', 'price': '0.0000001', 'amountFilled': None, 'id': '44fb9c61e6ffc5b4bd340f04f02e2bc6c3adb33514a091131fcc3a7d28c40374_buy', 'amountGive': '100000000000000000', 'tokenGive': '0x0000000000000000000000000000000000000000'}
Expand All @@ -21,6 +22,14 @@

item2 = {'expires': '104468244', 'amount': '1e+24', 'r': '0x9bd8cb2564ba8369e3ebbd5af9c3638e0cb2a929e8d5683d60baa523d3a1056e', 'updated': '2017-11-20T06:06:11.498Z', 'ethAvailableVolumeBase': '0.09999999998012342', 'v': 27, 'availableVolume': '9.9999999980123425774079e+23', 'nonce': '1950327344', 'ethAvailableVolume': '999999.9998012343', 'user': '0x1a4cfe7277bfdbd108ef42a3db9e8a1c05428c6c', 'tokenGet': '0x219218f117dc9348b358b8471c55a073e5e0da0b', 'availableVolumeBase': '99999999980123420', 'amountGet': '1e+24', 's': '0x5d287a474c8573e8d369eaf1067cfae6577ca8846044dc7ef014dc3e49479790', 'price': '0.0000001', 'amountFilled': None, 'id': '45fb9c61e6ffc5b4bd340f04f02e2bc6c3adb33514a091131fcc3a7d28c40374_buy', 'amountGive': '100000000000000000', 'tokenGive': '0x0000000000000000000000000000000000000000'}

# Trades
trade_sellside = {"txHash":"0xddbe429d859666217ef28a2abc74832f0bfe340f7f772058d5e885d54bff8312","date":"2017-11-15T18:32:08.000Z","price":"0.00491","side":"sell","amount":"546","amountBase":"2.68086","buyer":"0xabbb9f579d421a72301abffbfa85b7caa998f7bd","seller":"0xde57392f4ee115dfd457404215ecb590bf6c9fc2","tokenAddr":"0x219218f117dc9348b358b8471c55a073e5e0da0b"}
trade_buyside = {"txHash":"0x5a0818b4ceae815fededd82c511ccfe0f08d62d2f309cdaa7e54583ac5c4129f","date":"2017-11-15T18:32:57.000Z","price":"0.0036555","side":"buy","amount":"1200","amountBase":"4.3866","buyer":"0x3a9420663811a77617bc5809149bb2bc235facfa","seller":"0x73ced35ea2e3cab70fcb94a846ecffc008704b39","tokenAddr":"0x219218f117dc9348b358b8471c55a073e5e0da0b"}

mytrade_buyside = {"txHash":"0x5a0818b4ceae815fededd82c511ccfe0f08d62d2f309cdaa7e54583ac5c4129f","date":"2017-11-15T18:32:57.000Z","price":"0.0036555","side":"buy","amount":"1200","amountBase":"4.3866","buyer":"0x51df0000000000000000000000052F2e7808Ee2b","seller":"0x73ced35ea2e3cab70fcb94a846ecffc008704b39","tokenAddr":"0x219218f117dc9348b358b8471c55a073e5e0da0b"}
# More trades
#{"txHash":"0x5b06767bcb1ec2f87e43e2b89c0004335bea57b10d0ca298ffdfebd9a2427806","date":"2017-11-15T18:32:57.000Z","price":"0.00333","side":"buy","amount":"375","amountBase":"1.24875","buyer":"0x3a9420663811a77617bc5809149bb2bc235facfa","seller":"0xed7b254309b8e5c69409dcf40e2b119677fce144","tokenAddr":"0x56ba2ee7890461f463f7be02aac3099f6d5811a8"},{"txHash":"0x85cd0d02a436f9c186669aab46aaaf53b081867aa94239a8e300a115f63802f1","date":"2017-11-15T18:32:57.000Z","price":"0.0000427","side":"sell","amount":"20000","amountBase":"0.854","buyer":"0x8dc030c3078ab6af850d069d2a0e5ad473327202","seller":"0xca17b82dd20e95ba3c012c6a53bc5f8a706483e1","tokenAddr":"0x6aac8cb9861e42bf8259f5abdc6ae3ae89909e11"},{"txHash":"0x90d7d9b0a086843eddd12ae91ce2e5b998e2eb1850bc6b688e8e7f0e6efa5501","date":"2017-11-15T18:32:57.000Z","price":"0.002","side":"sell","amount":"597.806","amountBase":"1.195612","buyer":"0xb42c4b5eda4035d3898af3b5fe4118841b96de1c","seller":"0x23f2030563a7bbb9369eea4447eb1475f51b6bdf","tokenAddr":"0xba5f11b16b155792cf3b2e6880e8706859a8aeb6"}

# This class tests the function:

class TestTaker(unittest.TestCase):
Expand Down Expand Up @@ -89,6 +98,40 @@ def test_updateOneSideOfOrderBook_add_updated(self):
self.assertEqual(len(orderbook), 1)
self.assertEqual(orderbook[0]['amountFilled'], 42)

def test_updateTradeList(self):
tradelist = [trade_sellside]
new_trades = [trade_buyside]
self.assertEqual(len(tradelist), 1)
tradelist = self.es.updateTradeList(token, tradelist, new_trades)
self.assertEqual(len(tradelist), 2)

def test_updateTrades(self):
tradelist = [trade_sellside]
new_trades = [trade_buyside]
self.assertEqual(len(tradelist), 1)
# Setup self.es
self.es.trades = tradelist
self.es.my_trades = []
self.es.token = token
self.es.userAccount = userAccount
# Test self.es
self.es.updateTrades(new_trades)
self.assertEqual(len(self.es.my_trades), 0)
self.assertEqual(len(self.es.trades), 2)

def test_updateTrades_my_trades(self):
tradelist = [trade_sellside]
new_trades = [mytrade_buyside]
# Setup self.es
self.es.trades = tradelist
self.es.my_trades = []
self.es.token = token
self.es.userAccount = userAccount
# Test self.es
self.es.updateTrades(new_trades)
self.assertEqual(len(self.es.my_trades), 1)
self.assertEqual(len(self.es.trades), 2) # trade should also get added to the general trade list

def test_createSellOrder(self):
result = self.es.createOrder('sell', 10000, 4, 2, token, userAccount, private_key, 42)

Expand Down
9 changes: 1 addition & 8 deletions python/maker.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,7 @@
es.start(userAccount, token)
print("EtherDeltaClientService started")

print("")
print("Account balances:")
print("=================")
print("Wallet account balance: %.18f ETH" % es.getBalance('ETH', userAccount))
print("Wallet token balance: %.18f tokens" % es.getBalance(token, userAccount))
print("EtherDelta ETH balance: %.18f ETH" % es.getEtherDeltaBalance('ETH', userAccount))
print("EtherDelta token balance: %.18f tokens" % es.getEtherDeltaBalance(token, userAccount))
print("")
es.printBalances(token, userAccount)

while es.getBestSellOrder() == None or es.getBestBuyOrder() == None:
print("Waiting until best sell and buy orders are known...")
Expand Down
9 changes: 1 addition & 8 deletions python/taker.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,7 @@
es.start(userAccount, token)
print("EtherDeltaService started")

print("")
print("Account balances:")
print("=================")
print("Wallet account balance: %.18f ETH" % es.getBalance('ETH', userAccount))
print("Wallet token balance: %.18f tokens" % es.getBalance(token, userAccount))
print("EtherDelta ETH balance: %.18f ETH" % es.getEtherDeltaBalance('ETH', userAccount))
print("EtherDelta token balance: %.18f tokens" % es.getEtherDeltaBalance(token, userAccount))
print("")
es.printBalances(token, userAccount)

while es.getBestSellOrder() == None:
print("Waiting until best sell order to buy is known...")
Expand Down

0 comments on commit 3bc9411

Please sign in to comment.