|
1 | 1 | import poloniex |
2 | 2 |
|
3 | | -class StopLimit(object): |
4 | | - def __init__(self, market, amount, stop, limit, test=False): |
5 | | - self.market = str(market) |
6 | | - self.amount = float(amount) |
7 | | - self.stop = float(stop) |
8 | | - self.limit = float(limit) |
9 | | - self.order = False |
10 | | - self.logger = poloniex.logging.getLogger('StopLimit') |
11 | | - self.logger.setLevel(poloniex.logging.DEBUG) |
12 | | - self.test = test |
| 3 | +class StopPoloniex(poloniex.PoloniexSocketed): |
| 4 | + def __init__(self, *args, **kwargs): |
| 5 | + super(StopPoloniex, self).__init__(*args, **kwargs) |
| 6 | + # holds stop orders |
| 7 | + self.stopOrders = {} |
| 8 | + |
| 9 | + def on_ticker(self, msg): |
| 10 | + data = [float(dat) for dat in msg] |
| 11 | + # check stop orders |
| 12 | + mkt = self.channels[str(int(data[0]))]['name'] |
| 13 | + la = data[2] |
| 14 | + hb = data[3] |
| 15 | + for id in self.stopOrders: |
| 16 | + # market matches and the order hasnt triggered yet |
| 17 | + if str(self.stopOrders[id]['market']) == str(mkt) and not self.stopOrders[id]['order']: |
| 18 | + self.logger.debug('%s lowAsk=%s highBid=%s', mkt, str(la), str(hb)) |
| 19 | + self._check_stop(id, la, hb) |
13 | 20 |
|
14 | | - def check(self, lowAsk, highBid): |
| 21 | + |
| 22 | + |
| 23 | + def _check_stop(self, id, lowAsk, highBid): |
| 24 | + amount = self.stopOrders[id]['amount'] |
| 25 | + stop = self.stopOrders[id]['stop'] |
| 26 | + test = self.stopOrders[id]['test'] |
15 | 27 | # sell |
16 | | - if self.amount < 0 and self.stop >= float(highBid): |
| 28 | + if amount < 0 and stop >= float(highBid): |
17 | 29 | # dont place order if we are testing |
18 | | - if self.test: |
19 | | - self.order = True |
| 30 | + if test: |
| 31 | + self.stopOrders[id]['order'] = True |
20 | 32 | else: |
21 | 33 | # sell amount at limit |
22 | | - self.order = self.sell(self.market, |
23 | | - self.limit, |
24 | | - abs(self.amount)) |
| 34 | + self.stopOrders[id]['order'] = self.sell( |
| 35 | + self.stopOrders[id]['market'], |
| 36 | + self.stopOrders[id]['limit'], |
| 37 | + abs(amount)) |
25 | 38 |
|
26 | 39 | self.logger.info('%s sell stop order triggered! (%s)', |
27 | | - self.market, str(self.stop)) |
| 40 | + self.stopOrders[id]['market'], |
| 41 | + str(stop)) |
| 42 | + if self.stopOrders[id]['callback']: |
| 43 | + self.stopOrders[id]['callback'](id) |
| 44 | + |
28 | 45 | # buy |
29 | | - if self.amount > 0 and self.stop <= float(lowAsk): |
| 46 | + if amount > 0 and stop <= float(lowAsk): |
30 | 47 | # dont place order if we are testing |
31 | | - if self.test: |
32 | | - self.order = True |
| 48 | + if test: |
| 49 | + self.stopOrders[id]['order'] = True |
33 | 50 | else: |
34 | 51 | # buy amount at limit |
35 | | - self.order = self.buy(self.market, self.limit, self.amount) |
| 52 | + self.stopOrders[id]['order'] = self.buy( |
| 53 | + self.stopOrders[id]['market'], |
| 54 | + self.stopOrders[id]['limit'], |
| 55 | + amount) |
36 | 56 |
|
37 | 57 | self.logger.info('%s buy stop order triggered! (%s)', |
38 | | - self.market, str(self.stop)) |
39 | | - |
40 | | - def __call__(self): |
41 | | - return self.order |
| 58 | + self.stopOrders[id]['market'], |
| 59 | + str(stop)) |
| 60 | + if self.stopOrders[id]['callback']: |
| 61 | + self.stopOrders[id]['callback'](id) |
42 | 62 |
|
43 | 63 |
|
44 | | -class CPolo(poloniex.Poloniex): |
45 | | - def __init__(self, *args, **kwargs): |
46 | | - super(CPolo, self).__init__(*args, **kwargs) |
47 | | - self.stopOrders = {} |
48 | | - |
49 | | - def on_ticker(self, msg): |
50 | | - self._checkStops(msg) |
51 | | - |
52 | | - def _checkStops(self, msg): |
53 | | - mktid = str(msg[0]) |
54 | | - mkt = self.channels[mktid]['name'] |
55 | | - la = msg[2] |
56 | | - hb = msg[3] |
57 | | - for order in self.stopOrders: |
58 | | - if str(self.stopOrders[order].market) == str(mkt) and not self.stopOrders[order](): |
59 | | - self.logger.debug('%s lowAsk=%s highBid=%s', |
60 | | - mkt, str(la), str(hb)) |
61 | | - self.stopOrders[order].check(la, hb) |
62 | | - |
63 | | - def addStopLimit(self, market, amount, stop, limit, test=False): |
| 64 | + def addStopLimit(self, market, amount, stop, limit, callback=None, test=False): |
| 65 | + self.stopOrders[market+str(stop)] = {'market': market, |
| 66 | + 'amount': amount, |
| 67 | + 'stop': stop, |
| 68 | + 'limit': limit, |
| 69 | + 'callback': callback, |
| 70 | + 'test': test, |
| 71 | + 'order': False |
| 72 | + } |
64 | 73 | self.logger.debug('%s stop limit set: [Amount]%.8f [Stop]%.8f [Limit]%.8f', |
65 | 74 | market, amount, stop, limit) |
66 | | - self.stopOrders[market+str(stop)] = StopLimit(market, amount, stop, limit, test) |
| 75 | + |
67 | 76 |
|
68 | 77 |
|
69 | 78 | if __name__ == '__main__': |
70 | 79 | import logging |
71 | 80 | logging.basicConfig() |
72 | | - test = CPolo('key', 'secret') |
| 81 | + test = StopPoloniex('key', 'secret') |
| 82 | + def callbk(id): |
| 83 | + print(test.stopOrders[id]) |
73 | 84 | test.logger.setLevel(logging.DEBUG) |
74 | 85 | tick = test.returnTicker() |
75 | 86 | test.addStopLimit(market='BTC_LTC', |
76 | 87 | amount=0.5, |
77 | 88 | stop=float(tick['BTC_LTC']['lowestAsk'])+0.000001, |
78 | 89 | limit=float(0.004), |
| 90 | + callback=callbk, |
79 | 91 | # remove or set 'test' to false to place real orders |
80 | 92 | test=True) |
81 | 93 |
|
82 | 94 | test.addStopLimit(market='BTC_LTC', |
83 | 95 | amount=-0.5, |
84 | 96 | stop=float(tick['BTC_LTC']['highestBid'])-0.000001, |
85 | 97 | limit=float(0.004), |
| 98 | + callback=callbk, |
86 | 99 | # remove or set 'test' to false to place real orders |
87 | 100 | test=True) |
88 | 101 | test.startws(['ticker']) |
|
0 commit comments