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

作者: リン・ハーンチャオチャン, 日付: 2023-12-01 16:40:27
タグ:

img

概要

スーパートレンド取引戦略は,平均真差 (ATR) と移動平均 (MA) をベースとしたトレンドフォロー戦略である.トレンドトラッキングとブレイクアウト取引の両方の利点を取り入れ,中間トレンド方向を特定し,トレンド変化に基づいて取引信号を生成する.

この戦略の背後にある主なアイデアは,価格がスーパートレンドチャネルを突破すると,トレンド逆転を示唆するロングまたはショートに行くことです.また,ストップロストと利益レベルを設定して,利益をロックし,リスクを制御します.

この 戦略 の 効果

スーパートレンド計算にはいくつかのステップがあります.

  1. ATRを計算します.ATRは,一定の期間の平均変動を反映します.
  2. 中間線は,最高高値と最低低値に基づいて計算します. 中間線は以下のように計算されます: (最高高値 + 最低低値) /2
  3. トレーダーによって設定されたATRとATR倍数に基づいて上下チャネルを計算する.上下チャネルは:ミッドライン+ (ATR × マルチプリ).下下チャネルは:ミッドライン - (ATR × マルチプリ) として計算する.
  4. 閉じる価格と上下チャネルを比較してトレンド方向を決定する.閉じる値が上下チャネルの上にある場合,トレンドは上昇する.閉じる値が下下チャネルの下にある場合,トレンドは低下する.
  5. チャネル上または下のブレイクアウトは逆取引信号を生成する.例えば,上チャネル上のブレイクアウトはロングエントリーをシグナルし,下チャネル下のブレイクアウトはショートエントリーをシグナルする.

この戦略の利点は,トレンドフォローとトレンド逆転のテクニックの両方を組み合わせることである.主要トレンドを特定し,同時に逆転機会を間に合うように把握することができる.さらに,ストップ・ロスト/テイク・プロフィートメカニズムはリスクを制御するのに役立ちます.

優位性

スーパートレンド戦略には以下の強みがあります

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

スーパートレンドチャネルは,ATRに基づいて計算され,中間価格変動範囲を効果的に反映しています.それは単純な移動平均値よりも中間トレンドをうまく追跡します.

2. 逆転 を 時間 に 把握 する

チャンネルからの価格ブレイクは迅速に取引信号を生成し,主要なトレンド逆転が間に合って捕らえられる.これは適切な再定位を可能にします.

3. ストップ 損失 を 持っ て 利益 を 取っ て ください

ストップ・ロスは,リスク制御による自動退出のために,既定のストップ・ロスを設定し,利益レベルを設定する.これは,過剰なストップ・ロスのリスクを大幅に軽減し,トレンドをより良く追跡することを可能にします.

4. 実行 する 簡単

この戦略は主にMAやATRのような基本的な指標を使用しています.これは,ライブ取引で理解し実行するのがかなり簡単です.

**5. 高度の資本効率 **

中間トレンドを追跡し,個々のスリップを制御することで,スーパートレンド戦略は,全体的に高い資本効率を提供します.

リスク分析

スーパートレンド戦略にはいくつかの潜在的な弱点もあります:

1. 市場における低業績

この戦略は,中期から長期のトレンド取引に焦点を当てています. レンジングまたは統合市場では,ショートトレードが欠落する機会コストが高く,業績が低下する傾向があります.

2. パラメータ最適化に敏感

ATR 期間と倍数値に選択された値は,戦略のパフォーマンスに比較的大きな影響を及ぼします.パラメータの適切な調整は,取引信号の有効性を損なう可能性があります.

3. 遅延 の 問題 が あり ます

超トレンドチャネル計算で遅延の問題が発生し,信号生成が間に合わない可能性があります.遅延問題を解決することが優先事項です.

4. 厳格なストップ損失管理が必要

極端な市場条件では,不適切なストップ損失の許容量や不十分なリスク管理が大きな損失につながる可能性があります. ストップ損失規則を厳格に遵守することは一貫した収益性にとって重要です.

改善 の 分野

このスーパートレンド戦略の最適化にはさらに余地があります.

1.複数のATR期間を組み合わせる

10日と20日などの異なる期間における ATR レディングを組み合わせることで 複合指標が作られ 感度や遅延問題を改善するのに役立ちます

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

トリプル・ストップ・ロース,ボラティリティ・ストップ・ロース,シーケンス・ストップ・ロースなどのより洗練されたストップ・ロースメカニズムを追加すれば,リスク管理と引き下げを強化できる.

3. パラメータ最適化

量的な方法によってATR期間の値,倍数値およびその他のインプットを最適化することで,戦略のパフォーマンスはさらに向上する.パラメータは,異なる製品と市場体制に基づいて動的に調整することもできます.

4. 機械学習モデルを統合する

最後に,機械学習モデルを統合することで,自動的なトレンド認識と信号生成が実現し,主観的な決定への依存を軽減し,システムの安定性を向上させることができます.

結論

スーパートレンド・トレード戦略は,MAおよびATR指標を使用して中間トレンド方向性を特定し,自動ストップ損失/テイク・プロフィート実装によるトレンド逆転の周りのトレードエントリーおよび出口信号を生成する.主要なトレンドを保持しながら,いくつかの逆転機会も把握する.主な利点は中間トレンド追跡,トレンド逆転の識別,ストップ損失/テイク・プロフィートによるリスク管理にある.

しかし,範囲限定市場獲得不足や遅れの問題についてもいくつかの欠陥がある.複合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) 


もっと