デュアルOTTトレンドフォロー戦略


作成日: 2023-10-08 15:10:31 最終変更日: 2023-10-08 15:10:31
コピー: 0 クリック数: 912
1
フォロー
1617
フォロワー

概要

ダブルOTTトレンドトラッキング戦略は,ダブルOTT線と係数を組み合わせた改良されたOTT戦略で,市場を整頓する時の偽信号によりうまく対応する.この戦略は,トルコのトレーダーAnıl Özekşiによって開発され,彼は自身のビデオチュートリアルで,この戦略の設計理念を詳細に説明している.

原則

二重OTT戦略の核心は,2つの最適化トレンドトラッキングラインOTTを使用してトレンドの方向を判断することです.それはまず移動平均MAvgを計算し,MAvgの値のパーセントに基づいて長ストップラインlongStopと短ストップラインshortStopを取得します.長ストップラインを上方から穿越すると看板信号で,短ストップラインを下方から穿越すると看板信号になります.

この戦略は,市場を整理する偽の信号を処理するために,以下の2つの点で改善されました.

  1. 2つの垂直移転のOTT線,OTTupとOTTdnが追加され,それらはOTTのわずかな上位移転と下位移転である.価格がこれらの2つの移転線を破るときのみ,真の取引信号が生成される.

  2. 2位 OTT ラインを微調整するために,小さなコーエフが導入され,市場により正確に適合させられた.

この二重OTT設計によって,大部分の整合市場のノイズをフィルターして,誤ったシグナルを生じさせないようにする.したがって,トレンドの転換点をよりよく捕捉し,タイミングでポジションを切り替えることができる.これは二重OTT戦略の最大の利点である.

利点

  • 双重OTT線設計により,偽信号を効果的にフィルターし,戦略の安定性を強化する.
  • 微調整係数の増加により,OTTラインが市場反応に近付く
  • アニル・オゼキシのビデオでは,戦略的なアイデアを詳細に説明し,理解しやすく説明しています.
  • 総合EMA,ストップラインなどの複数の技術指標で市場の動きを判断する
  • 作者 Anıl Özekşiは,トルコの著名なトレーダーで,専門的な知名度を持っています.

リスク

  • OTT指標自体は,テストを後退させるリスクを生じやすい.
  • ストップラインは,大きな波動の状況で頻繁に起動し,過度取引のリスクがあります.
  • coef系数は,厳密にテストされ,最適値を得なければ,効果は割引されます.
  • 言語障害がアルゴリズムを正しく理解するのを妨げているトルコ語のチュートリアル
  • 追跡データは不足し,戦略の有効性をより長期にわたって,さらに多くの市場で検証する必要があります.

対策として

  • ストップラインとダブルOTTの間のバッファーを追加し,過度に敏感にならないようにする.
  • コエフの設定を最適化し,反測結果に適合させる
  • アルゴリズムの論理を正しく理解するために,翻訳者のチュートリアル
  • 戦略パラメータの信頼性を検証するために,より多くの歴史的状況で再テストを行う

最適化の方向

  • 周期長などのパラメータを調節可能な入力値として設定することを考えることができます.
  • 他の種類の移動平均を試し,ottp原理に適合する平均算法を探す
  • 異なる取引品種に応じて,それぞれ最適化coef係数の大きさ
  • フィルタリング機能を追加し,非主要取引時間帯の誤信号を回避する
  • ストップラインを動的追跡に変更し,波動率に応じてリアルタイムで調整します.
  • 機械学習のアルゴリズムを追加し,AIを利用してパラメータ設定を自動的に最適化

総じて,ダブルOTT戦略は,Anıl Özekşiのottpの経験を充分活用し,革新を起こす.それは,信頼性の高い,カスタマイズ可能なトレンド追跡戦略の枠組みになる見込みがある.しかし,市場の変化に対応するために継続的に最適化テストが必要である.

要約する

二重OTT戦略は,二重最適化トレンド追跡線と微調整係数によって,市場を整頓する偽信号の問題に効果的に対応する.移動平均の考え方を合理的に使用し,止損線を補助して動的にトレンド追跡する.この戦略は簡潔で実用的で,知名なトレーダーの実体験から,深入な研究に値する.しかし,我々は,その限界を意識して,傲慢なことを避け,慎重に検証する必要があります.

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

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © KivancOzbilgic

//created by: @Anil_Ozeksi
//developer: ANIL ÖZEKŞİ
//author: @kivancozbilgic

strategy("Twin Optimized Trend Tracker","TOTT", overlay=true)
src = input(close, title="Source")
length=input(40, "OTT Period", minval=1)
percent=input(1, "Optimization Constant", type=input.float, step=0.1, minval=0)
coeff=input(0.001, "Twin OTT Coefficient", type=input.float, step=0.001, minval=0)
showsupport = input(title="Show Support Line?", type=input.bool, defval=true)
showsignalsk = input(title="Show Signals?", type=input.bool, defval=true)
mav = input(title="Moving Average Type", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=sum(vud1,9)
    vDD=sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
Wwma_Func(src,length)=>
    wwalpha = 1/ length
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,length)
Zlema_Func(src,length)=>
    zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
    zxEMAData = (src + (src - src[zxLag]))
    ZLEMA = ema(zxEMAData, length)
ZLEMA=Zlema_Func(src,length)
Tsf_Func(src,length)=>
    lrc = linreg(src, length, 0)
    lrc1 = linreg(src,length,1)
    lrs = (lrc-lrc1)
    TSF = linreg(src, length, 0)+lrs
TSF=Tsf_Func(src,length)
getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
fark=MAvg*percent*0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop =  MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop
OTT=MAvg>MT ? MT*(200+percent)/200 : MT*(200-percent)/200 
OTTup=OTT*(1+coeff)
OTTdn=OTT*(1-coeff)

PPLOT=plot(showsupport ? MAvg : na, color=#0585E1, linewidth=2, title="Support Line")

pALLup=plot(nz(OTTup[2]), color=color.green, linewidth=2, title="OTTup", transp=0)
pALLdn=plot(nz(OTTdn[2]), color=color.red, linewidth=2, title="OTTdown", transp=0)

buySignalk = crossover(MAvg, OTTup[2])
sellSignalk = crossunder(MAvg, OTTdn[2])
K1=barssince(buySignalk)
K2=barssince(sellSignalk)
O1=barssince(buySignalk[1])
O2=barssince(sellSignalk[1])

plotshape(buySignalk and showsignalsk and O1>K2 ? min(low-abs(roc(low,1)),OTTdn-abs(roc(low,1))) : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
plotshape(sellSignalk and showsignalsk and O2>K1 ? max(high+abs(roc(high,1)),OTTup+abs(roc(high,1))) : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0,display=display.none)
longFillColor = highlighting ? (O2>K1 ? color.green : na) : na
shortFillColor = highlighting ? (O1>K2 ? color.red : na) : na
fill(mPlot, PPLOT, title="UpTrend Highligter", color=longFillColor,transp=90)
fill(mPlot, PPLOT, title="DownTrend Highligter", color=shortFillColor,transp=90)
fill(pALLup, pALLdn, title="Flat Zone Highligter", color=color.blue,transp=90)



dummy0 = input(true, title = "=Backtest Inputs=")
FromDay    = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth  = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear   = input(defval = 2005, title = "From Year", minval = 2005)
ToDay      = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToMonth    = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear     = input(defval = 9999, title = "To Year", minval = 2006)
Start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)
Finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)
Timerange() =>
    time >= Start and time <= Finish ? true : false
if buySignalk
    strategy.entry("Long", strategy.long)
if sellSignalk
    strategy.entry("Short", strategy.short)