Skip to content
This repository has been archived by the owner on Jun 8, 2023. It is now read-only.

✨ Allow config difference core trend timeframe #156

Merged
merged 8 commits into from
Oct 15, 2021
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions user_data/mgm-config.example.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"monigomani_settings": {
"timeframe": "30m",
"trend_timeframe": "1d",
"backtest_timeframe": "5m",
"startup_candle_count": 400,
"precision": 1,
Expand Down
42 changes: 38 additions & 4 deletions user_data/strategies/MasterMoniGoManiHyperStrategy.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,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']
Expand Down Expand Up @@ -191,6 +192,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
Expand Down Expand Up @@ -457,6 +459,15 @@ 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,
Rikj000 marked this conversation as resolved.
Show resolved Hide resolved
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
if (self.is_dry_live_run_detected is False) and (self.informative_timeframe != self.backtest_timeframe):
self.mgm_logger('info', tfz, f'Backtesting/Hyperopting this strategy with a informative_timeframe '
Expand All @@ -473,8 +484,19 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram
# Throw away older data that isn't needed.
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[f'ht_trendmode_{self.core_trend_timeframe}']
Rikj000 marked this conversation as resolved.
Show resolved Hide resolved
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)
# Merge indicators back in with, filling in missing values.
Expand All @@ -491,8 +513,20 @@ def _populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFram
else:
self.mgm_logger('info', tfz,
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[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)
Expand Down