-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathexecutor.py
More file actions
129 lines (103 loc) · 3.76 KB
/
Copy pathexecutor.py
File metadata and controls
129 lines (103 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import ccxt
from order_type import *
from trade import *
class Executor:
def __init__(self, ctySize = 1):
self.exchange = ccxt.gdax(self.getConfig())
self.market = self.exchange.market('BTC/EUR')
self.account_id = '37a4a4f2-7188-44d5-857e-575ea110f9a5'
self.reporter = None
self.positionManager = None
self.ctySize = ctySize
def getConfig(self):
return ({
'apiKey': os.environ['GDAX_KEY'],
'secret': os.environ['GDAX_SECRET'],
'password': os.environ['GDAX_PASSPHRASE']
})
def getAccountBalance(self):
balances = (self.exchange.fetchBalance())['info']
for x in balances:
if x['id'] == self.account_id:
return x
return None
def getAvailable(self):
accBalance = self.getAccountBalance()
if accBalance:
return self.exchange.decimal(accBalance['available'])
return None
def getBalance(self):
accBalance = self.getAccountBalance()
if accBalance:
return self.exchange.decimal(accBalance['balance'])
return None
# ----- generic -----
def getCtySize(self):
return self.ctySize
def getFee(self):
return self.fee
def getMarket(self):
return self.market
def getExchange(self):
return self.exchange
def getReporter(self):
return self.reporter
def setReporter(self, reporter):
self.reporter = reporter
def getPositionManager(self):
return self.positionManager
def setPositionManager(self, positionManager):
self.positionManager = positionManager
def fillPosition(self, p):
if self.positionManager:
self.positionManager.fill(p)
def reportTrade(self, trade):
if self.reporter:
self.reporter.reportTrade(trade)
def buy(self):
#amount = self.getAvailable()
amount = self.exchange.decimal(0.01)
return self.exchange.create_market_buy_order(self.getMarket(), amount)
def sell(self):
return self.exchange.create_market_sell_order(self.getMarket(), self.getAvailable())
class ExecutorMock(Executor):
def __init__(self, crypto, fiat, market, ctySize = 1, fee = 0.0025):
self.balance = {}
self.balance['balance'] = crypto
self.balance['available'] = crypto
self.balance['fiat'] = fiat
self.market = market
self.ctySize = ctySize
self.fee = fee
self.reporter = None
self.positionManager = None
def getAccountBalance(self):
return self.balance
def getAvailableFiat(self):
return (self.getAccountBalance())['fiat']
def getAvailableCrypto(self):
return (self.getAccountBalance())['balance']
def buy(self, price):
return self.buyCty(self.getCtySize(), price)
def buyCty(self, cty, price):
amount = cty * price
fee = amount * self.fee
self.balance['fiat'] = self.balance['fiat'] - amount - fee
self.balance['balance'] = self.balance['balance'] + cty
self.balance['available'] = self.balance['balance']
t = Trade(OrderType.BUY, cty, price, fee)
self.fillPosition(t.toPosition())
self.reportTrade(t)
return t
def sell(self, price):
return self.sellCty(self.getCtySize(), price)
def sellCty(self, cty, price):
amount = cty * price
fee = cty * price * self.fee
self.balance['balance'] = self.balance['balance'] - cty
self.balance['available'] = self.balance['balance']
self.balance['fiat'] = self.balance['fiat'] + amount - fee
t = Trade(OrderType.SELL, cty, price, fee)
self.fillPosition(t.toPosition())
self.reportTrade(t)
return t