Edge test expectancy function (round 1)
This commit is contained in:
parent
6f79b55845
commit
b57d9edda8
@ -1,6 +1,8 @@
|
|||||||
from freqtrade.tests.conftest import get_patched_exchange
|
from freqtrade.tests.conftest import get_patched_exchange
|
||||||
from freqtrade.edge import Edge
|
from freqtrade.edge import Edge
|
||||||
from pandas import DataFrame
|
from pandas import DataFrame, to_datetime
|
||||||
|
import arrow
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
|
||||||
# Cases to be tested:
|
# Cases to be tested:
|
||||||
@ -20,6 +22,10 @@ from pandas import DataFrame
|
|||||||
# 8) Stoploss and sell are hit. should sell on stoploss
|
# 8) Stoploss and sell are hit. should sell on stoploss
|
||||||
####################################################################
|
####################################################################
|
||||||
|
|
||||||
|
ticker_start_time = arrow.get(2018, 10, 3)
|
||||||
|
ticker_interval_in_minute = 5
|
||||||
|
|
||||||
|
|
||||||
def test_filter(mocker, default_conf):
|
def test_filter(mocker, default_conf):
|
||||||
exchange = get_patched_exchange(mocker, default_conf)
|
exchange = get_patched_exchange(mocker, default_conf)
|
||||||
edge = Edge(default_conf, exchange)
|
edge = Edge(default_conf, exchange)
|
||||||
@ -45,11 +51,11 @@ def _validate_ohlc(buy_ohlc_sell_matrice):
|
|||||||
|
|
||||||
def _build_dataframe(buy_ohlc_sell_matrice):
|
def _build_dataframe(buy_ohlc_sell_matrice):
|
||||||
_validate_ohlc(buy_ohlc_sell_matrice)
|
_validate_ohlc(buy_ohlc_sell_matrice)
|
||||||
|
|
||||||
tickers = []
|
tickers = []
|
||||||
for ohlc in buy_ohlc_sell_matrice:
|
for ohlc in buy_ohlc_sell_matrice:
|
||||||
ticker = {
|
ticker = {
|
||||||
'date': ohlc[0],
|
# ticker every 5 min
|
||||||
|
'date': ticker_start_time.shift(minutes=(ohlc[0] * 5)).timestamp * 1000,
|
||||||
'buy': ohlc[1],
|
'buy': ohlc[1],
|
||||||
'open': ohlc[2],
|
'open': ohlc[2],
|
||||||
'high': ohlc[3],
|
'high': ohlc[3],
|
||||||
@ -58,7 +64,71 @@ def _build_dataframe(buy_ohlc_sell_matrice):
|
|||||||
'sell': ohlc[6]
|
'sell': ohlc[6]
|
||||||
}
|
}
|
||||||
tickers.append(ticker)
|
tickers.append(ticker)
|
||||||
return DataFrame(tickers)
|
|
||||||
|
frame = DataFrame(tickers)
|
||||||
|
frame['date'] = to_datetime(frame['date'],
|
||||||
|
unit='ms',
|
||||||
|
utc=True,
|
||||||
|
infer_datetime_format=True)
|
||||||
|
|
||||||
|
return frame
|
||||||
|
|
||||||
|
|
||||||
|
def test_process_expectancy(mocker, default_conf):
|
||||||
|
default_conf['edge']['min_trade_number'] = 2
|
||||||
|
exchange = get_patched_exchange(mocker, default_conf)
|
||||||
|
|
||||||
|
def get_fee():
|
||||||
|
return 0.001
|
||||||
|
|
||||||
|
exchange.get_fee = get_fee
|
||||||
|
edge = Edge(default_conf, exchange)
|
||||||
|
|
||||||
|
trades = [
|
||||||
|
{'pair': 'TEST/BTC',
|
||||||
|
'stoploss': -0.9,
|
||||||
|
'profit_percent': '',
|
||||||
|
'profit_abs': '',
|
||||||
|
'open_time': np.datetime64('2018-10-03T00:05:00.000000000'),
|
||||||
|
'close_time': np.datetime64('2018-10-03T00:10:00.000000000'),
|
||||||
|
'open_index': 1,
|
||||||
|
'close_index': 1,
|
||||||
|
'trade_duration': '',
|
||||||
|
'open_rate': 17,
|
||||||
|
'close_rate': 17,
|
||||||
|
'exit_type': 'sell_signal'}, # sdfsdf
|
||||||
|
|
||||||
|
{'pair': 'TEST/BTC',
|
||||||
|
'stoploss': -0.9,
|
||||||
|
'profit_percent': '',
|
||||||
|
'profit_abs': '',
|
||||||
|
'open_time': np.datetime64('2018-10-03T00:20:00.000000000'),
|
||||||
|
'close_time': np.datetime64('2018-10-03T00:25:00.000000000'),
|
||||||
|
'open_index': 4,
|
||||||
|
'close_index': 4,
|
||||||
|
'trade_duration': '',
|
||||||
|
'open_rate': 20,
|
||||||
|
'close_rate': 20,
|
||||||
|
'exit_type': 'sell_signal'},
|
||||||
|
|
||||||
|
{'pair': 'TEST/BTC',
|
||||||
|
'stoploss': -0.9,
|
||||||
|
'profit_percent': '',
|
||||||
|
'profit_abs': '',
|
||||||
|
'open_time': np.datetime64('2018-10-03T00:30:00.000000000'),
|
||||||
|
'close_time': np.datetime64('2018-10-03T00:40:00.000000000'),
|
||||||
|
'open_index': 6,
|
||||||
|
'close_index': 7,
|
||||||
|
'trade_duration': '',
|
||||||
|
'open_rate': 26,
|
||||||
|
'close_rate': 34,
|
||||||
|
'exit_type': 'sell_signal'}
|
||||||
|
]
|
||||||
|
|
||||||
|
trades_df = DataFrame(trades)
|
||||||
|
trades_df = edge._fill_calculable_fields(trades_df)
|
||||||
|
final = edge._process_expectancy(trades_df)
|
||||||
|
assert len(final) == 1
|
||||||
|
|
||||||
|
|
||||||
def test_three_complete_trades(mocker, default_conf):
|
def test_three_complete_trades(mocker, default_conf):
|
||||||
@ -80,17 +150,32 @@ def test_three_complete_trades(mocker, default_conf):
|
|||||||
ticker_df = _build_dataframe(three_sell_points_hit)
|
ticker_df = _build_dataframe(three_sell_points_hit)
|
||||||
trades = edge._find_trades_for_stoploss_range(ticker_df, 'TEST/BTC', [stoploss])
|
trades = edge._find_trades_for_stoploss_range(ticker_df, 'TEST/BTC', [stoploss])
|
||||||
|
|
||||||
# Three trades must have happened
|
# Three trades must have occured
|
||||||
assert len(trades) == 3
|
assert len(trades) == 3
|
||||||
|
|
||||||
# First trade check
|
# First trade check
|
||||||
assert trades[0]['open_time'] == 1
|
# open time should be on line 1
|
||||||
assert trades[0]['close_time'] == 2
|
assert trades[0]['open_time'] == np.datetime64(ticker_start_time.shift(
|
||||||
|
minutes=(1 * ticker_interval_in_minute)).timestamp * 1000, 'ms')
|
||||||
|
|
||||||
|
# close time should be on line 2
|
||||||
|
assert trades[0]['close_time'] == np.datetime64(ticker_start_time.shift(
|
||||||
|
minutes=(2 * ticker_interval_in_minute)).timestamp * 1000, 'ms')
|
||||||
|
|
||||||
# Second trade check
|
# Second trade check
|
||||||
assert trades[1]['open_time'] == 4
|
# open time should be on line 4
|
||||||
assert trades[1]['close_time'] == 5
|
assert trades[1]['open_time'] == np.datetime64(ticker_start_time.shift(
|
||||||
|
minutes=(4 * ticker_interval_in_minute)).timestamp * 1000, 'ms')
|
||||||
|
|
||||||
|
# close time should be on line 5
|
||||||
|
assert trades[1]['close_time'] == np.datetime64(ticker_start_time.shift(
|
||||||
|
minutes=(5 * ticker_interval_in_minute)).timestamp * 1000, 'ms')
|
||||||
|
|
||||||
# Third trade check
|
# Third trade check
|
||||||
assert trades[2]['open_time'] == 6
|
# open time should be on line 6
|
||||||
assert trades[2]['close_time'] == 7
|
assert trades[2]['open_time'] == np.datetime64(ticker_start_time.shift(
|
||||||
|
minutes=(6 * ticker_interval_in_minute)).timestamp * 1000, 'ms')
|
||||||
|
|
||||||
|
# close time should be on line 7
|
||||||
|
assert trades[2]['close_time'] == np.datetime64(ticker_start_time.shift(
|
||||||
|
minutes=(7 * ticker_interval_in_minute)).timestamp * 1000, 'ms')
|
||||||
|
Loading…
Reference in New Issue
Block a user