Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as Python by larry ( 9 years ago )
diff --git a/freqtrade/analyze.py b/freqtrade/analyze.py
index d586077..ff240e1 100644
--- a/freqtrade/analyze.py
+++ b/freqtrade/analyze.py
@@ -41,32 +41,33 @@ def populate_indicators(dataframe: DataFrame) -> DataFrame:
"""
Adds several different TA indicators to the given DataFrame
"""
- dataframe['sar'] = ta.SAR(dataframe)
- dataframe['adx'] = ta.ADX(dataframe)
+ #dataframe['sar'] = ta.SAR(dataframe)
+ #dataframe['adx'] = ta.ADX(dataframe)
stoch = ta.STOCHF(dataframe)
dataframe['fastd'] = stoch['fastd']
dataframe['fastk'] = stoch['fastk']
- dataframe['blower'] = ta.BBANDS(dataframe, nbdevup=2, nbdevdn=2)['lowerband']
- dataframe['sma'] = ta.SMA(dataframe, timeperiod=40)
- dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9)
- dataframe['mfi'] = ta.MFI(dataframe)
+ #dataframe['blower'] = ta.BBANDS(dataframe, nbdevup=2, nbdevdn=2)['lowerband']
+ #dataframe['sma'] = ta.SMA(dataframe, timeperiod=40)
+ #dataframe['tema'] = ta.TEMA(dataframe, timeperiod=9)
+ #dataframe['mfi'] = ta.MFI(dataframe)
dataframe['rsi'] = ta.RSI(dataframe)
dataframe['ema5'] = ta.EMA(dataframe, timeperiod=5)
dataframe['ema10'] = ta.EMA(dataframe, timeperiod=10)
+ dataframe['ema20'] = ta.EMA(dataframe, timeperiod=20)
dataframe['ema50'] = ta.EMA(dataframe, timeperiod=50)
dataframe['ema100'] = ta.EMA(dataframe, timeperiod=100)
- dataframe['ao'] = awesome_oscillator(dataframe)
- macd = ta.MACD(dataframe)
- dataframe['macd'] = macd['macd']
- dataframe['macdsignal'] = macd['macdsignal']
- dataframe['macdhist'] = macd['macdhist']
- hilbert = ta.HT_SINE(dataframe)
- dataframe['htsine'] = hilbert['sine']
- dataframe['htleadsine'] = hilbert['leadsine']
- dataframe['plus_dm'] = ta.PLUS_DM(dataframe)
- dataframe['plus_di'] = ta.PLUS_DI(dataframe)
- dataframe['minus_dm'] = ta.MINUS_DM(dataframe)
- dataframe['minus_di'] = ta.MINUS_DI(dataframe)
+ #dataframe['ao'] = awesome_oscillator(dataframe)
+ #macd = ta.MACD(dataframe)
+ #dataframe['macd'] = macd['macd']
+ #dataframe['macdsignal'] = macd['macdsignal']
+ #dataframe['macdhist'] = macd['macdhist']
+ #hilbert = ta.HT_SINE(dataframe)
+ #dataframe['htsine'] = hilbert['sine']
+ #dataframe['htleadsine'] = hilbert['leadsine']
+ #dataframe['plus_dm'] = ta.PLUS_DM(dataframe)
+ #dataframe['plus_di'] = ta.PLUS_DI(dataframe)
+ #dataframe['minus_dm'] = ta.MINUS_DM(dataframe)
+ #dataframe['minus_di'] = ta.MINUS_DI(dataframe)
return dataframe
@@ -76,17 +77,21 @@ def populate_buy_trend(dataframe: DataFrame) -> DataFrame:
:param dataframe: DataFrame
:return: DataFrame with buy column
"""
+ print('##############################################################')
dataframe.loc[
(
- (dataframe['rsi'] < 35> 30) &
- (dataframe['plus_di'] > 0.5)
- ) |
- (
- (dataframe['adx'] > 65) &
- (dataframe['plus_di'] > 0.5)
- ),
+ ((dataframe['rsi'] < 30> 30) &
+ #(dataframe['plus_di'] > 0.5)
+ ),# |
+ #(
+ # (dataframe['adx'] > 65) &
+ # (dataframe['plus_di'] > 0.5)
+ #),
'buy'] = 1
return dataframe
@@ -99,17 +104,17 @@ def populate_sell_trend(dataframe: DataFrame) -> DataFrame:
:return: DataFrame with buy column
"""
dataframe.loc[
- (
- (
- (crossed_above(dataframe['rsi'], 70)) |
- (crossed_above(dataframe['fastd'], 70))
- ) &
- (dataframe['adx'] > 10) &
- (dataframe['minus_di'] > 0)
- ) |
- (
- (dataframe['adx'] > 70) &
- (dataframe['minus_di'] > 0.5)
+ (((crossed_above(dataframe['rsi'], 70)) |
+ (crossed_above(dataframe['fastd'], 70)))
+ &
+ ((dataframe['rsi'] > 50) &
+ (dataframe['fastd'] > 50))
+ # (dataframe['adx'] > 10) &
+ # (dataframe['minus_di'] > 0)
+ #) |
+ #(
+ # (dataframe['adx'] > 70) &
+ # (dataframe['minus_di'] > 0.5)
),
'sell'] = 1
return dataframe
diff --git a/freqtrade/exchange/bittrex.py b/freqtrade/exchange/bittrex.py
index aa74cba..1ca938e 100644
--- a/freqtrade/exchange/bittrex.py
+++ b/freqtrade/exchange/bittrex.py
@@ -79,6 +79,7 @@ class Bittrex(Exchange):
return data['result']
def get_ticker(self, pair: str) -> dict:
+ print('get_ticker pair=', pair)
data = _API.get_ticker(pair.replace('_', '-'))
if not data['success']:
raise OperationalException('{message} params=({pair})'.format(
@@ -99,6 +100,7 @@ class Bittrex(Exchange):
}
def get_ticker_history(self, pair: str, tick_interval: int) -> List[Dict]:
+ print('get_ticker_history pair=', pair, 'interval=', tick_interval)
if tick_interval == 1:
interval = 'oneMin'
elif tick_interval == 5:
diff --git a/freqtrade/optimize/__init__.py b/freqtrade/optimize/__init__.py
index 12ec633..183ebcd 100644
--- a/freqtrade/optimize/__init__.py
+++ b/freqtrade/optimize/__init__.py
@@ -20,8 +20,9 @@ def load_data(ticker_interval: int = 5, pairs: Optional[List[str]]
= None) -> Di
path = os.path.abspath(os.path.dirname(__file__))
result = {}
_pairs = pairs or [
- "BTC_ETH", "BTC_LTC", "BTC_ETC", "BTC_DASH", "BTC_ZEC",
- "BTC_XLM", "BTC_NXT", "BTC_POWR", "BTC_ADA", "BTC_XMR",
+ "BTC_XMR", "BTC_XLM", "BTC_NXT"
+ #"BTC_ADA" , "BTC_LTC", "BTC_DASH", "BTC_ETH", "BTC_XLM", "BTC_NXT", "BTC_AD
A",
+ #"BTC_XMR"
]
for pair in _pairs:
with open('{abspath}/../tests/testdata/{pair}-{ticker_interval}.json'.format
(
diff --git a/freqtrade/optimize/backtesting.py b/freqtrade/optimize/backtesting.py
index 5b34afd..f515ef8 100644
--- a/freqtrade/optimize/backtesting.py
+++ b/freqtrade/optimize/backtesting.py
@@ -110,8 +110,10 @@ def backtest(config: Dict, processed: Dict[str, DataFrame],
if min_roi_reached(trade, row2.close, row2.date) or row2.sell == 1:
current_profit = trade.calc_profit(row2.close)
lock_pair_until = row2.Index
-
trades.append((pair, current_profit, row2.Index - row.Index))
+ #print(trade, row, row2)
+ #print(row.date, 'roi reached after:', row2.Index - row.Index, '
pair:',
+ # pair, 'profit:', current_profit)
break
labels = ['currency', 'profit', 'duration']
return DataFrame.from_records(trades, columns=labels)
diff --git a/freqtrade/optimize/hyperopt.py b/freqtrade/optimize/hyperopt.py
index 78e5a3f..0cd2e6c 100644
--- a/freqtrade/optimize/hyperopt.py
+++ b/freqtrade/optimize/hyperopt.py
@@ -4,6 +4,7 @@
import json
import logging
import sys
+import math
from functools import reduce
from math import exp
from operator import itemgetter
@@ -25,7 +26,7 @@ logger = logging.getLogger(__name__)
# set TARGET_TRADES to suit your number concurrent trades so its realistic to 20days
of data
-TARGET_TRADES = 1100
+TARGET_TRADES = 500
TOTAL_TRIES = None
_CURRENT_TRIES = 0
@@ -36,9 +37,9 @@ AVG_DURATION_TO_BEAT = 50
# Configuration and data used by hyperopt
PROCESSED = optimize.preprocess(optimize.load_data())
OPTIMIZE_CONFIG = {
- 'max_open_trades': 3,
+ 'max_open_trades': 5,
'stake_currency': 'BTC',
- 'stake_amount': 0.01,
+ 'stake_amount': 0.001,
'minimal_roi': {
'40': 0.0,
'30': 0.01,
@@ -54,18 +55,10 @@ main._CONF = OPTIMIZE_CONFIG
SPACE = {
- 'mfi': hp.choice('mfi', [
- {'enabled': False},
- {'enabled': True, 'value': hp.quniform('mfi-value', 5, 25, 1)}
- ]),
'fastd': hp.choice('fastd', [
{'enabled': False},
{'enabled': True, 'value': hp.quniform('fastd-value', 10, 50, 1)}
]),
- 'adx': hp.choice('adx', [
- {'enabled': False},
- {'enabled': True, 'value': hp.quniform('adx-value', 15, 50, 1)}
- ]),
'rsi': hp.choice('rsi', [
{'enabled': False},
{'enabled': True, 'value': hp.quniform('rsi-value', 20, 40, 1)}
@@ -74,31 +67,30 @@ SPACE = {
{'enabled': False},
{'enabled': True}
]),
- 'uptrend_short_ema': hp.choice('uptrend_short_ema', [
+ 'uptrend_mid_ema': hp.choice('uptrend_mid_ema', [
{'enabled': False},
{'enabled': True}
]),
- 'over_sar': hp.choice('over_sar', [
- {'enabled': False},
- {'enabled': True}
- ]),
- 'green_candle': hp.choice('green_candle', [
+ 'uptrend_short_ema': hp.choice('uptrend_short_ema', [
{'enabled': False},
{'enabled': True}
]),
- 'uptrend_sma': hp.choice('uptrend_sma', [
+
+ 't_rsi': hp.choice('t_rsi', [
{'enabled': False},
- {'enabled': True}
+ {'enabled': True, 'value': hp.quniform('t_rsi-value', 5, 40, 1)}
]),
'trigger': hp.choice('trigger', [
- {'type': 'lower_bb'},
- {'type': 'faststoch10'},
- {'type': 'ao_cross_zero'},
+# {'type': 'lower_bb'},
+# {'type': 'faststoch10'},
+ #{'type': 'ao_cross_zero'},
+ {'type': 't_rsi'},
{'type': 'ema5_cross_ema10'},
- {'type': 'macd_cross_signal'},
- {'type': 'sar_reversal'},
- {'type': 'stochf_cross'},
- {'type': 'ht_sine'},
+ {'type': 'ema10_cross_ema20'},
+# {'type': 'macd_cross_signal'},
+ #{'type': 'sar_reversal'},
+# {'type': 'stochf_cross'},
+ #{'type': 'ht_sine'},
]),
}
@@ -111,6 +103,7 @@ def log_results(results):
profit = results['total_profit'] / 1000
outcome = '{:5d}/{}: {}'.format(current_try, total_tries, result)
+ print('outcome:', outcome, 'profit:', profit)
if profit >= TOTAL_PROFIT_TO_BEAT:
logger.info(outcome)
@@ -124,11 +117,15 @@ def optimizer(params):
from freqtrade.optimize import backtesting
backtesting.populate_buy_trend = buy_strategy_generator(params)
+ print('--- calling backtest')
results = backtest(OPTIMIZE_CONFIG, PROCESSED)
-
result = format_results(results)
+ print('--- done backtest')
total_profit = results.profit.sum() * 1000
+ if math.isnan(total_profit):
+ total_profit = 0
+ print('total profit:', total_profit)
trade_count = len(results.index)
trade_loss = 1 - 0.35 * exp(-(trade_count - TARGET_TRADES) ** 2 / 10 ** 5.2)
@@ -170,39 +167,37 @@ def format_results(results: DataFrame):
def buy_strategy_generator(params):
+ print(params)
def populate_buy_trend(dataframe: DataFrame) -> DataFrame:
conditions = []
# GUARDS AND TRENDS
+
if params['uptrend_long_ema']['enabled']:
conditions.append(dataframe['ema50'] > dataframe['ema100'])
+
+ if params['uptrend_mid_ema']['enabled']:
+ conditions.append(dataframe['ema10'] > dataframe['ema20'])
+
if params['uptrend_short_ema']['enabled']:
conditions.append(dataframe['ema5'] > dataframe['ema10'])
- if params['mfi']['enabled']:
- conditions.append(dataframe['mfi'] < params> params['adx']['value'])
+
if params['rsi']['enabled']:
conditions.append(dataframe['rsi'] < params> dataframe['sar'])
- if params['green_candle']['enabled']:
- conditions.append(dataframe['close'] > dataframe['open'])
- if params['uptrend_sma']['enabled']:
- prevsma = dataframe['sma'].shift(1)
- conditions.append(dataframe['sma'] > prevsma)
+
+ trsi = 1000
+ if params['t_rsi']['enabled']:
+ trsi = params['t_rsi']['value']
# TRIGGERS
triggers = {
- 'lower_bb': dataframe['tema'] <= dataframe['blower'],
- 'faststoch10': (crossed_above(dataframe['fastd'], 10.0)),
- 'ao_cross_zero': (crossed_above(dataframe['ao'], 0.0)),
- 'ema5_cross_ema10': (crossed_above(dataframe['ema5'], dataframe['ema10'])),
- 'macd_cross_signal': (crossed_above(dataframe['macd'], dataframe['macdsi
gnal'])),
- 'sar_reversal': (crossed_above(dataframe['close'], dataframe['sar'])),
- 'stochf_cross': (crossed_above(dataframe['fastk'], dataframe['fastd'])),
- 'ht_sine': (crossed_above(dataframe['htleadsine'], dataframe['htsine']))
,
+ 't_rsi' : (crossed_above(dataframe['rsi'], trsi)),
+ 'faststoch10' : (crossed_above(dataframe['fastd'], 10.0)),
+ 'ema5_cross_ema10' : (crossed_above(dataframe['ema5'], dataframe['ema10'
])),
+ 'ema10_cross_ema20': (crossed_above(dataframe['ema10'], dataframe['ema20
'])),
+ 'stochf_cross' : (crossed_above(dataframe['fastk'], dataframe['fastd
'])),
}
conditions.append(triggers.get(params['trigger']['type']))
@@ -236,6 +231,7 @@ def start(args):
trials = Trials()
best = fmin(fn=optimizer, space=SPACE, algo=tpe.suggest, max_evals=TOTAL_TRIES,
trials=trials)
+ print('---------------------------')
logger.info('Best parameters:\n%s', json.dumps(best, indent=4))
results = sorted(trials.results, key=itemgetter('loss'))
logger.info('Best Result:\n%s', results[0]['result'])
diff --git a/freqtrade/tests/testdata/download_backtest_data.py b/freqtrade/tests/tes
tdata/download_backtest_data.py
index 37cd4c9..5ce6be6 100755
--- a/freqtrade/tests/testdata/download_backtest_data.py
+++ b/freqtrade/tests/testdata/download_backtest_data.py
@@ -7,11 +7,11 @@ from os import path
from freqtrade import exchange
from freqtrade.exchange import Bittrex
-PAIRS = [
- 'BTC_BCC', 'BTC_ETH', 'BTC_MER', 'BTC_POWR', 'BTC_ETC',
- 'BTC_OK', 'BTC_NEO', 'BTC_EMC2', 'BTC_DASH', 'BTC_LSK',
- 'BTC_LTC', 'BTC_XZC', 'BTC_OMG', 'BTC_STRAT', 'BTC_XRP',
- 'BTC_QTUM', 'BTC_WAVES', 'BTC_VTC', 'BTC_XLM', 'BTC_MCO'
+PAIRS = ['BTC_XMR'
+# 'BTC_BCC', 'BTC_ETH', 'BTC_MER', 'BTC_POWR', 'BTC_ETC',
+# 'BTC_OK', 'BTC_NEO', 'BTC_EMC2', 'BTC_DASH', 'BTC_LSK',
+# 'BTC_LTC', 'BTC_XZC', 'BTC_OMG', 'BTC_STRAT', 'BTC_XRP',
+# 'BTC_QTUM', 'BTC_WAVES', 'BTC_VTC', 'BTC_XLM', 'BTC_MCO'
]
TICKER_INTERVAL = 5 # ticker interval in minutes (currently implemented: 1 and 5)
OUTPUT_DIR = path.dirname(path.realpath(__file__))
Revise this Paste