Added ABS and Fees
Fixed Index Alignment that was off moving from scratch to FT Fixed Stoploss, its a negative in FT, had been using positve stop -1 in scratch
This commit is contained in:
parent
07175ebc5a
commit
71c3106f8f
@ -214,22 +214,28 @@ class Backtesting(object):
|
|||||||
trade_count_lock: Dict = {}
|
trade_count_lock: Dict = {}
|
||||||
########################### Call out BSlap instead of using FT
|
########################### Call out BSlap instead of using FT
|
||||||
bslap_results: list = []
|
bslap_results: list = []
|
||||||
last_bslap_resultslist = []
|
last_bslap_results: list = []
|
||||||
|
|
||||||
for pair, pair_data in processed.items():
|
for pair, pair_data in processed.items():
|
||||||
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()
|
||||||
ticker_data.loc[:, 'buy'] = ticker_data['buy'].shift(1)
|
|
||||||
ticker_data.loc[:, 'sell'] = ticker_data['sell'].shift(1)
|
|
||||||
|
|
||||||
|
ticker_data.drop(ticker_data.head(1).index, inplace=True)
|
||||||
|
|
||||||
|
# #dump same DFs to disk for offline testing in scratch
|
||||||
|
# f_pair:str = pair
|
||||||
|
# csv = f_pair.replace("/", "_")
|
||||||
|
# csv="/Users/creslin/PycharmProjects/freqtrade_new/frames/" + csv
|
||||||
|
# ticker_data.to_csv(csv, sep='\t', encoding='utf-8')
|
||||||
|
|
||||||
|
#call bslap - results are a list of dicts
|
||||||
bslap_pair_results = self.backslap_pair(ticker_data, pair)
|
bslap_pair_results = self.backslap_pair(ticker_data, pair)
|
||||||
|
|
||||||
last_bslap_results = bslap_results
|
last_bslap_results = bslap_results
|
||||||
bslap_results = last_bslap_results + bslap_pair_results
|
bslap_results = last_bslap_results + bslap_pair_results
|
||||||
#bslap_results_df = DataFrame(bslap_results)
|
|
||||||
|
|
||||||
res = DataFrame.from_records(bslap_results, columns=BacktestResult._fields)
|
bslap_results_df = DataFrame(bslap_results, columns=BacktestResult._fields)
|
||||||
print(res)
|
return bslap_results_df
|
||||||
return res
|
|
||||||
########################### Original BT loop
|
########################### Original BT loop
|
||||||
# for pair, pair_data in processed.items():
|
# for pair, pair_data in processed.items():
|
||||||
# pair_data['buy'], pair_data['sell'] = 0, 0 # cleanup from previous run
|
# pair_data['buy'], pair_data['sell'] = 0, 0 # cleanup from previous run
|
||||||
@ -302,13 +308,28 @@ class Backtesting(object):
|
|||||||
import utils_find_1st as utf1st
|
import utils_find_1st as utf1st
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
stop = self.stop_loss_value
|
|
||||||
p_stop = (-stop + 1) # What stop really means, e.g 0.01 is 0.99 of price
|
|
||||||
|
|
||||||
### backslap debug wrap
|
### backslap debug wrap
|
||||||
debug_2loops = True # only loop twice, for faster debug
|
debug_2loops = True # 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 = True # print values, to check accuracy
|
||||||
|
|
||||||
|
# Read Stop Loss Values and Stake
|
||||||
|
stop = self.stop_loss_value
|
||||||
|
p_stop = (stop + 1) # What stop really means, e.g 0.01 is 0.99 of price
|
||||||
|
stake = self.config.get('stake_amount')
|
||||||
|
|
||||||
|
# Set fees
|
||||||
|
# TODO grab these from the environment, do not hard set
|
||||||
|
# Fees
|
||||||
|
open_fee = 0.05
|
||||||
|
close_fee = 0.05
|
||||||
|
|
||||||
|
if debug:
|
||||||
|
print("Stop is ", stop, "value from stragey file")
|
||||||
|
print("p_stop is", p_stop, "value used to multiply to entry price")
|
||||||
|
print("Stake is,", stake, "the sum of currency to spend per trade")
|
||||||
|
print("The open fee is", open_fee, "The close fee is", close_fee)
|
||||||
|
|
||||||
if debug:
|
if debug:
|
||||||
from pandas import set_option
|
from pandas import set_option
|
||||||
set_option('display.max_rows', 5000)
|
set_option('display.max_rows', 5000)
|
||||||
@ -385,9 +406,10 @@ class Backtesting(object):
|
|||||||
while t_exit_ind < np_buy_arr_len:
|
while t_exit_ind < np_buy_arr_len:
|
||||||
loop = loop + 1
|
loop = loop + 1
|
||||||
if debug or debug_timing:
|
if debug or debug_timing:
|
||||||
print("----------------------------------------------------------- Loop", loop, pair)
|
print("-- T_exit_Ind - Numpy Index is", t_exit_ind, " ----------------------- Loop", loop, pair)
|
||||||
if debug_2loops:
|
if debug_2loops:
|
||||||
if loop == 4:
|
if loop == 2:
|
||||||
|
print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Loop debug max met - breaking")
|
||||||
break
|
break
|
||||||
'''
|
'''
|
||||||
Dev phases
|
Dev phases
|
||||||
@ -541,10 +563,10 @@ class Backtesting(object):
|
|||||||
print("=================== STOP ", pair)
|
print("=================== STOP ", pair)
|
||||||
print("Numpy Array STOP Index is:", np_t_stop_ind)
|
print("Numpy Array STOP Index is:", np_t_stop_ind)
|
||||||
print("DataFrame STOP Index is:", np_t_stop_ind + 1, "displaying DF \n")
|
print("DataFrame STOP Index is:", np_t_stop_ind + 1, "displaying DF \n")
|
||||||
print("First Stop Index after Trade open in candle", np_t_stop_ind + 1, ": \n",
|
print("First Stop after Trade open in candle", t_open_ind + 1, "is ", np_t_stop_ind + 1,": \n",
|
||||||
str.format('{0:.17f}', bslap.iloc[np_t_stop_ind][sto]),
|
str.format('{0:.17f}', bslap.iloc[np_t_stop_ind][sto]),
|
||||||
"is less than", str.format('{0:.17f}', np_t_stop_pri))
|
"is less than", str.format('{0:.17f}', np_t_stop_pri))
|
||||||
print("Tokens will be sold at rate:", str.format('{0:.17f}', bslap.iloc[np_t_stop_ind][sco]))
|
print("If stop is first exit match sell rate is :", str.format('{0:.17f}', bslap.iloc[np_t_stop_ind][sco]))
|
||||||
print("HINT, STOPs should close in-candle, i.e", np_t_stop_ind + 1,
|
print("HINT, STOPs should close in-candle, i.e", np_t_stop_ind + 1,
|
||||||
": As live STOPs are not linked to O-C times")
|
": As live STOPs are not linked to O-C times")
|
||||||
|
|
||||||
@ -610,7 +632,7 @@ class Backtesting(object):
|
|||||||
|
|
||||||
# Loop control - catch no closed trades.
|
# Loop control - catch no closed trades.
|
||||||
if debug:
|
if debug:
|
||||||
print("---------------------------------------- end of loop", loop - 1,
|
print("---------------------------------------- end of loop", loop,
|
||||||
" Dataframe Exit Index is: ", t_exit_ind)
|
" Dataframe Exit Index is: ", t_exit_ind)
|
||||||
print("Exit Index Last, Exit Index Now Are: ", t_exit_last, t_exit_ind)
|
print("Exit Index Last, Exit Index Now Are: ", t_exit_last, t_exit_ind)
|
||||||
|
|
||||||
@ -641,23 +663,26 @@ class Backtesting(object):
|
|||||||
close_index: int = t_exit_ind + 2
|
close_index: int = t_exit_ind + 2
|
||||||
else:
|
else:
|
||||||
close_index: int = t_exit_ind + 1
|
close_index: int = t_exit_ind + 1
|
||||||
# Munge the date / delta
|
|
||||||
start_date = bslap.iloc[t_open_ind + 1]['date']
|
|
||||||
end_date = bslap.iloc[close_index]['date']
|
|
||||||
|
|
||||||
|
# Munge the date / delta (bt already date formats...just subract)
|
||||||
|
trade_start = bslap.iloc[t_open_ind + 1]['date']
|
||||||
|
trade_end = bslap.iloc[close_index]['date']
|
||||||
# def __datetime(date_str):
|
# def __datetime(date_str):
|
||||||
# return datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S+00:00')
|
# return datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S+00:00')
|
||||||
|
|
||||||
trade_start = start_date
|
|
||||||
trade_end = end_date
|
|
||||||
trade_mins = (trade_end - trade_start).total_seconds() / 60
|
trade_mins = (trade_end - trade_start).total_seconds() / 60
|
||||||
|
|
||||||
|
# Profit ABS.
|
||||||
|
# sumrecieved((rate * numTokens) * fee) - sumpaid ((rate * numTokens) * fee)
|
||||||
|
sumpaid: float = (np_trade_enter_price * stake) * open_fee
|
||||||
|
sumrecieved: float = (np_trade_exit_price * stake) * close_fee
|
||||||
|
profit_abs: float = sumrecieved - sumpaid
|
||||||
|
|
||||||
# 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"] = ""
|
bslap_result["profit_abs"] = str.format('{0:.10f}', profit_abs)
|
||||||
bslap_result["open_time"] = start_date
|
bslap_result["open_time"] = trade_start
|
||||||
bslap_result["close_time"] = end_date
|
bslap_result["close_time"] = trade_end
|
||||||
bslap_result["open_index"] = t_open_ind + 1
|
bslap_result["open_index"] = t_open_ind + 1
|
||||||
bslap_result["close_index"] = close_index
|
bslap_result["close_index"] = close_index
|
||||||
bslap_result["trade_duration"] = trade_mins
|
bslap_result["trade_duration"] = trade_mins
|
||||||
|
Loading…
Reference in New Issue
Block a user