動的ピボット帯に基づくトレンド追跡戦略

作者: リン・ハーンチャオチャン, 日時: 2023-12-26 11:57:20
タグ:

img

概要

この戦略は,現在の価格と組み合わせて,特定の期間の最近の最高価格と最低価格を計算し,動的な中間線を形成する.赤下向きチャネルと緑上向きチャネルは,最近の変動に基づいて生成される. 3つのチャネルラインは取引可能な範囲を形成する.価格がチャネル境界に近づくと,利益を中間線に戻すことを目標に逆転操作が行われる.一方,トレンドをトレンドに逆転させ,主要なトレンドによって破壊されないようにするために戦略内にトレンド計算があります.

戦略の論理

  1. 最近の最高価格,最低価格,現在の閉店価格で動的な中間線を計算する
  2. ATRとマルチプリキュアに基づいて動的帯域を生成し,市場の変動に伴い幅の変化
  3. 価格が上位帯から跳ね上がるとショートします.
  4. 中間線を標的にして利益とストップ損失の論理を持っている
  5. 一方,トレンド指数を計算してトレンドに対して取引をフィルタリングします.

利点分析

  1. ダイナミックバンドは,リアルタイム市場変動に適応する
  2. トレンドに沿った取引の可能性が高い
  3. ストップ損失制御 単一の損失

リスク分析

  1. パラメータの最適化が不適切である場合,過剰取引につながる可能性があります.
  2. 主要なトレンドの下では,反トレンド取引を完全に排除できない
  3. 片側からの脱出は 継続する可能性があります

最適化方向

  1. バンドのパラメータを異なる製品に合わせて調整する
  2. トレンド取引の確率を向上させるために,トレンドインデックスパラメータを精調整する
  3. ダイナミックパラメータ最適化のための機械学習要素を導入

概要

この戦略は,主に利益を得るために市場の振動に依存する.傾向フィルタリングと組み合わせて,バンドで価格逆転点を動的に捕捉することで,リスクを制御しながら平均逆転から効果的に利益を得ることができます.鍵は,バンドを敏感に反応させるのに過度に敏感にならないようにパラメータチューニングにあります.トレンドインデックスは,その役割を果たすのに適切な期間も必要です.理論的な有利なトレンドとストップにより,この戦略は最適化を通じて立派なリターンを達成することができます.


/*backtest
start: 2023-11-25 00:00:00
end: 2023-12-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Strategy - Bobo PAPATR", overlay=true, default_qty_type = strategy.fixed, default_qty_value = 1, initial_capital = 10000)

// === STRATEGY RELATED INPUTS AND LOGIC ===
len = input(24, minval=1, title="Pivot Length, defines lookback for highs and lows to make pivots")
length = input(title="ATR lookback (Lower = bands more responsive to recent price action)", type=input.integer, defval=22)
myatr = atr(length)
dailyatr = myatr[1]
atrmult = input(title="ATR multiplier (Lower = wider bands)", type=input.float, defval=3)
pivot0 = (high[1] + low[1]  + close[1]) / 3

// PIVOT CALC
h = highest(len)
h1 = dev(h, len) ? na : h
hpivot = fixnan(h1)
l = lowest(len)
l1 = dev(l, len) ? na : l
lpivot = fixnan(l1)
pivot = (lpivot + hpivot + pivot0) / 3
upperband1 = (dailyatr * atrmult) + pivot
lowerband1 = pivot - (dailyatr * atrmult)
middleband = pivot

// == TREND CALC ===
i1=input(2, "Momentum Period", minval=1) //Keep at 2 usually
i2=input(20, "Slow Period", minval=1)
i3=input(5, "Fast Period", minval=1)
i4=input(3, "Smoothing Period", minval=1)
i5=input(4, "Signal Period", minval=1)
i6=input(50, "Extreme Value", minval=1)
hiDif = high - high[1]
loDif = low[1] - low
uDM = hiDif > loDif and hiDif > 0 ? hiDif : 0
dDM =  loDif > hiDif and loDif > 0 ? loDif : 0
ATR = rma(tr(true), i1)
DIu = 100 * rma(uDM, i1) / ATR
DId = 100 * rma(dDM, i1) / ATR
HLM2 =  DIu - DId
DTI = (100 * ema(ema(ema(HLM2, i2), i3), i4)) /  ema(ema(ema(abs(HLM2), i2), i3), i4)
signal = ema(DTI, i5)


// === RISK MANAGEMENT INPUTS ===
inpTakeProfit   = input(defval = 0, title = "Take Profit (In Market MinTick Value)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss (In Market MinTick Value)", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong = (((low<=lowerband1) and (close >lowerband1)) or ((open <= lowerband1) and (close > lowerband1))) and (strategy.opentrades <1) and (atr(3) > atr(50)) and (signal>signal[3])
exitLong = (high > middleband)
strategy.entry(id = "Long", long = true, when = enterLong) 
strategy.close(id = "Long", when = exitLong)

// === STRATEGY - SHORT POSITION EXECUTION ===
enterShort = (((high>=upperband1) and (close < upperband1)) or ((open >= upperband1) and (close < upperband1))) and (strategy.opentrades <1) and (atr(3) > atr(50)) and (signal<signal[3])
exitShort = (low < middleband)
strategy.entry(id = "Short", long = false, when = enterShort)
strategy.close(id = "Short", when = exitShort)

// === STRATEGY RISK MANAGEMENT EXECUTION ===
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss)

// === CHART OVERLAY ===
plot(upperband1, color=#C10C00, linewidth=3)
plot(lowerband1, color=#23E019, linewidth=3)
plot(middleband, color=#00E2E2, linewidth=3)
//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

もっと