该策略是一个基于多重技术指标的市场开盘交易系统,主要针对德国和美国市场开盘时段。策略通过布林带识别盘整阶段,结合短期和长期指数移动平均线确认趋势方向,利用相对强弱指标和趋势方向指标过滤交易信号,最终采用真实波幅指标动态管理仓位。
策略采用14周期布林带(标准差1.5倍)识别低波动阶段,当价格接近布林带中轨时视为盘整。同时使用10周期和200周期指数移动平均线确认多头趋势,要求价格位于两条均线之上。使用7周期RSI确保市场非超卖(>30),7周期ADX确认趋势强度(>10)。策略还会分析最近20根K线的高点寻找阻力位,要求至少有两次触及。突破该阻力位且满足其他条件时入场,使用2倍ATR设置止损,4倍ATR设置止盈。
该策略通过多维度技术分析方法捕捉开盘时段的交易机会,运用动态止损止盈管理风险。策略逻辑清晰,风控完善,具有良好的实用性。通过持续优化和调整,有望进一步提升策略表现。
/*backtest
start: 2024-10-01 00:00:00
end: 2024-10-31 23:59:59
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Post-Open Long Strategy with ATR-based Stop Loss and Take Profit (Separate Alerts)", overlay=true)
// Parametri per Bande di Bollinger ed EMA
lengthBB = 14
mult = 1.5 // Bande di Bollinger più strette per timeframe inferiori
emaLength = 10 // EMA più breve per una rilevazione di trend più rapida
emaLongLength = 200 // EMA a lungo termine per il filtraggio del trend
// Parametri per RSI
lengthRSI = 7
rsiThreshold = 30
// Parametri per ADX
adxLength = 7
adxSmoothing = 7
adxThreshold = 10
// Filtro temporale - Solo durante l'apertura dei mercati tedesco e USA
daxOpen = (hour >= 8 and hour < 12)
usOpen = (hour == 15 and minute >= 30) or (hour >= 16 and hour < 19)
// Calcolo delle Bande di Bollinger
smaBB = ta.sma(close, lengthBB)
basis = smaBB
dev = mult * ta.stdev(close, lengthBB)
upperBand = basis + dev
lowerBand = basis - dev
// Calcolo delle EMA (breve e lungo termine)
ema = ta.ema(close, emaLength) // EMA più breve
emaLong = ta.ema(close, emaLongLength) // EMA a lungo termine per il filtraggio del trend
// Calcolo RSI
rsi = ta.rsi(close, lengthRSI)
// Calcolo ADX
[plusDI, minusDI, adx] = ta.dmi(adxLength, adxSmoothing)
// Calcolo ATR per Stop Loss e Take Profit dinamici
atrLength = 14
atrStopLossMultiplier = 2.0 // Moltiplicatore per Stop Loss
atrTakeProfitMultiplier = 4.0 // Moltiplicatore per Take Profit modificato a 4.0
atrValue = ta.atr(atrLength) // Valore ATR calcolato qui
// Condizione di lateralizzazione - Prezzo vicino alla SMA delle Bande di Bollinger
lateralization = math.abs(close - smaBB) < (0.01 * close) and (daxOpen or usOpen)
// Identificazione della resistenza e del breakout
var float resistanceLevel = na
resistanceTouches = 0
for i = 1 to 20
if high[i] > high[i+1] and high[i] > high[i-1]
resistanceLevel := high[i]
resistanceTouches := resistanceTouches + 1
// Condizione di Breakout: Il prezzo attuale supera la resistenza identificata
breakoutCondition = close > resistanceLevel and resistanceTouches >= 2
// Filtro di mercato rialzista a lungo termine - Entrare solo se il prezzo è sopra la EMA a 200 periodi
bullMarket = close > emaLong
// Filtro di trend a breve termine
trendFilter = ta.ema(close, emaLength) // Filtro di trend a breve termine
trendDown = close < trendFilter // Condizione di downtrend basata sul trend a breve termine
// Evitare l'entrata durante un pullback - Verifica se le due candele precedenti sono rosse
firstRedCandle = close[1] < open[1] // La prima candela precedente è rossa
secondRedCandle = close[2] < open[2] // La seconda candela precedente è rossa
avoidPullbackCondition = not (firstRedCandle and secondRedCandle) // Entrare solo se non entrambe sono rosse
// Condizione Panic Candle - La candela deve chiudere negativa
panicCandle = close < open and (daxOpen or usOpen)
// Condizione di Entrata Long
longCondition = breakoutCondition and lateralization and close > ema and rsi > rsiThreshold and adx > adxThreshold and not trendDown and avoidPullbackCondition and bullMarket and panicCandle
// Stop Loss e Take Profit dinamici basati su ATR
atrStopLoss = close - (atrValue * atrStopLossMultiplier) // Stop Loss dinamico usando ATR con moltiplicatore 2.0
atrTakeProfit = close + (atrValue * atrTakeProfitMultiplier) // Take Profit dinamico usando ATR con moltiplicatore 4.0
// Entrata Long: Ordine eseguito alla chiusura della candela
if (longCondition and strategy.opentrades == 0 and barstate.isconfirmed)
strategy.entry("Long", strategy.long)
// Disegna linee per Stop Loss e Take Profit
// line.new(x1=bar_index, y1=atrStopLoss, x2=bar_index + 1, y2=atrStopLoss, color=color.red, width=2, style=line.style_solid) // Linea di Stop Loss (rossa)
// line.new(x1=bar_index, y1=atrTakeProfit, x2=bar_index + 1, y2=atrTakeProfit, color=color.green, width=2, style=line.style_solid) // Linea di Take Profit (verde)
// Uscita: Stop Loss o Take Profit raggiunti
if (strategy.opentrades > 0)
strategy.exit("Exit Long", "Long", stop=atrStopLoss, limit=atrTakeProfit)
// Alert: Differenziati per Entrata e Uscita utilizzando strategy.order.action
alert_message = "Azione: {{strategy.order.action}}, Prezzo: {{close}}, Dimensione Posizione: {{strategy.position_size}}"