デュアルトラック反転戦略


作成日: 2023-11-02 16:31:50 最終変更日: 2023-11-02 16:31:50
コピー: 0 クリック数: 633
1
フォロー
1617
フォロワー

デュアルトラック反転戦略

概要

双軌追跡反転戦略は,ブリン帯,ケルトナー通路,および動量指標を組み合わせた反転取引戦略である. この戦略は,ブリン帯とケルトナー通路の総合判断によって,価格が圧縮領域に入るときを識別し,同時に動量指標を組み合わせて価格の反転信号を判断し,取引入場と出場信号を形成する.

戦略原則

  1. ブリン帯の中線,上線,下線を計算する

    • 中間軌道でSMAが使用されている
    • 上下軌は中軌加減調整可能な倍数の標準差
  2. ケルトナー通路内の中線,上線,下線を計算する

    • 中間軌道でSMAが使用されている
    • 上下軌道は中軌道加減で調整可能な倍数であるATR
  3. ブリン帯がケルトナー通路の内側にあるかどうかを判断する

    • ブリン帯の上線がケルトナー上線より低く,ブリン帯の下線がケルトナー下線より高く,圧縮状態であると考えられる.
    • 圧縮ではなく
  4. close と ブリン帯,ケルトナー通路の中央点の線形回帰斜率val を計算する

    • val > 0はcloseが上昇し,val < 0はcloseが低下していることを示します.
  5. close の変化率ROCとそのEMAを計算する

    • 変化率が調整可能な値に達しているかどうかを判断する
    • 値が下がった場合,トレンド中です.
  6. 圧縮時に,val > 0 と変化率が値に達したときに追加します.

    • 代わりに空白する
  7. 停止・停止条件を設定する

戦略的優位性

  1. 双線システムによる反転時刻判断の精度向上

  2. 線形回帰と変化率の判断を増加させ,反転偽信号を避ける

  3. 調整可能なパラメータの設定が柔軟で,異なる品種に最適化できます

  4. ストップ・ストップ・ストップ・ストラテジーを採用し,単一取引のリスクを効果的にコントロールできます.

  5. 戦略の有効性を検証する十分なデータです.

戦略的リスクと解決策

  1. 双線圧縮は必ずしも有効な逆転を生じない

    • 最適化パラメータ,厳格な双線圧縮条件
  2. 偽の侵入は誤った信号を生成します.

    • 線形回帰の判定を加え,トレンドの方向を決定する
  3. ストップ・ロスの設定が緩やかで,単発損失が大きすぎる

    • ストップポイントの最適化,単発損失の厳格な制御
  4. テストサイクル Datenichinhalt

    • 長期にわたる効果を検証する再テストサイクルを増やす

戦略最適化の方向性

  1. パラメータ設定を最適化して,より多くの品種に対応

  2. 機械学習による判断の強化

  3. 取引量の変化に合わせて,突破的なリアルさを向上させる

  4. 長期間の分析を追加し,トレンドの持続性を判断します.

  5. ストップ・ストップ・ストップ戦略の最適化,ダイナミック・トラッキング

要約する

双軌追跡逆転戦略は,概して,ブリン帯ケルトナー通路などの指標を利用した逆転戦略である.この戦略は,パラメータを最適化することで,異なる品種に適応し,突破の真偽を一定程度に識別することができる.しかし,逆転取引自体は,一定のリスクが依然として存在し,判断精度を高めるために機械学習などの技術とさらに結合する必要があり,その結果,より安定した余分な利益を得ることができる.

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

//@version=4
// Credit for the initial Squeeze Momentum code to LazyBear, rate of change code is from Kiasaki
strategy("Squeeze X BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2012, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// Squeeeeze ///////////////
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(22, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
 
useTrueRange = input(true, title="Use TrueRange (KC)")
 
// Calculate BB
source = close
basis = sma(source, length)
dev = mult * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

///////////// Rate Of Change ///////////// 
roclength = input(30, minval=1), pcntChange = input(7, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = val > 0 and isMoving()
short = val < 0 and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(100.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
/////////////// Plotting ///////////////
bcolor = iff(val > 0, iff(val > nz(val[1]), color.lime, color.green), iff(val < nz(val[1]), color.red, color.maroon))
plot(val, color=bcolor, linewidth=4)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)
hline(0, color = color.white)