diff --git a/config_examples/staticgrid.json b/config_examples/staticgrid.json index fc35189..7396855 100644 --- a/config_examples/staticgrid.json +++ b/config_examples/staticgrid.json @@ -1,72 +1,76 @@ { - "strategy": "EthTrueStaticGrid", - "max_open_trades": 150, - "stake_currency": "USDT", - "stake_amount": 40, - "tradable_balance_ratio": 0.99, - "dry_run": false, - "timeframe": "1h", - "position_adjustment_enable": false, - "max_entry_position_adjustment": -1, - "exchange": { - "name": "okx", - "key": "cbda9fde-b9e3-4a2d-94f9-e5c3705dfb5c", - "secret": "CD3B7DB459CBBD540E0926E5C48150E1", - "password": "c^-d:g;P2S9?Q#^", - "enable_ws": false, - "ccxt_config": { - "enableRateLimit": true, - "rateLimit": 500, - "options": { - "defaultType": "spot" - } - }, - "ccxt_async_config": { - "enableRateLimit": true, - "rateLimit": 3000, - "timeout": 20000 - }, - "pair_whitelist": [ - "ETH/USDT" - ], - "pair_blacklist": [ - "OKB/USDT" - ] + "strategy": "StaticGrid", + "max_open_trades": 150, + "stake_currency": "USDT", + "stake_amount": 40, + "tradable_balance_ratio": 0.99, + "dry_run": false, + "timeframe": "1h", + "position_adjustment_enable": true, + "process_only_new_candles": false, + "max_entry_position_adjustment": -1, + "exchange": { + "name": "okx", + "key": "cbda9fde-b9e3-4a2d-94f9-e5c3705dfb5c", + "secret": "CD3B7DB459CBBD540E0926E5C48150E1", + "password": "c^-d:g;P2S9?Q#^", + "enable_ws": false, + "ccxt_config": { + "enableRateLimit": true, + "rateLimit": 500, + "options": { + "defaultType": "spot" + } }, - "unfilledtimeout": { - "entry": 5, - "exit": 15 + "ccxt_async_config": { + "enableRateLimit": true, + "rateLimit": 3000, + "timeout": 20000 }, - - "entry_pricing": { - "price_side": "other", - "use_order_book": true, - "order_book_top": 1 - }, - "exit_pricing": { - "price_side": "other", - "use_order_book": true, - "order_book_top": 1 - }, - "pairlists": [{"method": "StaticPairList"}], - "bot_name": "ETH-1500to4500-Grid", - "api_server": { - "enabled": true, - "listen_ip_address": "0.0.0.0", - "listen_port": 8080, - "verbosity": "error", - "enable_openapi": false, - "jwt_secret_key": "6a599ab046dbb419014807dffd7b8823bfa7e5df56b17d545485deb87331b4ca", - "ws_token": "6O5pBDiRigiZrmIsofaE2rkKMJtf9h8zVQ", - "CORS_origins": [], - "username": "freqAdmin", - "password": "admin" - }, - "initial_state": "running", - "force_entry_enable": false, - "internals": { - "process_throttle_secs": 5, - "heartbeat_interval": 20, - "loglevel": "DEBUG" + "pair_whitelist": [ + "ETH/USDT" + ], + "pair_blacklist": [ + "OKB/USDT" + ] + }, + "unfilledtimeout": { + "entry": 5, + "exit": 15 + }, + "entry_pricing": { + "price_side": "other", + "use_order_book": true, + "order_book_top": 1 + }, + "exit_pricing": { + "price_side": "other", + "use_order_book": true, + "order_book_top": 1 + }, + "pairlists": [ + { + "method": "StaticPairList" } -} \ No newline at end of file + ], + "bot_name": "ETH-1500to4500-Grid", + "api_server": { + "enabled": true, + "listen_ip_address": "0.0.0.0", + "listen_port": 8080, + "verbosity": "error", + "enable_openapi": false, + "jwt_secret_key": "6a599ab046dbb419014807dffd7b8823bfa7e5df56b17d545485deb87331b4ca", + "ws_token": "6O5pBDiRigiZrmIsofaE2rkKMJtf9h8zVQ", + "CORS_origins": [], + "username": "freqAdmin", + "password": "admin" + }, + "initial_state": "running", + "force_entry_enable": false, + "internals": { + "process_throttle_secs": 5, + "heartbeat_interval": 20, + "loglevel": "DEBUG" + } +} diff --git a/user_data/strategies/MyHyperoptStrategy.py b/user_data/strategies/MyHyperoptStrategy.py new file mode 100644 index 0000000..f2086ce --- /dev/null +++ b/user_data/strategies/MyHyperoptStrategy.py @@ -0,0 +1,10 @@ + + def populate_indicators(self, dataframe: pd.DataFrame, metadata: dict) -> pd.DataFrame: + import numpy as np + + dataframe['ema_short'] = dataframe['close'].ewm(span=self.ema_short_period.value, adjust=False).mean() + dataframe['ema_long'] = dataframe['close'].ewm(span=self.ema_long_period.value, adjust=False).mean() + + dataframe['rsi'] = ta.RSI(np.array(dataframe['close']), timeperiod=14) + + return dataframe diff --git a/user_data/strategies/staticgrid.py b/user_data/strategies/staticgrid.py index 42b5c58..d9bc4f8 100644 --- a/user_data/strategies/staticgrid.py +++ b/user_data/strategies/staticgrid.py @@ -18,18 +18,23 @@ class StaticGrid(IStrategy): STEP = 50.0 STAKE = 40.0 - # 必须加这一行!否则报抽象类错误 def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame: return dataframe def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: - for price in [self.LOWER + i * self.STEP for i in range(int((self.UPPER - self.LOWER) // self.STEP) + 3)]: - dataframe.loc[dataframe['low'] <= price, 'enter_long'] = True + # 终极触发:只要这根 1h K 线的 low 曾经跌到过任何一个网格价,就立刻补单 + # 当前价 3025 → 下面所有 1500~3000 的网格价,只要历史 low 触碰过,就全部挂上 + for level in range(int((self.UPPER - self.LOWER) // self.STEP) + 5): + grid_price = self.LOWER + level * self.STEP + if grid_price <= 3025 + 200: # 当前价附近 200 刀内优先挂 + dataframe.loc[dataframe['low'] <= grid_price, 'enter_long'] = 1 return dataframe def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame: - for price in [self.LOWER + i * self.STEP for i in range(int((self.UPPER - self.LOWER) // self.STEP) + 3)]: - dataframe.loc[dataframe['high'] >= price, 'exit_long'] = True + for level in range(int((self.UPPER - self.LOWER) // self.STEP) + 5): + grid_price = self.LOWER + level * self.STEP + if grid_price >= 3025 - 200: + dataframe.loc[dataframe['high'] >= grid_price, 'exit_long'] = 1 return dataframe def custom_stake_amount(self, **kwargs) -> float: