Backslap bug on “stop loss triggered” indexes resolved
This commit is contained in:
parent
88854cba2d
commit
decaf6c42e
@ -136,7 +136,7 @@ class Backslapping:
|
|||||||
|
|
||||||
bslap_results_df = []
|
bslap_results_df = []
|
||||||
bslap_results_df = DataFrame.from_records(bslap_results_df, columns=BacktestResult._fields)
|
bslap_results_df = DataFrame.from_records(bslap_results_df, columns=BacktestResult._fields)
|
||||||
|
|
||||||
return bslap_results_df
|
return bslap_results_df
|
||||||
|
|
||||||
def vector_fill_results_table(self, bslap_results_df: DataFrame, pair: str):
|
def vector_fill_results_table(self, bslap_results_df: DataFrame, pair: str):
|
||||||
@ -280,10 +280,19 @@ class Backslapping:
|
|||||||
# debug = False # print values, to check accuracy
|
# debug = False # print values, to check accuracy
|
||||||
debug_2loops = self.debug_2loops # only loop twice, for faster debug
|
debug_2loops = self.debug_2loops # only loop twice, for faster debug
|
||||||
debug_timing = self.debug_timing # print timing for each step
|
debug_timing = self.debug_timing # print timing for each step
|
||||||
debug = self.debug # print values, to check accuracy
|
#debug = self.debug # print values, to check accuracy
|
||||||
|
debug = False
|
||||||
|
|
||||||
|
ticker_data = ticker_data.sort_values(by=['date'])
|
||||||
|
ticker_data = ticker_data.reset_index(drop=True)
|
||||||
|
|
||||||
|
#pandas_df = df.toPandas()
|
||||||
|
#pandas_df.to_json
|
||||||
|
|
||||||
# Read Stop Loss Values and Stake
|
# Read Stop Loss Values and Stake
|
||||||
|
# pdb.set_trace()
|
||||||
stop = self.stop_loss_value
|
stop = self.stop_loss_value
|
||||||
|
#stop = stoploss
|
||||||
p_stop = (stop + 1) # What stop really means, e.g 0.01 is 0.99 of price
|
p_stop = (stop + 1) # What stop really means, e.g 0.01 is 0.99 of price
|
||||||
|
|
||||||
if debug:
|
if debug:
|
||||||
@ -583,7 +592,7 @@ class Backslapping:
|
|||||||
elif np_t_sell_ind < 99999999 and np_t_sell_ind < np_t_stop_ind:
|
elif np_t_sell_ind < 99999999 and np_t_sell_ind < np_t_stop_ind:
|
||||||
# move sell onto next candle, we only look back on sell
|
# move sell onto next candle, we only look back on sell
|
||||||
# will use the open price later.
|
# will use the open price later.
|
||||||
t_exit_ind = t_open_ind + np_t_sell_ind + 1 # Set Exit row index
|
t_exit_ind = t_open_ind + np_t_sell_ind # Set Exit row index
|
||||||
t_exit_type = SellType.SELL_SIGNAL # Set Exit type (sell)
|
t_exit_type = SellType.SELL_SIGNAL # Set Exit type (sell)
|
||||||
np_t_exit_pri = np_open # The price field our SELL exit will use
|
np_t_exit_pri = np_open # The price field our SELL exit will use
|
||||||
if debug:
|
if debug:
|
||||||
@ -693,6 +702,7 @@ class Backslapping:
|
|||||||
if t_exit_type == SellType.STOP_LOSS:
|
if t_exit_type == SellType.STOP_LOSS:
|
||||||
if np_t_exit_pri == 6:
|
if np_t_exit_pri == 6:
|
||||||
np_trade_exit_price = np_t_stop_pri
|
np_trade_exit_price = np_t_stop_pri
|
||||||
|
t_exit_ind = t_exit_ind + 1
|
||||||
else:
|
else:
|
||||||
np_trade_exit_price = np_bslap[t_exit_ind, np_t_exit_pri]
|
np_trade_exit_price = np_bslap[t_exit_ind, np_t_exit_pri]
|
||||||
if t_exit_type == SellType.SELL_SIGNAL:
|
if t_exit_type == SellType.SELL_SIGNAL:
|
||||||
@ -736,6 +746,7 @@ class Backslapping:
|
|||||||
opportunity to close any more trades.
|
opportunity to close any more trades.
|
||||||
"""
|
"""
|
||||||
# TODO :add handing here to record none closed open trades
|
# TODO :add handing here to record none closed open trades
|
||||||
|
|
||||||
|
|
||||||
if debug:
|
if debug:
|
||||||
print(bslap_pair_results)
|
print(bslap_pair_results)
|
||||||
@ -745,6 +756,12 @@ class Backslapping:
|
|||||||
Add trade to backtest looking results list of dicts
|
Add trade to backtest looking results list of dicts
|
||||||
Loop back to look for more trades.
|
Loop back to look for more trades.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# We added +1 to t_exit_ind if the exit was a stop-loss, to not exit early in the IF of this ELSE
|
||||||
|
# removing the +1 here so prices match.
|
||||||
|
if t_exit_type == SellType.STOP_LOSS:
|
||||||
|
t_exit_ind = t_exit_ind - 1
|
||||||
|
|
||||||
# Build trade dictionary
|
# Build trade dictionary
|
||||||
## In general if a field can be calculated later from other fields leave blank here
|
## In general if a field can be calculated later from other fields leave blank here
|
||||||
## Its X(number of trades faster) to calc all in a single vector than 1 trade at a time
|
## Its X(number of trades faster) to calc all in a single vector than 1 trade at a time
|
||||||
@ -753,6 +770,7 @@ class Backslapping:
|
|||||||
close_index: int = t_exit_ind
|
close_index: int = t_exit_ind
|
||||||
bslap_result = {} # Must have at start or we end up with a list of multiple same last result
|
bslap_result = {} # Must have at start or we end up with a list of multiple same last result
|
||||||
bslap_result["pair"] = pair
|
bslap_result["pair"] = pair
|
||||||
|
bslap_result["stoploss"] = stop
|
||||||
bslap_result["profit_percent"] = "" # To be 1 vector calc across trades when loop complete
|
bslap_result["profit_percent"] = "" # To be 1 vector calc across trades when loop complete
|
||||||
bslap_result["profit_abs"] = "" # To be 1 vector calc across trades when loop complete
|
bslap_result["profit_abs"] = "" # To be 1 vector calc across trades when loop complete
|
||||||
bslap_result["open_time"] = np_bslap_dates[t_open_ind + 1] # use numpy array, pandas 20x slower
|
bslap_result["open_time"] = np_bslap_dates[t_open_ind + 1] # use numpy array, pandas 20x slower
|
||||||
|
@ -133,6 +133,10 @@ class Edge:
|
|||||||
if self.debug_timing: # Start timer
|
if self.debug_timing: # Start timer
|
||||||
fl = self.s()
|
fl = self.s()
|
||||||
|
|
||||||
|
# Sorting dataframe by date and reset index
|
||||||
|
pair_data = pair_data.sort_values(by=['date'])
|
||||||
|
pair_data = pair_data.reset_index(drop=True)
|
||||||
|
|
||||||
ticker_data = self.populate_sell_trend(
|
ticker_data = self.populate_sell_trend(
|
||||||
self.populate_buy_trend(pair_data))[headers].copy()
|
self.populate_buy_trend(pair_data))[headers].copy()
|
||||||
|
|
||||||
@ -151,11 +155,6 @@ class Edge:
|
|||||||
for stoploss in stoploss_range:
|
for stoploss in stoploss_range:
|
||||||
bslap_results += self.backslap_pair(ticker_data, pair, round(stoploss, 3))
|
bslap_results += self.backslap_pair(ticker_data, pair, round(stoploss, 3))
|
||||||
|
|
||||||
#bslap_results += self.backslap_pair(ticker_data, pair, -0.05)
|
|
||||||
# bslap_pair_results = self.backslap_pair(ticker_data, pair, -0.05)
|
|
||||||
# last_bslap_results = bslap_results
|
|
||||||
# bslap_results = last_bslap_results + bslap_pair_results
|
|
||||||
|
|
||||||
|
|
||||||
if self.debug_timing: # print time taken
|
if self.debug_timing: # print time taken
|
||||||
tt = self.f(st)
|
tt = self.f(st)
|
||||||
@ -627,7 +626,7 @@ class Edge:
|
|||||||
elif np_t_sell_ind < 99999999 and np_t_sell_ind < np_t_stop_ind:
|
elif np_t_sell_ind < 99999999 and np_t_sell_ind < np_t_stop_ind:
|
||||||
# move sell onto next candle, we only look back on sell
|
# move sell onto next candle, we only look back on sell
|
||||||
# will use the open price later.
|
# will use the open price later.
|
||||||
t_exit_ind = t_open_ind + np_t_sell_ind # Set Exit row index
|
t_exit_ind = t_open_ind + np_t_sell_ind # Set Exit row index
|
||||||
t_exit_type = SellType.SELL_SIGNAL # Set Exit type (sell)
|
t_exit_type = SellType.SELL_SIGNAL # Set Exit type (sell)
|
||||||
np_t_exit_pri = np_open # The price field our SELL exit will use
|
np_t_exit_pri = np_open # The price field our SELL exit will use
|
||||||
if debug:
|
if debug:
|
||||||
@ -737,6 +736,7 @@ class Edge:
|
|||||||
if t_exit_type == SellType.STOP_LOSS:
|
if t_exit_type == SellType.STOP_LOSS:
|
||||||
if np_t_exit_pri == 6:
|
if np_t_exit_pri == 6:
|
||||||
np_trade_exit_price = np_t_stop_pri
|
np_trade_exit_price = np_t_stop_pri
|
||||||
|
t_exit_ind = t_exit_ind + 1
|
||||||
else:
|
else:
|
||||||
np_trade_exit_price = np_bslap[t_exit_ind, np_t_exit_pri]
|
np_trade_exit_price = np_bslap[t_exit_ind, np_t_exit_pri]
|
||||||
if t_exit_type == SellType.SELL_SIGNAL:
|
if t_exit_type == SellType.SELL_SIGNAL:
|
||||||
@ -780,7 +780,7 @@ class Edge:
|
|||||||
opportunity to close any more trades.
|
opportunity to close any more trades.
|
||||||
"""
|
"""
|
||||||
# TODO :add handing here to record none closed open trades
|
# TODO :add handing here to record none closed open trades
|
||||||
|
|
||||||
if debug:
|
if debug:
|
||||||
print(bslap_pair_results)
|
print(bslap_pair_results)
|
||||||
break
|
break
|
||||||
@ -789,6 +789,12 @@ class Edge:
|
|||||||
Add trade to backtest looking results list of dicts
|
Add trade to backtest looking results list of dicts
|
||||||
Loop back to look for more trades.
|
Loop back to look for more trades.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# We added +1 to t_exit_ind if the exit was a stop-loss, to not exit early in the IF of this ELSE
|
||||||
|
# removing the +1 here so prices match.
|
||||||
|
if t_exit_type == SellType.STOP_LOSS:
|
||||||
|
t_exit_ind = t_exit_ind - 1
|
||||||
|
|
||||||
# Build trade dictionary
|
# Build trade dictionary
|
||||||
## In general if a field can be calculated later from other fields leave blank here
|
## In general if a field can be calculated later from other fields leave blank here
|
||||||
## Its X(number of trades faster) to calc all in a single vector than 1 trade at a time
|
## Its X(number of trades faster) to calc all in a single vector than 1 trade at a time
|
||||||
@ -1014,6 +1020,5 @@ args = arguments.get_parsed_arg()
|
|||||||
|
|
||||||
config = setup_configuration(args)
|
config = setup_configuration(args)
|
||||||
|
|
||||||
config["strategy"] = "MultiRSI"
|
|
||||||
edge = Edge(config)
|
edge = Edge(config)
|
||||||
edge.start()
|
edge.start()
|
||||||
|
Loading…
Reference in New Issue
Block a user