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:
creslinux 2018-07-15 09:30:01 +00:00
parent 07175ebc5a
commit 71c3106f8f

View File

@ -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