这是一个基于多个技术指标组合的自适应趋势跟踪策略,可以根据不同市场特征自动调整参数。该策略综合运用了资金流向指标(CMF)、去趋势价格震荡指标(DPO)以及考普克指标(Coppock)来捕捉市场趋势,并通过波动率调整因子来适配不同市场的特点。策略具有完整的仓位管理和风险控制体系,能够根据市场波动性动态调整交易规模。
策略的核心逻辑是通过多指标配合来确认趋势方向和交易时机。具体来说: 1. 使用CMF指标来衡量资金流向,判断市场情绪 2. 通过DPO指标剔除长期趋势影响,关注中短期价格波动 3. 采用改良的Coppock指标捕捉趋势转折点 4. 当三个指标共同确认时才会产生交易信号 5. 通过ATR动态计算止损止盈位置 6. 根据不同市场特征(股票、外汇、期货)自动调整杠杆率和波动率参数
该策略是一个较为完整的趋势跟踪系统,通过多指标配合和风险控制机制,在保证收益的同时也很好地控制了风险。策略的可扩展性强,有很大的优化空间。建议在实盘交易中从小规模开始,逐步增加交易规模,同时持续监控策略表现并及时调整参数。
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-10 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Multi-Market Adaptive Trading Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)
// Input parameters
i_market_type = input.string("Crypto", "Market Type", options=["Forex", "Crypto", "Futures"])
i_risk_percent = input.float(1, "Risk Per Trade (%)", minval=0.1, maxval=100, step=0.1)
i_volatility_adjustment = input.float(1.0, "Volatility Adjustment", minval=0.1, maxval=5.0, step=0.1)
i_max_position_size = input.float(5.0, "Max Position Size (%)", minval=1.0, maxval=100.0, step=1.0)
i_max_open_trades = input.int(3, "Max Open Trades", minval=1, maxval=10)
// Indicator Parameters
i_cmf_length = input.int(20, "CMF Length", minval=1)
i_dpo_length = input.int(21, "DPO Length", minval=1)
i_coppock_short = input.int(11, "Coppock Short ROC", minval=1)
i_coppock_long = input.int(14, "Coppock Long ROC", minval=1)
i_coppock_wma = input.int(10, "Coppock WMA", minval=1)
i_atr_length = input.int(14, "ATR Length", minval=1)
// Market-specific Adjustments
volatility_factor = i_market_type == "Forex" ? 0.1 : i_market_type == "Futures" ? 1.5 : 1.0
volatility_factor *= i_volatility_adjustment
leverage = i_market_type == "Forex" ? 100.0 : i_market_type == "Futures" ? 20.0 : 3.0
// Calculate Indicators
mf_multiplier = ((close - low) - (high - close)) / (high - low)
mf_volume = mf_multiplier * volume
cmf = ta.sma(mf_volume, i_cmf_length) / ta.sma(volume, i_cmf_length)
dpo_offset = math.floor(i_dpo_length / 2) + 1
dpo = close - ta.sma(close, i_dpo_length)[dpo_offset]
roc1 = ta.roc(close, i_coppock_short)
roc2 = ta.roc(close, i_coppock_long)
coppock = ta.wma(roc1 + roc2, i_coppock_wma)
atr = ta.atr(i_atr_length)
// Define Entry Conditions
long_condition = cmf > 0 and dpo > 0 and coppock > 0 and ta.crossover(coppock, 0)
short_condition = cmf < 0 and dpo < 0 and coppock < 0 and ta.crossunder(coppock, 0)
// Calculate Position Size
account_size = strategy.equity
risk_amount = math.min(account_size * (i_risk_percent / 100), account_size * (i_max_position_size / 100))
position_size = (risk_amount / (atr * volatility_factor)) * leverage
// Execute Trades
if (long_condition and strategy.opentrades < i_max_open_trades)
sl_price = close - (atr * 2 * volatility_factor)
tp_price = close + (atr * 3 * volatility_factor)
strategy.entry("Long", strategy.long, qty=position_size)
strategy.exit("Long Exit", "Long", stop=sl_price, limit=tp_price)
if (short_condition and strategy.opentrades < i_max_open_trades)
sl_price = close + (atr * 2 * volatility_factor)
tp_price = close - (atr * 3 * volatility_factor)
strategy.entry("Short", strategy.short, qty=position_size)
strategy.exit("Short Exit", "Short", stop=sl_price, limit=tp_price)
// Plot Indicators
plot(cmf, color=color.blue, title="CMF")
plot(dpo, color=color.green, title="DPO")
plot(coppock, color=color.red, title="Coppock")
hline(0, "Zero Line", color=color.gray)
// Alerts
alertcondition(long_condition, title="Long Entry", message="Potential Long Entry Signal")
alertcondition(short_condition, title="Short Entry", message="Potential Short Entry Signal")
// // Performance reporting
// if barstate.islastconfirmedhistory
// label.new(bar_index, high, text="Strategy Performance:\nTotal Trades: " + str.tostring(strategy.closedtrades) +
// "\nWin Rate: " + str.tostring(strategy.wintrades / strategy.closedtrades * 100, "#.##") + "%" +
// "\nProfit Factor: " + str.tostring(strategy.grossprofit / strategy.grossloss, "#.##"))