这是一个基于多重技术指标的日内交易策略,主要利用EMA通道、RSI超买超卖、MACD趋势确认等多重信号进行交易。策略在3分钟周期上运行,通过EMA高低轨道结合RSI和MACD的交叉确认来捕捉市场趋势,并设置了基于ATR的动态止损止盈,以及固定的收盘平仓时间。
策略使用20周期EMA对最高价和最低价分别计算形成通道,当价格突破通道且满足以下条件时入场: 1. 多头入场:收盘价上穿EMA高轨,RSI在50-70之间,MACD线上穿信号线 2. 空头入场:收盘价下穿EMA低轨,RSI在30-50之间,MACD线下穿信号线 3. 使用ATR动态计算止损位置,按照2.5倍风险收益比设置止盈 4. 每笔交易风险为账户1%,根据止损距离动态计算仓位大小 5. 在印度标准时间15:00强制平仓所有位置
该策略通过多重技术指标的配合使用,构建了一个相对完整的交易系统。策略的优势在于风险控制较为完善,包括动态止损、固定风险和收盘平仓等机制。虽然存在一定的滞后性风险,但通过参数优化和增加辅助指标可以进一步提升策略表现。策略特别适合波动较大的日内交易市场,通过严格的风险控制和多重信号确认来获取稳定收益。
/*backtest
start: 2024-02-21 00:00:00
end: 2024-09-09 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Intraday 3min EMA HL Strategy v6",
overlay=true,
margin_long=100,
margin_short=100,
initial_capital=100000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
commission_type=strategy.commission.percent,
commission_value=0.05,
calc_on_every_tick=false,
process_orders_on_close=true,
pyramiding=0)
// Input Parameters
i_emaLength = input.int(20, "EMA Length", minval=5, group="Strategy Parameters")
i_rsiLength = input.int(14, "RSI Length", minval=5, group="Strategy Parameters")
i_atrLength = input.int(14, "ATR Length", minval=5, group="Risk Management")
i_rrRatio = input.float(2.5, "Risk:Reward Ratio", minval=1, maxval=10, step=0.5, group="Risk Management")
i_riskPercent = input.float(1, "Risk % per Trade", minval=0.1, maxval=5, step=0.1, group="Risk Management")
// Time Exit Parameters (IST)
i_exitHour = input.int(15, "Exit Hour (IST)", minval=0, maxval=23, group="Session Rules")
i_exitMinute = input.int(0, "Exit Minute (IST)", minval=0, maxval=59, group="Session Rules")
// Indicator Calculations
emaHigh = ta.ema(high, i_emaLength)
emaLow = ta.ema(low, i_emaLength)
rsi = ta.rsi(close, i_rsiLength)
atr = ta.atr(i_atrLength)
fastMA = ta.ema(close, 12)
slowMA = ta.ema(close, 26)
macdLine = fastMA - slowMA
signalLine = ta.ema(macdLine, 9)
// Time Calculations (UTC to IST Conversion)
istHour = (hour(time) + 5) % 24 // UTC+5
istMinute = minute(time) + 30 // 30 minute offset
istHour += istMinute >= 60 ? 1 : 0
istMinute := istMinute % 60
// Exit Condition
timeExit = istHour > i_exitHour or (istHour == i_exitHour and istMinute >= i_exitMinute)
// Entry Conditions (Multi-line formatting fix)
longCondition = close > emaHigh and
rsi > 50 and
rsi < 70 and
ta.crossover(macdLine, signalLine)
shortCondition = close < emaLow and
rsi < 50 and
rsi > 30 and
ta.crossunder(macdLine, signalLine)
// Risk Calculations
var float entryPrice = na
var float stopLoss = na
var float takeProfit = na
var float posSize = na
// Strategy Logic
if longCondition and not timeExit and strategy.position_size == 0
entryPrice := close
stopLoss := math.min(low, entryPrice - atr)
takeProfit := entryPrice + (entryPrice - stopLoss) * i_rrRatio
posSize := strategy.equity * i_riskPercent / 100 / (entryPrice - stopLoss)
strategy.entry("Long", strategy.long, qty=posSize)
strategy.exit("Long Exit", "Long", stop=stopLoss, limit=takeProfit)
if shortCondition and not timeExit and strategy.position_size == 0
entryPrice := close
stopLoss := math.max(high, entryPrice + atr)
takeProfit := entryPrice - (stopLoss - entryPrice) * i_rrRatio
posSize := strategy.equity * i_riskPercent / 100 / (stopLoss - entryPrice)
strategy.entry("Short", strategy.short, qty=posSize)
strategy.exit("Short Exit", "Short", stop=stopLoss, limit=takeProfit)
// Force Close at Session End
if timeExit
strategy.close_all()
// Visual Components
plot(emaHigh, "EMA High", color=color.rgb(0, 128, 0), linewidth=2)
plot(emaLow, "EMA Low", color=color.rgb(255, 0, 0), linewidth=2)
plotshape(longCondition, "Long Signal", shape.triangleup,
location.belowbar, color=color.green, size=size.small)
plotshape(shortCondition, "Short Signal", shape.triangledown,
location.abovebar, color=color.red, size=size.small)
// Debugging Table
var table infoTable = table.new(position.top_right, 3, 3)
if barstate.islast
table.cell(infoTable, 0, 0, "EMA High: " + str.tostring(emaHigh, "#.00"))
table.cell(infoTable, 0, 1, "EMA Low: " + str.tostring(emaLow, "#.00"))
table.cell(infoTable, 0, 2, "Current RSI: " + str.tostring(rsi, "#.00"))