Skip to content

Commit 52a2520

Browse files
committed
Fixed stop-loss strategy entrance for trailing stop-loss.
1 parent f616de9 commit 52a2520

File tree

2 files changed

+43
-37
lines changed

2 files changed

+43
-37
lines changed

Bot/Strategy/StopLossStrategy.py

+42-37
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,24 @@ def adjust_stoploss_price(self, current_price=None):
6868
completed_targets = [o for o in self.trade.exit.get_completed_targets()]
6969
has_completed_targets = len(completed_targets) > 0
7070

71+
#if target has its own stop-loss set
7172
if has_completed_targets and completed_targets[-1].has_custom_stop():
7273
# sort by order value
7374
self.current_stop_loss = completed_targets[-1].sl
7475
self.logInfo('Assigning Stop Loss from the Target: {}'.format(completed_targets[-1]))
7576
return
7677

77-
if current_price is None:
78-
self.current_stop_loss = self.trade.sl_settings.last_stoploss if self.trade.sl_settings.last_stoploss != 0 \
79-
else self.initial_sl().price
80-
return
81-
82-
if not has_completed_targets:
83-
return
78+
if not self.trade.sl_settings.is_trailing():
79+
# if that's not a trailing target
80+
if current_price is None:
81+
self.current_stop_loss = self.trade.sl_settings.last_stoploss if self.trade.sl_settings.last_stoploss != 0 \
82+
else self.initial_sl().price
83+
return
84+
else:
85+
# if that's a trailing target, should be triggered only after at least one exit target completed
86+
if not has_completed_targets:
87+
return
8488

85-
# expected_stop_loss = 0
86-
if self.trade.sl_settings.is_trailing():
8789
trialing_val = self.trade.sl_settings.val.get_val(current_price)
8890
expected_stop_loss = current_price + (-1 if self.trade.is_sell() else 1) * trialing_val
8991

@@ -136,37 +138,40 @@ def set_stoploss_order(self):
136138
# pass
137139

138140
try:
139-
if self.simulate:
140-
order = self.fx.create_test_stop_order(self.symbol(), self.trade_side().name, self.current_stop_loss, 50)
141-
order['orderId'] = 2333123
142-
else:
143-
self.cancel_all_orders()
144-
AccountBalances().update_balances(self.fx.get_all_balances_dict())
141+
# if self.simulate:
142+
# order = self.fx.create_test_stop_order(self.symbol(), self.trade_side().name, self.current_stop_loss, 50)
143+
# order['orderId'] = 2333123
144+
# else:
145+
self.cancel_all_orders()
146+
AccountBalances().update_balances(self.fx.get_all_balances_dict())
147+
148+
price = self.exchange_info.adjust_price(self.get_sl_limit_price())
149+
bal = self.trade.get_cap(self.get_balance_for_side().avail)
145150

146-
price = self.exchange_info.adjust_price(self.get_sl_limit_price())
147-
bal = self.trade.get_cap(self.get_balance_for_side().avail)
148-
149-
bal = round(bal / price, 8) if self.trade_side().is_buy() else bal
150-
151-
volume = self.initial_sl().vol.get_val(bal)
152-
# stop_trigger
153-
try:
154-
order = self.fx.create_stop_order(
155-
sym=self.symbol(),
156-
side=self.trade_side().name,
157-
stop_price=self.exchange_info.adjust_price(self.current_stop_loss),
158-
price=price,
159-
volume=self.exchange_info.adjust_quanity(volume)
160-
)
161-
except BinanceAPIException as sl_exception:
162-
if sl_exception.message.lower().find('order would trigger immediately') > -1:
163-
order = self.fx.create_makret_order(self.symbol(),
164-
self.trade_side().name,
165-
self.exchange_info.adjust_quanity(volume))
166-
else:
167-
raise
151+
bal = round(bal / price, 8) if self.trade_side().is_buy() else bal
168152

153+
volume = self.exchange_info.adjust_quanity(self.initial_sl().vol.get_val(bal))
154+
# stop_trigger
155+
try:
156+
order = self.fx.create_stop_order(
157+
sym=self.symbol(),
158+
side=self.trade_side().name,
159+
stop_price=self.exchange_info.adjust_price(self.current_stop_loss),
160+
price=price,
161+
volume=volume
162+
)
163+
164+
except BinanceAPIException as sl_exception:
165+
if sl_exception.message.lower().find('order would trigger immediately') > -1:
166+
order = self.fx.create_makret_order(self.symbol(),
167+
self.trade_side().name,
168+
volume)
169+
else:
170+
raise
171+
172+
self.trade.sl_settings.initial_target.calculated_volume = volume
169173
self.trade.sl_settings.initial_target.set_active(order['orderId'])
174+
170175
self.trigger_target_updated()
171176
self.logInfo('Setting stop loss order: {:.08f}:{:.08f}'.format(
172177
self.exchange_info.adjust_price(self.current_stop_loss),

Bot/Target.py

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def set_completed(self, id=None, date=datetime.now()):
4848
def set_canceled(self):
4949
self.status = OrderStatus.NEW
5050
self.id = None
51+
self.calculated_volume = None
5152

5253
def set_active(self, id=None):
5354
self.status = OrderStatus.ACTIVE

0 commit comments

Comments
 (0)