use sell_row.open also when the active ROI value just changed
This commit is contained in:
parent
45d12dbc83
commit
de33ec4250
@ -273,19 +273,26 @@ class Backtesting:
|
|||||||
roi_entry, roi = self.strategy.min_roi_reached_entry(trade_dur)
|
roi_entry, roi = self.strategy.min_roi_reached_entry(trade_dur)
|
||||||
if roi is not None:
|
if roi is not None:
|
||||||
if roi == -1 and roi_entry % self.timeframe_mins == 0:
|
if roi == -1 and roi_entry % self.timeframe_mins == 0:
|
||||||
# When forceselling with ROI=-1, the roi-entry will always be "on the entry".
|
# When forceselling with ROI=-1, the roi time will always be equal to trade_dur.
|
||||||
# If that entry is a multiple of the timeframe (so on open)
|
# If that entry is a multiple of the timeframe (so on candle open)
|
||||||
# - we'll use open instead of close
|
# - we'll use open instead of close
|
||||||
return sell_row.open
|
return sell_row.open
|
||||||
|
|
||||||
# - (Expected abs profit + open_rate + open_fee) / (fee_close -1)
|
# - (Expected abs profit + open_rate + open_fee) / (fee_close -1)
|
||||||
closerate = - (trade.open_rate * roi + trade.open_rate *
|
close_rate = - (trade.open_rate * roi + trade.open_rate *
|
||||||
(1 + trade.fee_open)) / (trade.fee_close - 1)
|
(1 + trade.fee_open)) / (trade.fee_close - 1)
|
||||||
|
|
||||||
# Use the maximum between closerate and low as we
|
if (trade_dur > 0 and trade_dur == roi_entry
|
||||||
|
and roi_entry % self.timeframe_mins == 0
|
||||||
|
and sell_row.open > close_rate):
|
||||||
|
# new ROI entry came into effect.
|
||||||
|
# use Open rate if open_rate > calculated sell rate
|
||||||
|
return sell_row.open
|
||||||
|
|
||||||
|
# Use the maximum between close_rate and low as we
|
||||||
# cannot sell outside of a candle.
|
# cannot sell outside of a candle.
|
||||||
# Applies when a new ROI setting comes in place and the whole candle is above that.
|
# Applies when a new ROI setting comes in place and the whole candle is above that.
|
||||||
return max(closerate, sell_row.low)
|
return max(close_rate, sell_row.low)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# This should not be reached...
|
# This should not be reached...
|
||||||
|
@ -281,6 +281,53 @@ tc17 = BTContainer(data=[
|
|||||||
trades=[BTrade(sell_reason=SellType.ROI, open_tick=1, close_tick=3)]
|
trades=[BTrade(sell_reason=SellType.ROI, open_tick=1, close_tick=3)]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Test 18: Buy, hold for 120 mins, then drop ROI to 1%, causing a sell in candle 3.
|
||||||
|
# stop-loss: 10%, ROI: 10% (should not apply), -100% after 100 minutes (limits trade duration)
|
||||||
|
# uses open_rate as sell-price
|
||||||
|
tc18 = BTContainer(data=[
|
||||||
|
# D O H L C V B S
|
||||||
|
[0, 5000, 5025, 4975, 4987, 6172, 1, 0],
|
||||||
|
[1, 5000, 5025, 4975, 4987, 6172, 0, 0],
|
||||||
|
[2, 4987, 5300, 4950, 5200, 6172, 0, 0],
|
||||||
|
[3, 5200, 5220, 4940, 4962, 6172, 0, 0], # Sell on ROI (sells on open)
|
||||||
|
[4, 4962, 4987, 4972, 4950, 6172, 0, 0],
|
||||||
|
[5, 4950, 4975, 4925, 4950, 6172, 0, 0]],
|
||||||
|
stop_loss=-0.10, roi={"0": 0.10, "120": 0.01}, profit_perc=0.04,
|
||||||
|
trades=[BTrade(sell_reason=SellType.ROI, open_tick=1, close_tick=3)]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test 19: Buy, hold for 119 mins, then drop ROI to 1%, causing a sell in candle 3.
|
||||||
|
# stop-loss: 10%, ROI: 10% (should not apply), -100% after 100 minutes (limits trade duration)
|
||||||
|
# uses calculated ROI (1%) as sell rate, otherwise identical to tc18
|
||||||
|
tc19 = BTContainer(data=[
|
||||||
|
# D O H L C V B S
|
||||||
|
[0, 5000, 5025, 4975, 4987, 6172, 1, 0],
|
||||||
|
[1, 5000, 5025, 4975, 4987, 6172, 0, 0],
|
||||||
|
[2, 4987, 5300, 4950, 5200, 6172, 0, 0],
|
||||||
|
[3, 5000, 5300, 4940, 4962, 6172, 0, 0], # Sell on ROI
|
||||||
|
[4, 4962, 4987, 4972, 4950, 6172, 0, 0],
|
||||||
|
[5, 4550, 4975, 4925, 4950, 6172, 0, 0]],
|
||||||
|
stop_loss=-0.10, roi={"0": 0.10, "120": 0.01}, profit_perc=0.01,
|
||||||
|
trades=[BTrade(sell_reason=SellType.ROI, open_tick=1, close_tick=3)]
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test 20: Buy, hold for 119 mins, then drop ROI to 1%, causing a sell in candle 3.
|
||||||
|
# stop-loss: 10%, ROI: 10% (should not apply), -100% after 100 minutes (limits trade duration)
|
||||||
|
# uses calculated ROI (1%) as sell rate, otherwise identical to tc18
|
||||||
|
tc20 = BTContainer(data=[
|
||||||
|
# D O H L C V B S
|
||||||
|
[0, 5000, 5025, 4975, 4987, 6172, 1, 0],
|
||||||
|
[1, 5000, 5025, 4975, 4987, 6172, 0, 0],
|
||||||
|
[2, 4987, 5300, 4950, 5200, 6172, 0, 0],
|
||||||
|
[3, 5200, 5300, 4940, 4962, 6172, 0, 0], # Sell on ROI
|
||||||
|
[4, 4962, 4987, 4972, 4950, 6172, 0, 0],
|
||||||
|
[5, 4550, 4975, 4925, 4950, 6172, 0, 0]],
|
||||||
|
stop_loss=-0.10, roi={"0": 0.10, "119": 0.01}, profit_perc=0.01,
|
||||||
|
trades=[BTrade(sell_reason=SellType.ROI, open_tick=1, close_tick=3)]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
TESTS = [
|
TESTS = [
|
||||||
tc0,
|
tc0,
|
||||||
tc1,
|
tc1,
|
||||||
@ -300,6 +347,9 @@ TESTS = [
|
|||||||
tc15,
|
tc15,
|
||||||
tc16,
|
tc16,
|
||||||
tc17,
|
tc17,
|
||||||
|
tc18,
|
||||||
|
tc19,
|
||||||
|
tc20,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user