チャネルブレイクアウト反転取引戦略


作成日: 2024-02-19 15:12:44 最終変更日: 2024-02-19 15:12:44
コピー: 0 クリック数: 603
1
フォロー
1617
フォロワー

チャネルブレイクアウト反転取引戦略

概要

チャネルブレイク反転トレード戦略は,価格チャネルを追跡する移動ストップ・ロスの反転トレード戦略である.これは,加重移動平均の方法を使用して価格チャネルを計算し,価格がチャネルを突破すると多頭または空頭ポジションを確立する.

戦略原則

この戦略は,まず,ワイルダー平均の実際の範囲 (((ATR) を用いて価格変動率を計算する.そして,ATR値に基づいて平均範囲常数 (((ARC) を計算する.ARCは価格チャネルの半幅である.次に,チャネルの上線と下線,すなわち,ストップ・ストラップ・ポイント (SARポイント) を計算する.価格が上線を突破すると空を空にし,下線を突破すると多めにする.

具体的には,まず,最近のN根K線のATRを計算する. そして,ATRを係数で掛けることでARCが得られる.ARCを係数で掛けることで,通路の幅を制御できる.ARCをN根K線の収縮価格の最高点に足して通路の上軌道を得る,つまり高いSAR.ARCを減算して収縮価格の最低点を得て通路の下軌道を得る,つまり低いSAR.価格の収縮が上軌道に突入した場合,空を空にする.収縮が下軌道に突入した場合,多めにする.

戦略的優位性

  1. 価格変動を計算する自己適応チャネルを使用して,市場の変化を追跡できます.
  2. 逆転市場に対応する逆転取引
  3. モバイルストップ・ストップ・ロスは,利益をロックし,リスクをコントロールします.

戦略リスク

  1. 逆転取引は簡単に操作され,パラメータを適切に調整する必要があります.
  2. 波動性のある市場では,取引を閉じやすい
  3. パラメータを間違えれば,取引が頻発する.

解決策は

  1. ATRサイクルとARC係数を最適化して通路幅を合理化
  2. トレンド指標のフィルタリングとタイムラインの組み合わせ
  3. ATRサイクルを拡大し,取引頻度を減らす

戦略最適化の方向性

  1. ATRサイクルとARC係数を最適化する
  2. ポジション開設条件の追加,例えばMACD指数との組み合わせ
  3. ストップ・ロスの策略を増やす

要約する

チャンネルの突破逆転取引戦略は,チャネルを利用して価格変化を追跡し,波動が加剧したときに逆転ポジションを構築し,移動ストップストロップに適応するように設定する.この戦略は,逆転が主な整合市場に適用され,逆転点を正確に判断した前提で,良い投資リターンを得ることができます.しかし,ストップストロップの過度に緩和やパラメータ最適化の問題を防止するために注意が必要です.

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

//@version=3
//@author=LucF

// Volatility System [LucF]
// v1.0, 2019.04.14

// The Volatility System was created by Welles Wilder.
// It first appeared in his seminal masterpiece "New Concepts in Technical Trading Systems" (1978).
// He describes it on pp.23-26, in the chapter discussing the first presentation ever of the "Volatility Index",
// which later became known as ATR.
// Performance of the strategy usually increases with the time frame.
// Tuning of ATR length and, especially, the ARC factor, is key.

// This code runs as a strategy, which cannot generate alerts.
// If you want to use the alerts it must be converted to an indicator.
// To do so:
//      1. Swap the following 2 lines by commenting the first and uncommenting the second.
//      2. Comment out the last 4 lines containing the strategy() calls.
//      3. Save.
strategy(title="Volatility System by Wilder [LucF]", shorttitle="Volatility System [Strat]", overlay=true, precision=8, pyramiding=0, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// study("Volatility System by Wilder [LucF]", shorttitle="Volatility System", precision=8, overlay=true)

// -------------- Colors
MyGreenRaw = color(#00FF00,0),      MyGreenMedium = color(#00FF00,50),  MyGreenDark = color(#00FF00,75),    MyGreenDarkDark = color(#00FF00,92)
MyRedRaw = color(#FF0000,0),        MyRedMedium = color(#FF0000,30),    MyRedDark = color(#FF0000,75),      MyRedDarkDark = color(#FF0000,90)

// -------------- Inputs
LongsOnly = input(false,"Longs only")
ShortsOnly = input(false,"Shorts only")
AtrLength = input(9, "ATR length", minval=2)
ArcFactor = input(1.8, "ARC factor", minval=0, type=float,step=0.1)
ShowSAR = input(false, "Show all SARs (Stop & Reverse)")
HideSAR = input(false, "Hide all SARs")
ShowTriggers = input(false, "Show Entry/Exit triggers")
ShowTradedBackground = input(false, "Show Traded Background")

FromYear  = input(defval = 2000,    title = "From Year", minval = 1900)
FromMonth = input(defval = 1,      title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1,       title = "From Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999,    title = "To Year", minval = 1900)
ToMonth   = input(defval = 1,       title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1,       title = "To Day", minval = 1, maxval = 31)

// -------------- Date range filtering
FromDate = timestamp(FromYear, FromMonth, FromDay, 00, 00)
ToDate = timestamp(ToYear, ToMonth, ToDay, 23, 59)
TradeDateIsAllowed() => true

// -------------- Calculate Stop & Reverse (SAR) points using Average Range Constant (ARC)
Arc   = atr(AtrLength)*ArcFactor
SarLo = highest(close, AtrLength)-Arc
SarHi = lowest(close, AtrLength)+Arc

// -------------- Entries/Exits
InLong = false
InShort = false
EnterLong = TradeDateIsAllowed() and not InLong[1] and crossover(close, SarHi[1])
EnterShort = TradeDateIsAllowed() and not InShort[1] and crossunder(close, SarLo[1])
InLong := (InLong[1] and not EnterShort[1]) or (EnterLong[1] and not ShortsOnly)
InShort := (InShort[1] and not EnterLong[1]) or (EnterShort[1] and not LongsOnly)

// -------------- Plots
// SAR points
plot( not HideSAR and ((InShort or EnterLong) or ShowSAR)? SarHi:na, color=MyRedMedium, style=circles, linewidth=2, title="SAR High")
plot( not HideSAR and ((InLong or EnterShort) or ShowSAR)? SarLo:na, color=MyGreenMedium, style=circles, linewidth=2, title="SAR Low")
// Entry/Exit markers
plotshape( ShowTriggers and not ShortsOnly and EnterLong, style=shape.triangleup, location=location.belowbar, color=MyGreenRaw, size=size.small, text="")
plotshape( ShowTriggers and not LongsOnly and EnterShort, style=shape.triangledown, location=location.abovebar, color=MyRedRaw, size=size.small, text="")
// Exits when printing only longs or shorts
plotshape( ShowTriggers and ShortsOnly and InShort[1] and EnterLong, style=shape.triangleup, location=location.belowbar, color=MyRedMedium, transp=70, size=size.small, text="")
plotshape( ShowTriggers and LongsOnly and InLong[1] and EnterShort, style=shape.triangledown, location=location.abovebar, color=MyGreenMedium, transp=70, size=size.small, text="")
// Background
bgcolor( color=ShowTradedBackground? InLong and not ShortsOnly?MyGreenDarkDark: InShort and not LongsOnly? MyRedDarkDark:na:na)

// ---------- Alerts
alertcondition( EnterLong or EnterShort, title="1. Reverse", message="Reverse")
alertcondition( EnterLong, title="2. Long", message="Long")
alertcondition( EnterShort, title="3. Short", message="Short")

// ---------- Strategy reversals
strategy.entry("Long", strategy.long, when=EnterLong and not ShortsOnly)
strategy.entry("Short", strategy.short, when=EnterShort  and not LongsOnly)
strategy.close("Short", when=EnterLong and ShortsOnly)
strategy.close("Long", when=EnterShort and LongsOnly)