From 8ba95c1ff1045a6e9d236706b121f6fdacd7cdf5 Mon Sep 17 00:00:00 2001 From: Tai NA Date: Sun, 10 Oct 2021 18:57:02 +0700 Subject: [PATCH 1/7] Add core_trend --- user_data/mgm-config.example.json | 1 + .../MasterMoniGoManiHyperStrategy.py | 37 +++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/user_data/mgm-config.example.json b/user_data/mgm-config.example.json index 39060feaa..206ddf909 100644 --- a/user_data/mgm-config.example.json +++ b/user_data/mgm-config.example.json @@ -1,6 +1,7 @@ { "monigomani_settings": { "timeframe": "30m", + "trend_timeframe": "1d", "backtest_timeframe": "5m", "startup_candle_count": 400, "precision": 1, diff --git a/user_data/strategies/MasterMoniGoManiHyperStrategy.py b/user_data/strategies/MasterMoniGoManiHyperStrategy.py index ea3ec732e..e76ec2a8a 100644 --- a/user_data/strategies/MasterMoniGoManiHyperStrategy.py +++ b/user_data/strategies/MasterMoniGoManiHyperStrategy.py @@ -96,6 +96,7 @@ class MasterMoniGoManiHyperStrategy(IStrategy, ABC): # Apply the loaded MoniGoMani Settings try: timeframe = mgm_config['timeframe'] + trend_timeframe = mgm_config['trend_timeframe'] or mgm_config['timeframe'] backtest_timeframe = mgm_config['backtest_timeframe'] startup_candle_count = mgm_config['startup_candle_count'] precision = mgm_config['precision'] @@ -193,6 +194,7 @@ class MasterMoniGoManiHyperStrategy(IStrategy, ABC): # Initialize some parameters which will be automatically configured/used by MoniGoMani use_custom_stoploss = True # Leave this enabled (Needed for open_trade custom_information_storage) is_dry_live_run_detected = True # Class level runmode detection, Gets set automatically + core_trend_timeframe = trend_timeframe # Gets set automatically informative_timeframe = timeframe # Gets set automatically timeframe_multiplier = None # Gets set automatically separator = 1.5 # Gets set automatically @@ -476,6 +478,14 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram :return DataFrame: DataFrame for MoniGoMani with all mandatory indicator data populated """ + # Populate core trend indicators + core_trend = load_pair_history(pair=metadata['pair'], + datadir=self.config['datadir'], + timeframe=self.core_trend_timeframe, + startup_candles=200, # TODO: calculate correct startup_candles needed for HT_TRENDMODE and SAR + data_format=self.config.get('dataformat_ohlcv', 'json')) + core_trend = self._populate_core_trend(core_trend, metadata) + timeframe_zoom = 'TimeFrame-Zoom' # Compute indicator data during Backtesting / Hyperopting when TimeFrame-Zooming if (self.is_dry_live_run_detected is False) and (self.informative_timeframe != self.backtest_timeframe): @@ -495,8 +505,16 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram first_informative = dataframe['date'].min().floor('H') informative = informative[informative['date'] >= first_informative] - # Populate core trend indicators - informative = self._populate_core_trend(informative, metadata) + # Merge core trend to informative data frame + informative = \ + merge_informative_pair(informative, core_trend[['date', 'ht_trendmode', 'sar', 'trend']].copy(), self.informative_timeframe, self.core_trend_timeframe, ffill=True) + informative['ht_trendmode'] = informative['ht_trendmode_' + self.core_trend_timeframe] + informative['sar'] = informative['sar_' + self.core_trend_timeframe] + informative['trend'] = informative['trend_' + self.core_trend_timeframe] + del informative['date_' + self.core_trend_timeframe] + del informative['ht_trendmode_' + self.core_trend_timeframe] + del informative['sar_' + self.core_trend_timeframe] + del informative['trend_' + self.core_trend_timeframe] # Populate indicators at a larger timeframe informative = self.do_populate_indicators(informative.copy(), metadata) @@ -516,8 +534,19 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram else: self.mgm_logger('info', timeframe_zoom, f'Dry/Live-running MoniGoMani with normal timeframe ({self.timeframe} candles)') - # Populate core trend indicators - dataframe = self._populate_core_trend(dataframe, metadata) + + # Merge core trend to main data frame + dataframe = \ + merge_informative_pair(dataframe, core_trend[['date', 'ht_trendmode', 'sar', 'trend', 'mgm_trend']].copy(), self.timeframe, self.core_trend_timeframe, ffill=True) + dataframe['ht_trendmode'] = dataframe['ht_trendmode_' + self.core_trend_timeframe] + dataframe['sar'] = dataframe['sar_' + self.core_trend_timeframe] + dataframe['trend'] = dataframe['trend_' + self.core_trend_timeframe] + dataframe['mgm_trend'] = dataframe['mgm_trend_' + self.core_trend_timeframe] + del dataframe['date_' + self.core_trend_timeframe] + del dataframe['ht_trendmode_' + self.core_trend_timeframe] + del dataframe['sar_' + self.core_trend_timeframe] + del dataframe['trend_' + self.core_trend_timeframe] + del dataframe['mgm_trend_' + self.core_trend_timeframe] # Just populate indicators. dataframe = self.do_populate_indicators(dataframe, metadata) From c5b12d458815716fe66bc45ef4fd1f91e6fbc52e Mon Sep 17 00:00:00 2001 From: Rikj000 Date: Mon, 11 Oct 2021 21:22:33 +0000 Subject: [PATCH 2/7] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Switched=20to=20f-stri?= =?UTF-8?q?ngs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MasterMoniGoManiHyperStrategy.py | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/user_data/strategies/MasterMoniGoManiHyperStrategy.py b/user_data/strategies/MasterMoniGoManiHyperStrategy.py index 2f03a431d..2e639ee91 100644 --- a/user_data/strategies/MasterMoniGoManiHyperStrategy.py +++ b/user_data/strategies/MasterMoniGoManiHyperStrategy.py @@ -488,13 +488,13 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram informative = merge_informative_pair( informative, core_trend[['date', 'ht_trendmode', 'sar', 'trend']].copy(), self.informative_timeframe, self.core_trend_timeframe, ffill=True) - informative['ht_trendmode'] = informative['ht_trendmode_' + self.core_trend_timeframe] - informative['sar'] = informative['sar_' + self.core_trend_timeframe] - informative['trend'] = informative['trend_' + self.core_trend_timeframe] - del informative['date_' + self.core_trend_timeframe] - del informative['ht_trendmode_' + self.core_trend_timeframe] - del informative['sar_' + self.core_trend_timeframe] - del informative['trend_' + self.core_trend_timeframe] + informative['ht_trendmode'] = informative[f'ht_trendmode_{self.core_trend_timeframe}'] + informative['sar'] = informative[f'sar_{self.core_trend_timeframe}'] + informative['trend'] = informative[f'trend_{self.core_trend_timeframe}'] + del informative[f'date_{self.core_trend_timeframe}'] + del informative[f'ht_trendmode_{self.core_trend_timeframe}'] + del informative[f'sar_{self.core_trend_timeframe}'] + del informative[f'trend_{self.core_trend_timeframe}'] # Populate indicators at a larger timeframe informative = self.do_populate_indicators(informative.copy(), metadata) @@ -517,15 +517,15 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram dataframe = merge_informative_pair( dataframe, core_trend[['date', 'ht_trendmode', 'sar', 'trend', 'mgm_trend']].copy(), self.timeframe, self.core_trend_timeframe, ffill=True) - dataframe['ht_trendmode'] = dataframe['ht_trendmode_' + self.core_trend_timeframe] - dataframe['sar'] = dataframe['sar_' + self.core_trend_timeframe] - dataframe['trend'] = dataframe['trend_' + self.core_trend_timeframe] - dataframe['mgm_trend'] = dataframe['mgm_trend_' + self.core_trend_timeframe] - del dataframe['date_' + self.core_trend_timeframe] - del dataframe['ht_trendmode_' + self.core_trend_timeframe] - del dataframe['sar_' + self.core_trend_timeframe] - del dataframe['trend_' + self.core_trend_timeframe] - del dataframe['mgm_trend_' + self.core_trend_timeframe] + dataframe['ht_trendmode'] = dataframe[f'ht_trendmode_{self.core_trend_timeframe}'] + dataframe['sar'] = dataframe[f'sar_{self.core_trend_timeframe}'] + dataframe['trend'] = dataframe[f'trend_{self.core_trend_timeframe}'] + dataframe['mgm_trend'] = dataframe[f'mgm_trend_{self.core_trend_timeframe}'] + del dataframe[f'date_{self.core_trend_timeframe}'] + del dataframe[f'ht_trendmode_{self.core_trend_timeframe}'] + del dataframe[f'sar_{self.core_trend_timeframe}'] + del dataframe[f'trend_{self.core_trend_timeframe}'] + del dataframe[f'mgm_trend_{self.core_trend_timeframe}'] # Just populate indicators. dataframe = self.do_populate_indicators(dataframe, metadata) From 38761764fe5a2c0295fb58a783f119750521506c Mon Sep 17 00:00:00 2001 From: Rikj000 Date: Mon, 11 Oct 2021 21:25:19 +0000 Subject: [PATCH 3/7] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Use=20`self.startup=5F?= =?UTF-8?q?candle=5Fcount`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit At least temporarily --- user_data/strategies/MasterMoniGoManiHyperStrategy.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_data/strategies/MasterMoniGoManiHyperStrategy.py b/user_data/strategies/MasterMoniGoManiHyperStrategy.py index 2e639ee91..9c0c1a8f1 100644 --- a/user_data/strategies/MasterMoniGoManiHyperStrategy.py +++ b/user_data/strategies/MasterMoniGoManiHyperStrategy.py @@ -463,7 +463,8 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram core_trend = load_pair_history(pair=metadata['pair'], datadir=self.config['datadir'], timeframe=self.core_trend_timeframe, - startup_candles=200, # ToDo: calculate correct startup_candles needed for HT_TRENDMODE and SAR + # ToDo: calculate correct startup_candles needed for HT_TRENDMODE and SAR + startup_candles=self.startup_candle_count, data_format=self.config.get('dataformat_ohlcv', 'json')) core_trend = self._populate_core_trend(core_trend, metadata) From 468a6bdcc685945bb6e4396131bedc9d8fd754c6 Mon Sep 17 00:00:00 2001 From: Rikj000 Date: Mon, 11 Oct 2021 21:45:30 +0000 Subject: [PATCH 4/7] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Fixed=20indentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user_data/strategies/MasterMoniGoManiHyperStrategy.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/user_data/strategies/MasterMoniGoManiHyperStrategy.py b/user_data/strategies/MasterMoniGoManiHyperStrategy.py index 9c0c1a8f1..a0d683ccd 100644 --- a/user_data/strategies/MasterMoniGoManiHyperStrategy.py +++ b/user_data/strategies/MasterMoniGoManiHyperStrategy.py @@ -461,11 +461,11 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram tfz = 'TimeFrame-Zoom' # Populate core trend indicators core_trend = load_pair_history(pair=metadata['pair'], - datadir=self.config['datadir'], - timeframe=self.core_trend_timeframe, - # ToDo: calculate correct startup_candles needed for HT_TRENDMODE and SAR - startup_candles=self.startup_candle_count, - data_format=self.config.get('dataformat_ohlcv', 'json')) + datadir=self.config['datadir'], + timeframe=self.core_trend_timeframe, + # ToDo: calculate correct startup_candles needed for HT_TRENDMODE and SAR + startup_candles=self.startup_candle_count, + data_format=self.config.get('dataformat_ohlcv', 'json')) core_trend = self._populate_core_trend(core_trend, metadata) # Compute indicator data during Backtesting / Hyperopting when TimeFrame-Zooming From 0b9070509fd0a5c346b5c3dafeee4acd36a78b74 Mon Sep 17 00:00:00 2001 From: Tai NA Date: Tue, 12 Oct 2021 15:55:52 +0700 Subject: [PATCH 5/7] Better rename core trend columns --- .../MasterMoniGoManiHyperStrategy.py | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/user_data/strategies/MasterMoniGoManiHyperStrategy.py b/user_data/strategies/MasterMoniGoManiHyperStrategy.py index a0d683ccd..4b0b1adca 100644 --- a/user_data/strategies/MasterMoniGoManiHyperStrategy.py +++ b/user_data/strategies/MasterMoniGoManiHyperStrategy.py @@ -489,13 +489,10 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram informative = merge_informative_pair( informative, core_trend[['date', 'ht_trendmode', 'sar', 'trend']].copy(), self.informative_timeframe, self.core_trend_timeframe, ffill=True) - informative['ht_trendmode'] = informative[f'ht_trendmode_{self.core_trend_timeframe}'] - informative['sar'] = informative[f'sar_{self.core_trend_timeframe}'] - informative['trend'] = informative[f'trend_{self.core_trend_timeframe}'] - del informative[f'date_{self.core_trend_timeframe}'] - del informative[f'ht_trendmode_{self.core_trend_timeframe}'] - del informative[f'sar_{self.core_trend_timeframe}'] - del informative[f'trend_{self.core_trend_timeframe}'] + skip_columns = [f'{s}_{self.core_trend_timeframe}' for s in + ['date', 'open', 'high', 'low', 'close', 'volume']] + informative.rename(columns=lambda s: s.replace('_{}'.format(self.core_trend_timeframe), + '') if (s not in skip_columns) else s, inplace=True) # Populate indicators at a larger timeframe informative = self.do_populate_indicators(informative.copy(), metadata) @@ -516,17 +513,12 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram # Merge core trend to main data frame dataframe = merge_informative_pair( - dataframe, core_trend[['date', 'ht_trendmode', 'sar', 'trend', 'mgm_trend']].copy(), + dataframe, core_trend[['date', 'ht_trendmode', 'sar', 'trend', 'mgm_trend']].copy(), self.timeframe, self.core_trend_timeframe, ffill=True) - dataframe['ht_trendmode'] = dataframe[f'ht_trendmode_{self.core_trend_timeframe}'] - dataframe['sar'] = dataframe[f'sar_{self.core_trend_timeframe}'] - dataframe['trend'] = dataframe[f'trend_{self.core_trend_timeframe}'] - dataframe['mgm_trend'] = dataframe[f'mgm_trend_{self.core_trend_timeframe}'] - del dataframe[f'date_{self.core_trend_timeframe}'] - del dataframe[f'ht_trendmode_{self.core_trend_timeframe}'] - del dataframe[f'sar_{self.core_trend_timeframe}'] - del dataframe[f'trend_{self.core_trend_timeframe}'] - del dataframe[f'mgm_trend_{self.core_trend_timeframe}'] + skip_columns = [f'{s}_{self.core_trend_timeframe}' for s in + ['date', 'open', 'high', 'low', 'close', 'volume']] + dataframe.rename(columns=lambda s: s.replace('_{}'.format(self.core_trend_timeframe), + '') if (s not in skip_columns) else s, inplace=True) # Just populate indicators. dataframe = self.do_populate_indicators(dataframe, metadata) From 448db5e7974f2acdbb235d4adc0e97f9c1c2c70b Mon Sep 17 00:00:00 2001 From: Rikj000 Date: Wed, 13 Oct 2021 16:49:44 +0000 Subject: [PATCH 6/7] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Drop=20unneeded=20`dat?= =?UTF-8?q?aframe`=20columns?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user_data/strategies/MasterMoniGoManiHyperStrategy.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/user_data/strategies/MasterMoniGoManiHyperStrategy.py b/user_data/strategies/MasterMoniGoManiHyperStrategy.py index 4b0b1adca..8db331eda 100644 --- a/user_data/strategies/MasterMoniGoManiHyperStrategy.py +++ b/user_data/strategies/MasterMoniGoManiHyperStrategy.py @@ -496,6 +496,9 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram # Populate indicators at a larger timeframe informative = self.do_populate_indicators(informative.copy(), metadata) + # Drop unused columns to keep the dataframe lightweight + drop_columns = ['open', 'high', 'low', 'close', 'volume', f'date_{self.core_trend_timeframe}'] + informative.drop(drop_columns, inplace=True, axis=1) # Merge indicators back in with, filling in missing values. dataframe = merge_informative_pair(dataframe, informative, self.timeframe, self.informative_timeframe, ffill=True) @@ -505,6 +508,7 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram ['date', 'open', 'high', 'low', 'close', 'volume']] dataframe.rename(columns=lambda s: s.replace('_{}'.format(self.informative_timeframe), '') if (s not in skip_columns) else s, inplace=True) + dataframe.drop([f'date_{self.informative_timeframe}'], inplace=True, axis=1) # Compute indicator data normally during Dry & Live Running or when not using TimeFrame-Zoom else: @@ -519,6 +523,7 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram ['date', 'open', 'high', 'low', 'close', 'volume']] dataframe.rename(columns=lambda s: s.replace('_{}'.format(self.core_trend_timeframe), '') if (s not in skip_columns) else s, inplace=True) + dataframe.drop([f'date_{self.core_trend_timeframe}'], inplace=True, axis=1) # Just populate indicators. dataframe = self.do_populate_indicators(dataframe, metadata) From fc82725dd359aaf5f11a7b70bbee45e6474ecb6a Mon Sep 17 00:00:00 2001 From: Rikj000 Date: Fri, 15 Oct 2021 21:36:57 +0000 Subject: [PATCH 7/7] =?UTF-8?q?=E2=9A=A1=20=EF=B8=8FSwitched=20to=204h=20`?= =?UTF-8?q?trend=5Ftimeframe`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- user_data/mgm-config.example.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_data/mgm-config.example.json b/user_data/mgm-config.example.json index 206ddf909..af3a1b908 100644 --- a/user_data/mgm-config.example.json +++ b/user_data/mgm-config.example.json @@ -1,7 +1,7 @@ { "monigomani_settings": { "timeframe": "30m", - "trend_timeframe": "1d", + "trend_timeframe": "4h", "backtest_timeframe": "5m", "startup_candle_count": 400, "precision": 1,