This commit is contained in:
zhangkun9038@dingtalk.com 2025-05-05 10:38:02 +08:00
parent b39440dd48
commit d354e3745a

View File

@ -29,7 +29,7 @@ class OKXRegressionStrategy(IStrategy):
# 策略元数据(建议通过 config.json 配置)
trailing_stop = True
trailing_stop_positive = 0.01
trailing_stop_positive = 0.07
max_open_trades = 3
stake_amount = 'dynamic'
atr_period = CategoricalParameter([7, 14, 21], default=14, space='buy')
@ -162,16 +162,6 @@ class OKXRegressionStrategy(IStrategy):
# 定义币对特定的ADX阈值和止损/ROI范围
pair_thresholds = {
"DOGE/USDT": {
"adx_trend": 20, # 趋势市场ADX阈值
"adx_oscillation": 15, # 震荡市场ADX阈值
"stoploss_trend": -0.08, # 趋势市场止损:-8%
"stoploss_oscillation": -0.04, # 震荡市场止损:-4%
"stoploss_mid": -0.06, # 中间状态止损:-6%
"roi_trend": 0.06, # 趋势市场ROI6%
"roi_oscillation": 0.025, # 震荡市场ROI2.5%
"roi_mid": 0.04 # 中间状态ROI4%
},
"BTC/USDT": {
"adx_trend": 25,
"adx_oscillation": 20,
@ -201,6 +191,26 @@ class OKXRegressionStrategy(IStrategy):
"roi_trend": 0.045,
"roi_oscillation": 0.02,
"roi_mid": 0.03
},
"XRP/USDT": {
"adx_trend": 22,
"adx_oscillation": 18,
"stoploss_trend": -0.06,
"stoploss_oscillation": -0.03,
"stoploss_mid": -0.045,
"roi_trend": 0.045,
"roi_oscillation": 0.02,
"roi_mid": 0.03
},
"OKB/USDT": {
"adx_trend": 36, # 放松趋势识别,更低的 ADX 阈值 (原值 x2)
"adx_oscillation": 24, # 更低的震荡识别阈值 (原值 x2)
"stoploss_trend": -0.20, # 更宽松的趋势止损 (原值 x2)
"stoploss_oscillation": -0.12, # 更宽松的震荡止损 (原值 x2)
"stoploss_mid": -0.16, # 中间状态止损也放宽 (原值 x2)
"roi_trend": 0.14, # 提高趋势 ROI 目标 (原值 x2)
"roi_oscillation": 0.08, # 提高震荡 ROI 目标 (原值 x2)
"roi_mid": 0.10 # 中间状态 ROI 适度提高 (原值 x2)
}
}
@ -243,7 +253,8 @@ class OKXRegressionStrategy(IStrategy):
# 数据清洗
dataframe = dataframe.replace([np.inf, -np.inf], np.nan)
dataframe = dataframe.fillna(method="ffill").fillna(0)
#dataframe = dataframe.fillna(method="ffill").fillna(0)
dataframe = dataframe.ffill()
# 验证目标
required_targets = ["&-s_close", "&-roi_0", "&-buy_rsi_pred", "&-stoploss_pred", "&-roi_0_pred"]
@ -361,11 +372,20 @@ class OKXRegressionStrategy(IStrategy):
dataframe['entry_price'] = dataframe['open'].where(dataframe['enter_long'] == 1).ffill()
dataframe['stop_loss_line'] = dataframe['entry_price'] - dataframe[atr_col] * stop_loss_multiplier
# 应用止损逻辑
dataframe.loc[
(dataframe['close'] < dataframe['stop_loss_line']),
'exit_long'
] = 1
# 应用止损逻辑OKB/USDT 使用更平滑的退出)
if metadata.get('pair') == 'OKB/USDT':
# 对 OKB 添加缓冲区,避免频繁触发
buffer_ratio = 0.005 # 0.5% 缓冲
buffered_stop_loss = dataframe['stop_loss_line'] * (1 - buffer_ratio)
dataframe.loc[
(dataframe['close'] < buffered_stop_loss),
'exit_long'
] = 1
else:
dataframe.loc[
(dataframe['close'] < dataframe['stop_loss_line']),
'exit_long'
] = 1
return dataframe
@ -443,7 +463,7 @@ class OKXRegressionStrategy(IStrategy):
dataframe['ATR_14'] = 0.0
# 应用动态止损和止盈逻辑
dataframe = self._dynamic_stop_loss(dataframe, metadata)
# dataframe = self._dynamic_stop_loss(dataframe, metadata)
dataframe = self._dynamic_take_profit(dataframe, metadata)
return dataframe
@ -476,13 +496,13 @@ class OKXRegressionStrategy(IStrategy):
avg_atr_window = 20
dataframe['avg_atr'] = dataframe['ATR_14'].rolling(window=avg_atr_window).mean()
# 获取最新数据
latest_row = dataframe.iloc[-1].copy()
# 计算当前ATR在历史窗口中的百分位
historical_atr = dataframe['avg_atr'].dropna().values
if len(historical_atr) < avg_atr_window:
return None
# 根据交易对调整基础ATR值
pair_specific_atr = {
"BTC/USDT": latest_row['ATR_14'],
"ETH/USDT": latest_row['ATR_14'],
"OKB/USDT": latest_row['ATR_14'], # 使用更长周期 ATR 减少波动影响
"TON/USDT": latest_row['ATR_7']
}
current_atr = latest_row['avg_atr']
percentile = (np.sum(historical_atr < current_atr) / len(historical_atr)) * 100
@ -495,11 +515,11 @@ class OKXRegressionStrategy(IStrategy):
else: # 正常波动市场
atr_multiplier = 2.0
# 根据交易对调整基础ATR值
# 根据交易对调整基础ATR值
pair_specific_atr = {
"BTC/USDT": latest_row['ATR_14'],
"ETH/USDT": latest_row['ATR_14'],
"OKB/USDT": latest_row['ATR_7'],
"OKB/USDT": latest_row['ATR_14'], # 使用更长周期 ATR 减少波动影响
"TON/USDT": latest_row['ATR_7']
}
@ -597,9 +617,9 @@ class OKXRegressionStrategy(IStrategy):
# 设置不同币种的回调乘数
callback_multipliers = {
"BTC/USDT": 1.5,
"ETH/USDT": 1.8,
"OKB/USDT": 2.0,
"TON/USDT": 2.2,
"ETH/USDT": 2.0,
"OKB/USDT": 1.3,
"TON/USDT": 2.0,
}
callback_multiplier = callback_multipliers.get(pair, 2.0)
@ -610,8 +630,21 @@ class OKXRegressionStrategy(IStrategy):
# 计算动态回调百分比基于ATR
dataframe['callback_threshold'] = dataframe[atr_col] * callback_multiplier
# 计算滚动最高价
dataframe['rolling_high'] = dataframe['close'].rolling(window=rolling_high_period).max()
# 计算ATR
if 'ATR_14' not in dataframe.columns:
dataframe['ATR_14'] = ta.ATR(dataframe['high'], dataframe['low'], dataframe['close'], timeperiod=14)
# 计算最近高点
dataframe['rolling_high'] = dataframe['close'].rolling(window=20).max()
# 计算回调阈值
dataframe['take_profit_line'] = dataframe['entry_price'] + dataframe['ATR_14'] * callback_multiplier
# 应用止盈逻辑
dataframe.loc[
(dataframe['close'] > dataframe['take_profit_line']),
'exit_long'
] = 1
# 计算当前价格相对于最近高点的回撤比例使用ATR标准化
dataframe['callback_ratio'] = (dataframe['close'] - dataframe['rolling_high']) / dataframe['rolling_high']