ATRとMAの組み合わせに基づくスーパートレンド取引戦略


作成日: 2023-12-01 16:40:27 最終変更日: 2023-12-01 16:40:27
コピー: 0 クリック数: 643
1
フォロー
1166
フォロワー

ATRとMAの組み合わせに基づくスーパートレンド取引戦略

概要

スーパートレンド取引戦略 (Supertrend Trading Strategy) は,平均リアルレンジ (ATR) と移動平均 (MA) に基づいたトレンド追跡戦略である.これは,トレンドフォローとブレイクトレードの長所を融合し,中期トレンドの方向を特定し,トレンドの変化に応じて取引信号を生成することを目的としている.

この戦略の主な考えは,価格が超トレンドチャネルを突破すると,トレンドが逆転することを示すため,買ったり売ったりすることである.それは同時に,利益とリスクの制御をするために,ストップ・ロスとストップ・ストップのレベルを設定する.

戦略原則

超トレンド戦略の計算プロセスは以下のステップで構成されています.

  1. ATRを計算する.ATRは,一期間の平均波動幅を反映する.
  2. 最高価格と最低価格に基づいて通路中線を計算する.通路中線の計算式は: ((最高価格+最低価格) /2
  3. ATRとユーザが設定したATR倍数に基づいて,チャネルの上限と下限を計算する.チャネルの上限の計算式は: 中線+(ATR×ATR倍数);チャネルの下限の計算式は: 中線-(ATR×ATR倍数) である.
  4. 閉盘価格とチャネルの上下限との関係を比較して,トレンド方向を判断する.閉盘価格がチャネルの上上限より高いのはトレンド向上,閉盘価格がチャネルの下限より低いのはトレンドダウンである.
  5. 価格がトレンドチャネルを突破したとき,反転取引を行う.例えば,価格が下から上へチャネルの上限を突破し,買取シグナルを生じ;価格が上から下へチャネル下限を突破し,売出シグナルを生じ.

この戦略の優点は,トレンドフォローとトレンド反転の取引方法の両方を組み合わせることです. それは,大きなトレンドの方向を判断し,反転の機会を間に合うように捉えることができます. さらに,リスクを管理するために,止損停止機構を設定します.

優位分析

スーパートレンド戦略は以下の利点があります.

1. 中期トレンドを追跡する

超トレンドチャネルはATR計算に基づいており,中期価格変動の範囲を効果的に反映します.それは通常の移動平均よりも中期トレンドをよく追跡します.

2. 逆転のタイミングを把握する

価格がチャネルを突破すると,迅速に取引信号を発し,大きなトレンドの逆転を間に合うように捕捉できます.これは,適切なポジションの調整を保証し,超期保有を減らすことができます.

3. 損傷防止装置

この戦略は,同時にストップ・ロズとストップ・ロズを設定し,自動でストップ・ロスを停止させることができる.これは,大抵の泛滥のリスクを軽減し,トレンドの状況を把握するのに役立ちます.

4. シンプルな方法

この戦略は,平均線とATR指標を主として使用し,比較的シンプルで,簡単に習得できる.これは,実盤操作の難しさを軽減する.

5. 資金の効率的な利用

超トレンド戦略は中期トレンドを追跡し,単一のスライドポイントを制御し,全体的な資金利用効率が高い.

リスク分析

超トレンド戦略にはいくつかの潜在的リスクがあります.

1. 波動的なトレンドの機会コストが高い

スーパートレンド戦略は中長期のトレンドを追跡することに重点を置くため,波動的な市場ではコストが高く,空白の機会の一部を逃す可能性があります.

2. パラメータ最適化による影響

ATR周期とATR倍数の選択は,取引戦略の効果に大きな影響を与える.パラメータを正しく設定しない場合,取引信号の効果を割引する.

3. ある程度の遅れがある

超トレンドチャネル計算には一定の遅延があり,それが信号の発生に遅延する可能性がある.これは,この戦略が解決する必要がある主な問題である.

4. 厳格な防犯管理が必要

ストップ・ポジションが大きすぎるとか,風制御回避が不完全であれば,極端な状況では大きな損失をもたらす可能性がある.したがって,ストップ・ストップ戦略を厳格に実行しなければならないので,安定した利益を得る.

最適化の方向

このスーパートレンド戦略は,次のようにさらに最適化できる:

1. 複数のATRサイクルを組み合わせる

例えば,10日,20日などの複数のATR周期を組み合わせて,組合せATR指標を形成することができる.これにより指標の感度が向上し,滞り問題を改善することができる.

2. ストップ・ロズ・ストラテジー・モジュールを追加

さらに,トリプルストップ,振動ストップ,順次ストップなどの戦略モジュールを追加することで,ストップコントロールをさらに強化し,損失のリスクを軽減することができます.

3. パラメータ設定を最適化する

ATR周期,ATR倍数などのパラメータ設定を最適化して,最適のパラメータ組み合わせを探し,戦略的収益をさらに向上させることができる.さらに,パラメータは,異なる品種と市場状況に応じて適切な値を選択して,動的に最適化することもできる.

4. 統合された機械学習モデル

最後に,機械学習モデルを統合して,トレンド判断とシグナル生成の自動化を試すこともできます.これは主観的な要因の干渉を軽減し,戦略システムの安定性をさらに向上させる可能性があります.

要約する

超トレンド取引戦略は,均線指標とATR指標を総合的に使用して,中期トレンドを判断し,トレンドの逆転点で取引信号を生じ,自動ストップロスを実現する.この戦略は,大きなトレンドを捕捉すると同時に,逆転の機会の一部をタイムリーに捕捉することもできます.その優位性は,中期トレンドの追跡,トレンドの逆転の識別,およびストップロスの制御の3つの側面に大きく表れています.

しかし,この戦略にはいくつかの欠陥があります. 主に,震動の状況の把握不足と遅れの問題です. これは,ATRサイクルを組み合わせ,止損モジュール,パラメータ最適化,機械学習の導入などの方法などから開始して最適化する必要があります. これは,間違いなく,このスーパートレンド戦略の安定性と金利をさらに強化することができます.

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

//@version=3
strategy("Supertrend V1.0 - Buy or Sell Signal",overlay=true)
Factor=input(3, minval=1,maxval = 100)
Pd=input(7, minval=1,maxval = 100)
//Calculating ATR
atrLength = input(title="ATR Length:",  defval=14, minval=1)
Stop_Loss_Factor = input(1.5, minval=0,step=0.01)
factor_profit = input(1.0, minval=0,step=0.01)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 10, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2016, title = "From Year", minval = 2009)
ToMonth   = input(defval = 4, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 10, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2039, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"


// Calculate ATR
atrValue=atr(atrLength)
decimals = abs(log(syminfo.mintick) / log(10)) 
Atr = atrValue
if(decimals == 5)
    Atr := atrValue * 10000
if(decimals == 4)
    Atr := atrValue * 1000
if(decimals == 3)
    Atr := atrValue * 100
if(decimals == 2)
    Atr := atrValue * 10


//VJ2 Supertrend

Up=hl2-(Factor*atr(Pd))
Dn=hl2+(Factor*atr(Pd))

TrendUp = 0.0
TrendUp:=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown = 0.0
TrendDown:=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn

Trend = 0.0
Trend := close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
Tsl = 0.0
Tsl := Trend==1? TrendUp: TrendDown

linecolor = Trend == 1 ? green : red

plot(Tsl, color = linecolor , style = line , linewidth = 2,title = "SuperTrend")

plotshape(cross(close,Tsl) and close>Tsl , "Up Arrow", shape.triangleup,location.belowbar,green,0,0)
plotshape(cross(Tsl,close) and close<Tsl , "Down Arrow", shape.triangledown , location.abovebar, red,0,0)
//plot(Trend==1 and Trend[1]==-1,color = linecolor, style = circles, linewidth = 3,title="Trend")

plotarrow(Trend == 1 and Trend[1] == -1 ? Trend : na, title="Up Entry Arrow", colorup=lime, maxheight=60, minheight=50, transp=0)
plotarrow(Trend == -1 and Trend[1] == 1 ? Trend : na, title="Down Entry Arrow", colordown=red, maxheight=60, minheight=50, transp=0)




//Strategy 
Trend_buy = Trend == 1 
Trend_buy_prev = Trend[1] == -1
algo_buy_pre = Trend_buy and Trend_buy_prev
algo_buy = algo_buy_pre == 1 ? 1 : na
Trend_sell= Trend == -1 
Trend_sell_prev = Trend[1] == 1
algo_sell_pre = Trend_sell and Trend_sell_prev
algo_sell = algo_sell_pre == 1 ? 1:na

strategy.entry("Long1", strategy.long, when= window() and algo_buy==1)

strategy.entry("Short1", strategy.short, when=window() and algo_sell==1)

bought = strategy.position_size > strategy.position_size 
sold = strategy.position_size < strategy.position_size 

longStop = Stop_Loss_Factor * valuewhen(bought, Atr, 0) 
shortStop = Stop_Loss_Factor * valuewhen(sold, Atr, 0) 
longProfit = factor_profit * longStop 
shortProfit = factor_profit * shortStop 


if(decimals == 5) 
    longStop := longStop *100000 
    longProfit := longProfit *100000 
if(decimals == 4) 
    longStop := longStop * 10000 
    longProfit := longProfit * 10000 
if(decimals == 3) 
    longStop := longStop * 1000 
    longProfit := longProfit * 1000 
if(decimals == 2) 
    longStop := longStop * 100 
    longProfit := longProfit *100 
if(decimals == 5) 
    shortStop := shortStop * 100000 
    shortProfit := shortProfit * 100000 
if(decimals == 4) 
    shortStop := shortStop * 10000 
    shortProfit := shortProfit * 10000 
if(decimals == 3) 
    shortStop := shortStop * 1000 
    shortProfit := shortProfit * 1000 
if(decimals == 2) 
    shortStop := shortStop * 100 
    shortProfit := shortProfit * 100 

strategy.exit("Exit Long", from_entry = "Long1", loss =longStop, profit = longProfit) 
strategy.exit("Exit Short", from_entry = "Short1", loss =shortStop, profit = shortProfit)