Welcome, guest! Login / Register - Why register?
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

Your Name: Code Language: