本策略结合了移动平均线指标和动向指数指标,实现了双指标的交叉信号来发出买入和卖出信号。同时,策略加入了动态追踪止损来控制风险。
本策略整合移动平均线和动量指标的优势,双重确认信号,利用指标之间的互补提高策略盈利能力。同时,动态追踪止损机制能有效控制策略的风险。通过参数优化和规则完善,本策略返现能力和稳定性都有望得到提升。
/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Combined EMA and DMI Strategy with Enhanced Table", overlay=true)
// Input parameters for EMA
shortTermEMA = input.int(9, title="Short-Term EMA Period")
longTermEMA = input.int(21, title="Long-Term EMA Period")
riskPercentageEMA = input.float(1, title="Risk Percentage EMA", minval=0.1, maxval=5, step=0.1)
// Calculate EMAs
emaShort = ta.ema(close, shortTermEMA)
emaLong = ta.ema(close, longTermEMA)
// EMA Crossover Strategy
longConditionEMA = emaShort > emaLong and emaShort[1] <= emaLong[1]
shortConditionEMA = emaShort < emaLong and emaShort[1] >= emaLong[1]
// Input parameters for DMI
adxlen = input(17, title="ADX Smoothing")
dilen = input(17, title="DI Length")
// DMI Logic
dirmov(len) =>
up = ta.change(high)
down = -ta.change(low)
truerange = ta.tr
plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adxValue = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
[adxValue, plus, minus]
[adxValue, up, down] = adx(dilen, adxlen)
// DMI Conditions
buyConditionDMI = up > down or (up and adxValue > down)
sellConditionDMI = down > up or (down and adxValue > up)
// Combined Conditions for Entry
longEntryCondition = longConditionEMA and buyConditionDMI
shortEntryCondition = shortConditionEMA and sellConditionDMI
// Combined Conditions for Exit
longExitCondition = shortConditionEMA
shortExitCondition = longConditionEMA
// Enter long trade based on combined conditions
if (longEntryCondition)
strategy.entry("Long", strategy.long)
// Enter short trade based on combined conditions
if (shortEntryCondition)
strategy.entry("Short", strategy.short)
// Exit trades
if (longExitCondition)
strategy.close("Long")
if (shortExitCondition)
strategy.close("Short")
// Plot EMAs
plot(emaShort, color=color.blue, title="Short-Term EMA")
plot(emaLong, color=color.red, title="Long-Term EMA")
// Create and fill the enhanced table
var tbl = table.new(position.top_right, 4, 1)
if (barstate.islast)
table.cell(tbl, 0, 0, "ADX: " + str.tostring(adxValue), bgcolor=color.new(color.red, 90), width=15, height=4)
table.cell(tbl, 1, 0, "+DI: " + str.tostring(up), bgcolor=color.new(color.blue, 90), width=15, height=4)
table.cell(tbl, 2, 0, "-DI: " + str.tostring(down), bgcolor=color.new(color.orange, 90), width=15, height=4)