
この戦略は,複数の技術条件とより高い時間枠分析を組み合わせて,高確率の取引機会を識別する高度な先物取引システムである.この戦略は,複数の技術条件を同時に満たす必要性のある複数の技術条件の組み合わせに基づいたアプローチを採用し,取引に入る必要があります.これは,公正価値のギャップ (FVG),オーダーブロック (Order Blocks),流動性のスキャン (Liquidity Sweeps) および構造の突破 (BOS) 信号を含むいくつかの高度な技術概念を統合し,異なる時間周期の指標を利用してトレンドの方向を確認します.
この戦略の核心は,複数の指標が同時にシグナルを与える場合にのみ取引を確実にするために,複数の技術分析方法の組み合わせを使用することです.具体的には,戦略には以下のいくつかの重要な構成要素が含まれています.
策略は,少なくとも2つの基本条件 (デビューモードでは1つ) と構造突破信号が加えられ,さらに高時間の周期の傾向と一致している場合にのみ入場信号を生成する.
リスク管理の面では,この戦略はATR (平均リアル波幅) を使用して,動的ストップポジションを設定し,ストップ距離は通常ATRの1.5倍である.この方法は,高い波動時にストップ距離を増加させ,低い波動時にストップ距離を減少させ,ストップをよりスマートにします.
利回り終了の際には,戦略は,分期利回り方法を採用し,リスク等価 ((1R) の利回りに達したときに50%のポジションを利回りし,残りのポジションのストップを本金ポジションに移動させ,無リスクの取引の機会を創出する.また,時間ベースの退出メカニズムがあり,指定された時間 ((デフォルト30分) の間に取引が有利な方向に移動しなかった場合,自動的に閉鎖されます.
さらに,この戦略には,アカウントの収益が既定の目標 (<3000ドル) に達したときに,または尾行ストップを誘発したときに,すべてのポジションを自動的に退出するアカウント管理機能が含まれています (<2500ドルを超えるアカウントの収益が追跡開始).
このコードの詳細を分析した結果,以下のような明らかな利点が挙げられます.
この戦略の設計は精巧ですが,いくつかの潜在的リスクがあります.
コード分析から,いくつかの潜在的な最適化方向が示されています.
これは,高度な技術分析の概念を融合し,リスク管理と資金管理の機能を完備した,精巧に設計された多指標期貨取引戦略である.それは,複数の条件を同時に満たし,高時間周期のトレンドを確認することを要求することによって,偽信号を軽減し,ATRベースのダイナミックな止損と分期利益戦略を使用してリスクリターンを最適化します.
この戦略の主要な優点は,多層の確認システムとスマートなリスク管理により,低リスクを維持しながら,高確率の取引機会を捉えることができることです.しかしながら,戦略の複雑さは,パラメータの最適化と市場の適応性の課題をもたらし,継続的な監視と定期的な調整によって有効性を維持する必要があります.
この戦略は,特に市場状況への適応力を強化し,リスク管理システムを改善することで,推奨された最適化措置を実行することにより,異なる市場環境で安定したパフォーマンスを維持する可能性を秘めています.全体的に,これは経験豊富なトレーダーが使用するのに適した高度な戦略であり,適切な監視と調整により,取引システムにおける強力なツールになる可能性があります.
/*backtest
start: 2024-04-02 00:00:00
end: 2025-04-01 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// @version=5
strategy("NQ Futures Trading Strategy", overlay=true, initial_capital=50000, default_qty_type=strategy.cash, default_qty_value=5000)
// ==========================================
// Parameters
// ==========================================
// Account Parameters
accountSize = 50000
profitGoal = 3000
trailingThreshold = 2500
stopsTrailing = 52650
// Trading Parameters
atrLength = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.5, "ATR Multiplier for SL", minval=0.5, maxval=3.0, step=0.1)
timeoutPeriod = input.int(30, "Exit after X minutes if trade doesn't move favorably", minval=5, maxval=120)
// FVG (Fair Value Gap) Parameters
fvgLength = input.int(5, "FVG Look-back Period", minval=2, maxval=20)
fvgThreshold = input.float(0.1, "FVG Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01
// Order Block Parameters
obLength = input.int(5, "Order Block Look-back Period", minval=2, maxval=20)
obThreshold = input.float(0.1, "Order Block Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01
// Liquidity Sweep Parameters
sweepLength = input.int(5, "Liquidity Sweep Look-back Period", minval=2, maxval=20)
sweepThreshold = input.float(0.05, "Sweep Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01
// Break of Structure Parameters
bosLength = input.int(5, "BOS Look-back Period", minval=2, maxval=20)
bosThreshold = input.float(0.05, "BOS Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01
// Debug Mode
debugMode = input.bool(false, "Debug Mode (more signals)")
// Higher Timeframe Trend Parameters
htfPeriod1 = input.timeframe("15", "First Higher Timeframe")
htfPeriod2 = input.timeframe("60", "Second Higher Timeframe")
// ==========================================
// Indicators & Calculations
// ==========================================
// ATR Calculation
atr = ta.atr(atrLength)
// Higher Timeframe EMAs for Trend Determination
htf1_ema20 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf1_ema50 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema20 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema50 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)
// Higher Timeframe Trend
htf1_bullish = htf1_ema20 > htf1_ema50
htf1_bearish = htf1_ema20 < htf1_ema50
htf2_bullish = htf2_ema20 > htf2_ema50
htf2_bearish = htf2_ema20 < htf2_ema50
// ==========================================
// Entry Conditions
// ==========================================
// 1. Fair Value Gap (FVG)
bullishFVG = false
bearishFVG = false
for i = 1 to fvgLength
if low[i] > high[i+2] and (low[i] - high[i+2]) / high[i+2] > fvgThreshold
bullishFVG := true
if high[i] < low[i+2] and (low[i+2] - high[i]) / high[i] > fvgThreshold
bearishFVG := true
// 2. Inverse Fair Value Gap
inverseBullishFVG = false
inverseBearishFVG = false
for i = 1 to fvgLength
if high[i+1] < low[i+2] and close[i] > open[i] and close[i] > high[i+1]
inverseBullishFVG := true
if low[i+1] > high[i+2] and close[i] < open[i] and close[i] < low[i+1]
inverseBearishFVG := true
// 3. Order Block / Breaker Block
bullishOrderBlock = false
bearishOrderBlock = false
for i = 1 to obLength
if close[i+1] < open[i+1] and (open[i+1] - close[i+1]) / close[i+1] > obThreshold and close[i] > open[i]
bullishOrderBlock := true
if close[i+1] > open[i+1] and (close[i+1] - open[i+1]) / open[i+1] > obThreshold and close[i] < open[i]
bearishOrderBlock := true
// 4. Liquidity Sweep
bullishSweep = false
bearishSweep = false
lowestLow = ta.lowest(low, sweepLength+1)
highestHigh = ta.highest(high, sweepLength+1)
if low[1] < lowestLow[2] and close > open
bullishSweep := true
if high[1] > highestHigh[2] and close < open
bearishSweep := true
// 5. Break of Structure (BOS)
bullishBOS = false
bearishBOS = false
prevHigh = high[2]
prevLow = low[2]
if high > prevHigh and low[1] < low[2]
bullishBOS := true
if low < prevLow and high[1] > high[2]
bearishBOS := true
// Simpler version for debug mode
if debugMode
bullishBOS := close > open and close > close[1]
bearishBOS := close < open and close < close[1]
// ==========================================
// Signal Generation
// ==========================================
// Count valid entry conditions
bullishConditions = bullishFVG ? 1 : 0
bullishConditions := bullishConditions + (inverseBullishFVG ? 1 : 0)
bullishConditions := bullishConditions + (bullishOrderBlock ? 1 : 0)
bullishConditions := bullishConditions + (bullishSweep ? 1 : 0)
bearishConditions = bearishFVG ? 1 : 0
bearishConditions := bearishConditions + (inverseBearishFVG ? 1 : 0)
bearishConditions := bearishConditions + (bearishOrderBlock ? 1 : 0)
bearishConditions := bearishConditions + (bearishSweep ? 1 : 0)
// Entry signals (need at least 2 conditions + BOS confirmation)
// In debug mode, require only 1 condition
minConditions = debugMode ? 1 : 2
longSignal = bullishConditions >= minConditions and bullishBOS and (htf1_bullish or htf2_bullish)
shortSignal = bearishConditions >= minConditions and bearishBOS and (htf1_bearish or htf2_bearish)
// Debug mode override for testing
if debugMode
longSignal := longSignal or (bullishBOS and htf1_bullish)
shortSignal := shortSignal or (bearishBOS and htf1_bearish)
// ==========================================
// Risk Management
// ==========================================
// Calculate dynamic stop loss based on ATR
longStopDistance = atr * atrMultiplier
shortStopDistance = atr * atrMultiplier
// Default fixed values for testing
if debugMode
longStopDistance := close * 0.01 // 1% stop
shortStopDistance := close * 0.01 // 1% stop
// Calculate position size based on risk
nqPointValue = 20 // Each point is $20 for NQ
longPositionSize = math.floor(2000 / (longStopDistance * nqPointValue))
shortPositionSize = math.floor(2000 / (shortStopDistance * nqPointValue))
// Ensure at least 1 contract
longPositionSize := math.max(longPositionSize, 1)
shortPositionSize := math.max(shortPositionSize, 1)
// Variables to track entry time
var int entryTime = 0
var float equityCurve = accountSize
// ==========================================
// Strategy Execution
// ==========================================
// Make sure we don't get multiple signals on the same bar
var longEnteredThisBar = false
var shortEnteredThisBar = false
longEnteredThisBar := false
shortEnteredThisBar := false
// Entry conditions
if longSignal and not longEnteredThisBar and strategy.position_size <= 0
strategy.close_all()
strategy.entry("Long", strategy.long, qty=longPositionSize)
longEnteredThisBar := true
entryTime := time
if shortSignal and not shortEnteredThisBar and strategy.position_size >= 0
strategy.close_all()
strategy.entry("Short", strategy.short, qty=shortPositionSize)
shortEnteredThisBar := true
entryTime := time
// Take profit and stop loss orders
if strategy.position_size > 0
stopPrice = strategy.position_avg_price - longStopDistance
takeProfitPrice1 = strategy.position_avg_price + longStopDistance
strategy.exit("Long TP1", "Long", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
// Move stop to breakeven after 1R move
if high >= takeProfitPrice1
strategy.exit("Long BE", "Long", stop=strategy.position_avg_price)
if strategy.position_size < 0
stopPrice = strategy.position_avg_price + shortStopDistance
takeProfitPrice1 = strategy.position_avg_price - shortStopDistance
strategy.exit("Short TP1", "Short", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
// Move stop to breakeven after 1R move
if low <= takeProfitPrice1
strategy.exit("Short BE", "Short", stop=strategy.position_avg_price)
// Time-based exit
if strategy.position_size != 0
currentTime = time
if (currentTime - entryTime) >= timeoutPeriod * 60000 // Convert minutes to milliseconds
strategy.close_all(comment="Time Exit")
// ==========================================
// Trailing Stop for Account Management
// ==========================================
// Update equity curve
equityCurve := strategy.equity
// Check if profit target is reached or trailing stop is hit
if strategy.equity >= accountSize + profitGoal
strategy.close_all(comment="Profit Goal")
if strategy.equity >= accountSize + trailingThreshold
trailingStop = math.max(accountSize, strategy.equity - trailingThreshold)
if strategy.equity <= trailingStop
strategy.close_all(comment="Trailing Stop")
// Stop trailing if account reaches the stop trailing threshold
if strategy.equity >= stopsTrailing
strategy.close_all(comment="Stop Trailing")
// ==========================================
// Plotting
// ==========================================
// Plot entry conditions
plotshape(longSignal, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortSignal, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
// Plot current position
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : strategy.position_size < 0 ? color.new(color.red, 90) : na)
// Alert conditions
alertcondition(longSignal, title="Long Entry Signal", message="NQ LONG ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(shortSignal, title="Short Entry Signal", message="NQ SHORT ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and high >= strategy.position_avg_price + longStopDistance, title="Long Take Profit", message="NQ LONG TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and low <= strategy.position_avg_price - shortStopDistance, title="Short Take Profit", message="NQ SHORT TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and low <= strategy.position_avg_price - longStopDistance, title="Long Stop Loss", message="NQ LONG SL: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and high >= strategy.position_avg_price + shortStopDistance, title="Short Stop Loss", message="NQ SHORT SL: {{ticker}}, Price: {{close}}")