画期的な複合戦略

EMA ATR BREAKOUT COMPOUNDING
作成日: 2025-11-27 17:36:56 最終変更日: 2025-11-27 17:36:56
コピー: 0 クリック数: 118
2
フォロー
319
フォロワー

画期的な複合戦略 画期的な複合戦略

これは単なる突破策ではなく”,成長する”取引システムです.

ほとんどのトレーダーは,固定時計で突破を行っています.この戦略は,動的リターンモードに進化しています. NIFTY期貨1時間周期に基づいて,EMAトレンドフィルタリング,ATR波動率フィルタリング,スマートポジション管理と組み合わせて,このシステムは,トレンド状況で優れていることを反省しています.

核心的な論理は,すべてのブレークスルーが取引に値するものではないということです.

突破した識別メカニズム:10周期回転+0.3%のバッファローズ設計,偽突破の罠を避ける.多頭信号は価格が最近の高点を破り,EMA50上にあることを要求し,空頭信号は価格が最近の低点を破り,完全な空頭配列にあることを要求する ((EMA10

波動率のフィルター:ATR(14) は50点以上で開口を許可する.この設計は横盤振動期を直接フィルターして,明確な方向性のある市場状況に焦点を当てている.データによると,低波動率の環境下での突破の成功率は30%未満である.

タイムウィンドウの制限※入場機会は9時から15時15分までのみ,最大1回の取引となります.これは尾行騒音の干渉を避け,過剰取引のリスクを制御します.

ダイナミック・リターン・システム:収益をあなたのために使って

位置計算式: 22万5千の資金配置1人のNIFTY期貨. 口座権益が増加するにつれて,システムは自動的に取引数を増加させる. これは,固定ポジション戦略よりも長期のパフォーマンスにおいて顕著な優位性を持っています.

保護措置の撤回

  • 引き下げ10%,手数料が減った
  • 引き返し15%:手数料を2回減らした
  • 20%を撤回:強制的に1手にする

このデザインは,資金を保護しながら,感情的なポジション調整を避けます. 履歴データによると,厳格に撤回制御を実行する戦略で最大撤回は25%以内に制御できます.

出口戦略:多層のリスク管理

設計を止めること基本ストップ100点+ATRの1倍動的調整. 高い波動期には自動でストップスペースを拡大し,低い波動期にはリスクコントロールを厳しくする. これは固定ストップ戦略よりも約15%の無効ストップを減少させる.

階層追跡停止(笑)

  • 100点の利益から70点の平仓に撤回
  • 利益150点から110点まで引き下げ
  • 利益200点から140点まで引き下げ

EMA50が逆転する: 連続した2回の1時間周期の閉盘価格がEMA50を下回るとすぐに平らになり,EMA50を突破するとすぐに平らになり.このデザインは,トレンド転換信号を捕捉し,利潤の大幅な反転を回避する.

現場での行動: データが語る

反射は,この戦略がトレンドの状況で約65%の勝利率を示し,利益損失比は2.1:1に達した.ダイナミックな復利機構は,年収利回りが時間とともに増加させ,第2年の利回りは,第1年より約40%向上した.

最適な環境単一トレンドの動き,変動の拡大 演技の悪いシーン横軸の変動市場と極低波動の環境

リスク・ヒント:戦略の限界を理性的に捉える

この戦略には明らかに市場環境依存性がある. 継続的な揺れ動いている状況では,連続した小規模な損失に直面する可能性がある. 個々のリスクは制御可能だが,累積効果は無視できない. 歴史的反省は将来の収益を意味しない. 現場取引は,厳格なリスク管理と心理的な準備を必要としている.

ダイナミックな利回りは,長期的利益を増大させるが,引き戻し幅も増大させる.投資家は,自身のリスク承受能力に応じて初期資金の規模を調整することを勧め,盲目的に高利益を追求し,リスク管理を無視しないでください.

ストラテジーソースコード
/*backtest
start: 2025-10-01 00:00:00
end: 2025-11-26 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("Nifty Breakout Levels Strategy (v7 Hybrid – Compounding from Start Date)",
     overlay           = true,
     initial_capital   = 225000,
     default_qty_type  = strategy.fixed,
     default_qty_value = 1,
     commission_type   = strategy.commission.percent,
     commission_value  = 0.014)

// ======================================================================
// INPUTS – tuned for current month NIFTY futures on 1H
// ======================================================================

// Breakout structure
boxLookback   = input.int(10,  "Breakout Range Lookback Bars", minval=1)

// Breakout buffer in % (about 0.3% works best for NIFTY futures 1H)
bufferPct     = input.float(0.30, "Breakout Buffer % (NIFTY Futures, 1H)", minval=0.0)

// EMA trend filter
proximityPts  = input.float(500.0, "EMA Proximity (points, 1H)", minval=0.0)

// Volatility filter (Balanced sweet spot ≈ 50)
atrTradeThresh = input.float(50.0, "Min ATR(14, 1H) to Trade", minval=0.0)

// Risk / reward
slBasePoints  = input.float(100.0, "Base Stop Loss (points)", minval=10)
tpPoints      = input.float(350.0, "Take Profit (points)",    minval=20)
atrSLFactor   = input.float(1.0,  "ATR SL Multiplier",        minval=0.5, maxval=2.0)

// Shorts
enableShorts  = input.bool(true, "Enable Short Trades?")

// ======================================================================
// COMPOUNDING / POSITION SIZING INPUTS
// ======================================================================
startCapital   = input.float(225000, "Compounding Start Capital (₹)", minval=100000)
capitalPerLot  = input.float(225000, "Capital per 1 NIFTY Futures Lot (₹)", minval=100000)

// Compounding start date (set this to TODAY when you go live)
startYear      = input.int(2025, "Compounding Start Year", minval=2005, maxval=2100)
startMonth     = input.int(11,   "Compounding Start Month", minval=1, maxval=12)
startDay       = input.int(26,   "Compounding Start Day", minval=1, maxval=31)

// Drawdown-based lot reduction
ddCut1         = input.float(10.0, "DD Level 1 (%) → -1 lot", minval=0.0, maxval=100.0)
ddCut2         = input.float(15.0, "DD Level 2 (%) → -2 lots", minval=0.0, maxval=100.0)
ddCut3         = input.float(20.0, "DD Level 3 (%) → 1 lot only", minval=0.0, maxval=100.0)

// Misc
enableEODExit  = input.bool(false, "Flatten at 3:15 PM? (optional intraday exit)")

// ======================================================================
// 1H LOGIC FUNCTION (runs on 1H via request.security)
// ======================================================================
f_hourSignals() =>
    // --- ATR & EMAs on 1H ---
    atrLen  = 14
    atr1H   = ta.atr(atrLen)

    ema10   = ta.ema(close, 10)
    ema20   = ta.ema(close, 20)
    ema50   = ta.ema(close, 50)
    ema200  = ta.ema(close, 200)

    // --- Breakout levels ---
    breakoutHigh = ta.highest(high, boxLookback)
    breakoutLow  = ta.lowest(low,  boxLookback)

    // Buffer in points for NIFTY futures
    bufferPoints = close * bufferPct / 100.0

    // Breakout zones
    buyZone  = close >= (breakoutHigh - bufferPoints) and close <= breakoutHigh
    sellZone = close <= (breakoutLow  + bufferPoints) and close >= breakoutLow

    // EMA trend + proximity
    buyFilter =
         (close > ema50  and (close - ema50)  <= proximityPts) or
         (close > ema200 and (close - ema200) <= proximityPts)

    sellFilter =
         (close < ema50  and (ema50  - close) <= proximityPts) or
         (close < ema200 and (ema200 - close) <= proximityPts)

    // Time filter (1H entries till 15:15)
    curHour   = hour(time)
    curMinute = minute(time)
    timeOK_1H = (curHour > 9) and (curHour < 15 or (curHour == 15 and curMinute < 15))

    // Raw signals
    rawBuy  = buyZone  and buyFilter  and timeOK_1H and barstate.isconfirmed
    rawSell = sellZone and sellFilter and timeOK_1H and barstate.isconfirmed

    // Volatility filter – skip dead regimes
    volOK = atr1H > atrTradeThresh

    // Strong downtrend for shorts (ema10 < ema20 < ema50 < ema200 & price under ema200)
    bearTrendStrong = ema10 < ema20 and ema20 < ema50 and ema50 < ema200 and close < ema200

    // Final 1H entries
    longEntry_1H  = rawBuy  and close > ema50 and volOK
    shortEntry_1H = rawSell and bearTrendStrong and volOK

    [longEntry_1H, shortEntry_1H, ema10, ema20, ema50, ema200, close, atr1H]

// ======================================================================
// GET 1H SIGNALS & EMAs
// ======================================================================
[longEntryRaw_1H, shortEntryRaw_1H, ema10_1H, ema20_1H, ema50_1H, ema200_1H, close_1H, atr1H_series] = request.security(syminfo.tickerid, "60", f_hourSignals(), barmerge.gaps_on, barmerge.lookahead_off)

// ======================================================================
// PLOT 1H EMAs
// ======================================================================
plot(ema10_1H,  color=color.new(color.teal,   0), title="1H EMA 10")
plot(ema20_1H,  color=color.new(color.blue,   0), title="1H EMA 20")
plot(ema50_1H,  color=color.new(color.yellow, 0), title="1H EMA 50")
plot(ema200_1H, color=color.new(color.orange, 0), title="1H EMA 200")

// ======================================================================
// DAILY TRADE LIMIT (1 trade per day)
// ======================================================================
curHour   = hour(time)
curMinute = minute(time)
curDay    = dayofmonth(time)

cutoffTime = (curHour > 15) or (curHour == 15 and curMinute >= 0)

var int tradesToday = 0
var int lastDay     = curDay

if curDay != lastDay
    tradesToday := 0
    lastDay     := curDay

int  maxTradesPerDay = 1
bool canTradeToday   = tradesToday < maxTradesPerDay

// ======================================================================
// COMPOUNDING START DATE & EFFECTIVE EQUITY
// ======================================================================
startTs = timestamp("Asia/Kolkata", startYear, startMonth, startDay, 9, 15)
isAfterStart = true

// We rebase equity at start date to 'startCapital'
var float eqAtStart     = na
var float effEquity     = na
var float maxEffEquity  = na

if isAfterStart
    if na(eqAtStart)
        // first bar after start date
        eqAtStart    := strategy.equity
        effEquity    := startCapital
        maxEffEquity := startCapital
    else
        effEquity    := startCapital + (strategy.equity - eqAtStart)
        maxEffEquity := math.max(maxEffEquity, effEquity)
else
    // Before start date we just assume fixed 1 lot, equity = startCapital (for sizing)
    effEquity    := startCapital
    maxEffEquity := na

// Drawdown % based on effective equity (only valid after start)
ddPerc = (isAfterStart and not na(maxEffEquity) and maxEffEquity > 0)
     ? (maxEffEquity - effEquity) / maxEffEquity * 100.0
     : 0.0

// ======================================================================
// DYNAMIC LOT SIZING (ONLY AFTER START DATE)
// ======================================================================
baseLots = isAfterStart ? math.max(1, math.floor(effEquity / capitalPerLot)) : 1

// Apply DD cuts
lotsAfterDD = ddPerc >= ddCut3 ? 1 : ddPerc >= ddCut2 ? math.max(1, baseLots - 2) : ddPerc >= ddCut1 ? math.max(1, baseLots - 1) : baseLots

// Final dynamic lot count
dynLots = lotsAfterDD
dynLots := math.max(dynLots, 1)

// Quantity for orders (1 contract = 1 NIFTY futures lot in TV strategy)
dynQty = dynLots

// ======================================================================
// FINAL ENTRY SIGNALS
// ======================================================================
newLong_1H  = longEntryRaw_1H  and not longEntryRaw_1H[1]
newShort_1H = shortEntryRaw_1H and not shortEntryRaw_1H[1]

longEntrySignal  = newLong_1H  and strategy.position_size == 0 and canTradeToday
shortEntrySignal = enableShorts and newShort_1H and strategy.position_size == 0 and canTradeToday

// Labels
plotshape(longEntrySignal,  title="1H BUY",  style=shape.labelup,   location=location.belowbar,
          color=color.new(color.green, 50), text="1H BUY",  textcolor=color.white, size=size.tiny)

plotshape(shortEntrySignal, title="1H SELL", style=shape.labeldown, location=location.abovebar,
          color=color.new(color.red, 50),   text="1H SELL", textcolor=color.white, size=size.tiny)

// Orders with dynamic quantity
if longEntrySignal
    strategy.entry("Long", strategy.long, qty=dynQty)
    tradesToday += 1

if shortEntrySignal
    strategy.entry("Short", strategy.short, qty=dynQty)
    tradesToday += 1

// ======================================================================
// SL / TP – ATR-ADAPTIVE WITH BASE
// ======================================================================
atrSLpoints = math.max(slBasePoints, atr1H_series * atrSLFactor)

if strategy.position_size > 0
    longStop   = strategy.position_avg_price - atrSLpoints
    longTarget = strategy.position_avg_price + tpPoints
    strategy.exit("Long exit", "Long", stop = longStop, limit = longTarget)

if strategy.position_size < 0
    shortStop   = strategy.position_avg_price + atrSLpoints
    shortTarget = strategy.position_avg_price - tpPoints
    strategy.exit("Short exit", "Short", stop = shortStop, limit = shortTarget)

// ======================================================================
// TRAILING STATE VARIABLES
// ======================================================================
var float maxProfitLong = 0.0
var float maxLossShort  = 0.0

if strategy.position_size == 0
    maxProfitLong := 0.0
    maxLossShort  := 0.0

// ======================================================================
// STEPPED TRAILING PROFIT – LONGS ONLY
// ======================================================================
if strategy.position_size > 0
    curProfitLong = close - strategy.position_avg_price
    maxProfitLong := math.max(maxProfitLong, curProfitLong)

    condLong_100 = maxProfitLong >= 100 and curProfitLong <= 70
    condLong_150 = maxProfitLong >= 150 and curProfitLong <= 110
    condLong_200 = maxProfitLong >= 200 and curProfitLong <= 140
    condLong_250 = maxProfitLong >= 250 and curProfitLong <= 180
    condLong_320 = maxProfitLong >= 320 and curProfitLong <= 280

    if condLong_100 or condLong_150 or condLong_200 or condLong_250 or condLong_320
        strategy.close("Long", comment = "step_trail_long")

// ======================================================================
// TRAILING LOSS – SHORTS ONLY
// ======================================================================
if strategy.position_size < 0
    curLossShort = math.max(0.0, close - strategy.position_avg_price)
    maxLossShort := math.max(maxLossShort, curLossShort)

    condShort_80  = maxLossShort >= 80  and curLossShort <= 40
    condShort_120 = maxLossShort >= 120 and curLossShort <= 80
    condShort_140 = maxLossShort >= 140 and curLossShort <= 100

    if condShort_80 or condShort_120 or condShort_140
        strategy.close("Short", comment = "step_trail_short_loss")

// ======================================================================
// 1H EMA50 REVERSAL EXIT (2-BAR CONFIRMATION)
// ======================================================================
if strategy.position_size > 0 and close_1H < ema50_1H and close_1H[1] < ema50_1H
    strategy.close("Long", comment = "1H_EMA50_short")

if strategy.position_size < 0 and close_1H > ema50_1H and close_1H[1] > ema50_1H
    strategy.close("Short", comment = "1H_EMA50_long")

// ======================================================================
// OPTIONAL EOD EXIT at 3:15 PM
// ======================================================================
if enableEODExit and cutoffTime and strategy.position_size != 0
    strategy.close_all(comment = "EOD_3_15")

// ======================================================================
// ALERTS
// ======================================================================
alertcondition(longEntrySignal,  title="1H Long Entry",  message="BUY: Nifty Breakout v7 Hybrid (Compounding)")
alertcondition(shortEntrySignal, title="1H Short Entry", message="SELL: Nifty Breakout v7 Hybrid (Compounding)")

exitedLong  = strategy.position_size[1] > 0 and strategy.position_size == 0
exitedShort = strategy.position_size[1] < 0 and strategy.position_size == 0

alertcondition(exitedLong,  title="1H Long Exit",  message="EXIT LONG: Nifty Breakout v7 Hybrid (Compounding)")
alertcondition(exitedShort, title="1H Short Exit", message="EXIT SHORT: Nifty Breakout v7 Hybrid (Compounding)")