Skip to content

Commit f95cdfa

Browse files
committed
bugfix cancel_order_all() close_position(), check DDosProtection
1 parent 33e6424 commit f95cdfa

File tree

3 files changed

+28
-14
lines changed

3 files changed

+28
-14
lines changed

Diff for: flyerbots/exchange.py

+3
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@ def wait_for_completion(self):
276276
msg = e.args[0]
277277
if '{' in msg:
278278
res = json.loads(msg[msg.find('{'):])
279+
except ccxt.DDoSProtection as e:
280+
self.logger.warning(type(e).__name__ + ": {0}".format(e))
281+
self.order_is_not_accepted = datetime.utcnow()+timedelta(seconds=12)
279282
except LightningError as e:
280283
self.logger.warning(type(e).__name__ + ": {0}".format(e))
281284
res = e.args[0]

Diff for: flyerbots/order.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,17 @@ def overwrite(self, o, latest):
122122
def cancel_order(self, myid):
123123
cancelable = ['open', 'accepted']
124124
with self.lock:
125-
my_orders = [v for v in self.orders.values() if v['myid']==myid and v['status'] in cancelable]
125+
my_orders = [v for v in self.orders.values() if (v['type'] != 'market') and (v['myid']==myid) and (v['status'] in cancelable)]
126126
for o in my_orders:
127-
if o['type'] != 'market':
128-
o['status'] = 'cancel'
127+
o['status'] = 'cancel'
129128
return my_orders
130129

131130
def cancel_order_all(self):
132131
cancelable = ['open', 'accepted']
133132
with self.lock:
134-
my_orders = [v for v in self.orders.values() if v['status'] in cancelable]
133+
my_orders = [v for v in self.orders.values() if (v['type'] != 'market') and (v['status'] in cancelable)]
135134
for o in my_orders:
136-
if o['type'] != 'market':
137-
o['status'] = 'cancel'
135+
o['status'] = 'cancel'
138136
return my_orders
139137

140138
def get_order(self, myid):

Diff for: flyerbots/strategy.py

+21-8
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,16 @@ def cancel(self, myid):
7676
self.exchange.cancel(myid)
7777

7878
def cancel_order_all(self, symbol = None):
79-
"""すべての注文をキャンセルする"""
79+
"""すべての注文をキャンセル"""
8080
self.exchange.cancel_order_all(symbol or self.settings.symbol)
8181

8282
def close_position(self, symbol = None):
83+
"""ポジションクローズ"""
84+
if self.exchange.order_is_not_accepted is not None:
85+
if not self.hft:
86+
self.logger.info("REJECT: {0} order is not accepted...".format(myid))
87+
return
88+
# 最小注文サイズ取得
8389
symbol = symbol or self.settings.symbol
8490
if symbol == 'FX_BTC_JPY':
8591
min_qty = 0.01
@@ -98,10 +104,21 @@ def close_position(self, symbol = None):
98104
if buysize < min_qty:
99105
buysize = fsum([buysize,min_qty])
100106
sellsize = min_qty
107+
# 注文作成
108+
close_orders = []
101109
if sellsize:
102-
self.exchange.create_order('L close', 'sell', sellsize, None, None, None, None, symbol)
110+
close_orders.append(('__Lc__', 'sell', sellsize))
103111
if buysize:
104-
self.exchange.create_order('S close', 'buy', buysize, None, None, None, None, symbol)
112+
close_orders.append(('__Sc__', 'buy', buysize))
113+
for order in close_orders:
114+
myid, side, size = order
115+
# 約定するまで次の注文は受け付けない
116+
o = self.exchange.get_order(myid)
117+
if o.status == 'open' or o.status == 'accepted':
118+
delta = datetime.utcnow() - o.accepted_at
119+
if delta < timedelta(seconds=60):
120+
continue
121+
self.exchange.create_order(myid, side, size, None, None, None, None, symbol)
105122

106123
def order(self, myid, side, qty, limit=None, stop=None, time_in_force = None, minute_to_expire = None, symbol = None, limit_mask = 0, seconds_to_keep_order = None):
107124
"""注文"""
@@ -296,11 +313,7 @@ def wrapper(*args, **kargs):
296313

297314
def async_result(f_result, last):
298315
if f_result is not None and f_result.done():
299-
try:
300-
return None, f_result.result()
301-
except Exception as e:
302-
self.logger.warning(e)
303-
f_result = None
316+
return None, f_result.result()
304317
return f_result, last
305318

306319
self.hft = self.settings.interval < 3

0 commit comments

Comments
 (0)