Works with reporting output

Bugs
Calculating % prof ok, but abs wrong

BAT/BTC DF is very broken all OHLC are the same - but exposes a
buy after stop on last row "oddness" to be investigated / handled
This commit is contained in:
creslinux 2018-07-15 10:33:00 +00:00
parent 71c3106f8f
commit 4e68362d46

View File

@ -190,7 +190,7 @@ class Backtesting(object):
return btr return btr
return None return None
@profile
def backtest(self, args: Dict) -> DataFrame: def backtest(self, args: Dict) -> DataFrame:
""" """
Implements backtesting functionality Implements backtesting functionality
@ -309,9 +309,9 @@ class Backtesting(object):
from datetime import datetime from datetime import datetime
### backslap debug wrap ### backslap debug wrap
debug_2loops = True # only loop twice, for faster debug debug_2loops = False # only loop twice, for faster debug
debug_timing = False # print timing for each step debug_timing = False # print timing for each step
debug = True # print values, to check accuracy debug = False # print values, to check accuracy
# Read Stop Loss Values and Stake # Read Stop Loss Values and Stake
stop = self.stop_loss_value stop = self.stop_loss_value
@ -354,8 +354,10 @@ class Backtesting(object):
buy - open - close - sell - high - low - np_stop_pri buy - open - close - sell - high - low - np_stop_pri
""" """
bto = buys_triggered_on = "close" bto = buys_triggered_on = "close"
sto = stops_triggered_on = "low" ## Should be low, FT uses close # sto = stops_triggered_on = "low" ## Should be low, FT uses close
sco = stops_calculated_on = "np_stop_pri" ## should use np_stop_pri, FT uses close # sco = stops_calculated_on = "np_stop_pri" ## should use np_stop_pri, FT uses close
sto = stops_triggered_on = "close" ## Should be low, FT uses close
sco = stops_calculated_on = "close" ## should use np_stop_pri, FT uses close
''' '''
Numpy arrays are used for 100x speed up Numpy arrays are used for 100x speed up
We requires setting Int values for We requires setting Int values for
@ -371,8 +373,10 @@ class Backtesting(object):
np_stop: int = 6 np_stop: int = 6
np_bto: int = np_close # buys_triggered_on - should be close np_bto: int = np_close # buys_triggered_on - should be close
np_bco: int = np_open # buys calculated on - open of the next candle. np_bco: int = np_open # buys calculated on - open of the next candle.
np_sto: int = np_low # stops_triggered_on - Should be low, FT uses close #np_sto: int = np_low # stops_triggered_on - Should be low, FT uses close
np_sco: int = np_stop # stops_calculated_on - Should be stop, FT uses close #np_sco: int = np_stop # stops_calculated_on - Should be stop, FT uses close
np_sto: int = np_close # stops_triggered_on - Should be low, FT uses close
np_sco: int = np_close # stops_calculated_on - Should be stop, FT uses close
# #
### End Config ### End Config
@ -408,7 +412,7 @@ class Backtesting(object):
if debug or debug_timing: if debug or debug_timing:
print("-- T_exit_Ind - Numpy Index is", t_exit_ind, " ----------------------- Loop", loop, pair) print("-- T_exit_Ind - Numpy Index is", t_exit_ind, " ----------------------- Loop", loop, pair)
if debug_2loops: if debug_2loops:
if loop == 2: if loop == 3:
print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Loop debug max met - breaking") print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Loop debug max met - breaking")
break break
''' '''
@ -673,23 +677,25 @@ class Backtesting(object):
# Profit ABS. # Profit ABS.
# sumrecieved((rate * numTokens) * fee) - sumpaid ((rate * numTokens) * fee) # sumrecieved((rate * numTokens) * fee) - sumpaid ((rate * numTokens) * fee)
sumpaid: float = (np_trade_enter_price * stake) * open_fee sumpaid: float = (np_trade_enter_price * stake)
sumrecieved: float = (np_trade_exit_price * stake) * close_fee sumpaid_fee: float = sumpaid * open_fee
profit_abs: float = sumrecieved - sumpaid sumrecieved: float = (np_trade_exit_price * stake)
sumrecieved_fee: float = sumrecieved * close_fee
profit_abs: float = sumrecieved - sumpaid - sumpaid_fee - sumrecieved_fee
# build trade dictionary # build trade dictionary
bslap_result["pair"] = pair bslap_result["pair"] = pair
bslap_result["profit_percent"] = (np_trade_exit_price - np_trade_enter_price) / np_trade_enter_price bslap_result["profit_percent"] = (np_trade_exit_price - np_trade_enter_price) / np_trade_enter_price
bslap_result["profit_abs"] = str.format('{0:.10f}', profit_abs) bslap_result["profit_abs"] = round(profit_abs, 15)
bslap_result["open_time"] = trade_start bslap_result["open_time"] = trade_start
bslap_result["close_time"] = trade_end bslap_result["close_time"] = trade_end
bslap_result["open_index"] = t_open_ind + 1 bslap_result["open_index"] = t_open_ind + 2 # +1 between np and df, +1 as we buy on next.
bslap_result["close_index"] = close_index bslap_result["close_index"] = close_index
bslap_result["trade_duration"] = trade_mins bslap_result["trade_duration"] = trade_mins
bslap_result["open_at_end"] = False bslap_result["open_at_end"] = False
bslap_result["open_rate"] = str.format('{0:.10f}', np_trade_enter_price) bslap_result["open_rate"] = round(np_trade_enter_price, 15)
bslap_result["close_rate"] = str.format('{0:.10f}', np_trade_exit_price) bslap_result["close_rate"] = round(np_trade_exit_price, 15)
bslap_result["exit_type"] = t_exit_type #bslap_result["exit_type"] = t_exit_type
# Add trade dictionary to list # Add trade dictionary to list
bslap_pair_results.append(bslap_result) bslap_pair_results.append(bslap_result)
if debug: if debug:
@ -704,7 +710,7 @@ class Backtesting(object):
if debug_timing: if debug_timing:
t_t = f(st) t_t = f(st)
print("8", str.format('{0:.17f}', t_t)) print("8+trade", str.format('{0:.17f}', t_t))
# Send back List of trade dicts # Send back List of trade dicts
return bslap_pair_results return bslap_pair_results
@ -785,16 +791,17 @@ class Backtesting(object):
) )
) )
logger.info( ## TODO. Catch open trades for this report.
'\n=============================================== ' # logger.info(
'LEFT OPEN TRADES REPORT' # '\n=============================================== '
' ===============================================\n' # 'LEFT OPEN TRADES REPORT'
'%s', # ' ===============================================\n'
self._generate_text_table( # '%s',
data, # self._generate_text_table(
results.loc[results.open_at_end] # data,
) # results.loc[results.open_at_end]
) # )
# )
def setup_configuration(args: Namespace) -> Dict[str, Any]: def setup_configuration(args: Namespace) -> Dict[str, Any]: