ダイナミック・セルフアダプティブ・カウフマン 移動平均トレンド追跡戦略

作者: リン・ハーンチャオチャン開催日:2024年2月26日16時36分30秒
タグ:

img

概要

この戦略は,ダイナミックに取引ポジションを調整し,自動的に市場動向を追跡するために,カフマン適応型移動平均 (KAMA) をベースに設計されています.戦略の主な機能には,以下が含まれます.

  1. 動的に取引ステップサイズ (ピップで) を計算し,市場の変動に適応する
  2. KAMAの方向性に基づいて購入・販売シグナルを生成する
  3. 信号が起動した後,ストップ損失距離を設定し,価格が動くとそれに応じて調整します.
  4. 偽信号をフィルターするバーの近くで確認するオプション

これらの機能を適用することで,戦略はリスクを制御しながら,傾向から追加の利益を得ようとします.

戦略の論理

この戦略は,カフマン適応型移動平均指数に基づいて機能する.KAMAは,移動平均の重量とスムーズさを動的に調整するために,価格の動向と変動の比率を計算し,価格変化により迅速に反応することを可能にします.

KAMAがダウンサイドストップ・ロスの線を越えると,トレンド逆転を示し,購入信号を誘発する. KAMAがアップサイドストップ・ロスの線を下に越えると,トレンド逆転を示し,販売信号を誘発する. ポジションに入ると,戦略はATRに基づいて動的ストップ・ロスの距離を計算し,有利なストップ・ロスの線を設定する. KAMAが有利な方向に動くと,ストップ・ロスの線もそれに応じて調整され,より有利なポジションに移り,より多くの利益をロックする.

ストップ・ロスの線を徐々に動かし,ストップ・ロスの線が起動するまで,またはポジションを閉じる逆信号が起動するまで,トレンドを追跡することができます.

利点

伝統的な移動平均戦略と比較して,この戦略には以下の利点があります.

  1. KAMAは高い感度があり,価格動向をより早く把握できる.
  2. ダイナミックストップ・ロスの距離は 傾向に合わせて 利益が増えるようにします
  3. 選択可能なバーの 閉じる確認は 偽の信号をフィルタリングし 不必要なエントリを減らします

一般的には,戦略は反応的で制御可能で,典型的なトレンド追跡システムです.

リスク

この戦略にはいくつかのリスクもあります.

  1. トレンド逆転リスク: KAMAは価格変動に柔軟に適応できるが,急激なトレンド逆転に十分なタイミングで反応しない可能性があります.
  2. 過剰に攻撃的なストップ損失. ダイナミックストップ損失距離が幅が大きすぎる場合,それはあまりにも攻撃的になり,利益を間に合わない可能性があります.
  3. 偽信号の危険性.バー・クローズ・コンファームを使用することで偽信号は減少しますが,完全に排除することはできません.

これらのリスクを管理するには,ストップ損失距離を最適化し,最大ストップ損失パーセントを設定するなどの方法が使用できます. 確認のための他の指標を組み合わせることで,誤った取引も避けられます.

オプティマイゼーションの方向性

戦略を最適化するための可能性は以下の通りである.

  1. KAMA パラメータを最適化します 移動平均の長さを調整し,滑らかな調整をします
  2. ダイナミックストップ損失を最適化:異なる製品に基づいて最適なストップ損失距離とステップサイズをテストする.
  3. フィルタリング指標を追加:他のトレンド指標を組み込み,取引シグナルを確認し信頼性を向上させる.

例えば,MACDは補助確認指標として追加され,MACD Difが正であり,KAMAの黄金十字とともに拡大することを要求する.これはいくつかの偽信号をフィルタリングし,不要な繰り返しのエントリを回避することができます.

結論

この戦略の全体的な操作はスムーズである.動的なストップロスを用いてトレンドを追跡し,トレンド利益を最大化し,KAMA指標の適応性により,急速な市場変化に迅速に対応することで,この戦略は,中長期取引に適したいくつかの最適化後に効率的なトレンド追跡システムになることができます.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)

// Function to calculate pips with higher precision
getPips(price) =>
    difc = syminfo.mintick
    hlpips = price / difc
    math.round(hlpips / syminfo.mintick) * syminfo.mintick

// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )

tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)

// Function to calculate the TMA
gettma() =>
    mom = math.abs(ta.change(src, length))
    volatility = math.sum(math.abs(ta.change(src)), length)
    er = volatility != 0 ? mom / volatility : 0
    fastAlpha = 2 / (fastLength + 1)
    slowAlpha = 2 / (slowLength + 1)
    alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
    kama = 0.0
    kama := alpha * src + (1 - alpha) * nz(kama[1], src)
    await = awaitBarConfirmation ? barstate.isconfirmed : true
    maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
    thma = kama
    hma_dif = (thma - thma[2])/2
    colour = hma_dif > 0 ? color.green : color.red
    isGreen = hma_dif > 0
    [thma, isGreen, colour]

// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1

// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na

[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)

plot(thma, title='KAMA', linewidth=2, color=colour)

if ta.crossover(thma, psl) and strategy.position_size < 0
    strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)

if ta.crossunder(thma, psl) and strategy.position_size > 0
    strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)

if isGreen and strategy.position_size <= 0
    if na(psl)
        psl := close + getPips(pips)
    strategy.entry("Buy", strategy.long, alert_message=buyMess)
    lastSignal := 1

if not isGreen and strategy.position_size >= 0
    if na(psl)
        psl := close - getPips(pips)
    strategy.entry("Sell", strategy.short, alert_message=sellMess)
    lastSignal := -1

if (thma >= lastPsl or na(lastPsl)) and thma > psl
    psl := psl + getPips(pips)
    lastPsl := psl

if (thma <= lastPsl or na(lastPsl)) and thma < psl
    psl := psl - getPips(pips)
    lastPsl := psl

plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)


もっと