
Đây là một chiến lược theo dõi xu hướng tự điều chỉnh dựa trên nhiều bộ chỉ số kỹ thuật, có thể tự động điều chỉnh các tham số theo các đặc điểm thị trường khác nhau. Chiến lược tổng hợp sử dụng chỉ số dòng tiền ((CMF), chỉ số biến động giá theo xu hướng ((DPO) và chỉ số Coppock để nắm bắt xu hướng thị trường và điều chỉnh yếu tố biến động để phù hợp với các đặc điểm của thị trường khác nhau. Chiến lược có hệ thống quản lý vị trí và kiểm soát rủi ro hoàn chỉnh, có thể điều chỉnh quy mô giao dịch theo động thái biến động của thị trường.
Lý luận cốt lõi của chiến lược là xác nhận xu hướng và thời gian giao dịch bằng cách kết hợp nhiều chỉ số. Cụ thể:
Chiến lược này là một hệ thống theo dõi xu hướng hoàn chỉnh hơn, kiểm soát rủi ro tốt trong khi đảm bảo lợi nhuận thông qua phối hợp đa chỉ số và cơ chế kiểm soát rủi ro. Chiến lược có khả năng mở rộng mạnh mẽ, có rất nhiều không gian tối ưu hóa.
/*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, "#.##"))