移動平均値とトレーリングストップによるチャネルブレークアウト戦略の傾向

作者: リン・ハーンチャオチャン開催日:2024年1月15日12時25分26秒
タグ:

img

概要

これは価格チャネルをベースとしたブレークアウト戦略であり,移動平均指標とエントリーと出口のためのトライリングストップ/テイク・プロフィートと組み合わせます.価格チャネルを構築するために高値/低値の移動平均を使用し,価格がチャネルを突破するとロング/ショートに入ります.リスクを制御するために固定ストップ損失またはトライリングストップを使用します.

戦略の論理

この戦略は,価格チャネルを形成するために高低価格の移動平均を計算する.具体的には,チャネルの上下帯をプロットするために高低価格の長さ10 SMAを計算する.価格が下帯から上部帯に突破すると,長引入する.価格が上部帯から下部帯に突破すると,短引入する.

ストラテジーは,出口のために固定ストップ損失またはトレーリングストップを使用する.トレーリングストップは2つのパラメータで構成される:固定テイク利益レベル,およびアクティベーションオフセット.価格がアクティベーションオフセットに達すると,テイク利益レベルが価格を追いかけるようになります.これはいくつかの空きスペースを維持しながら利益をロックすることができます.

この戦略はまた,時間範囲フィルターを組み合わせ,指定された歴史的時間枠内でバックテストを実行し,異なる市場段階でのパフォーマンスをテストします.

利点分析

この戦略は,価格チャネルとトレンドフォローをトレリングストップで利用し,中長期トレンド方向を把握することができる.単純な移動平均戦略と比較して,価格変動による非効率な取引を回避する.トレリングストップで,収益をロックするために動的にトレリング価格を追いかける.

全体的に見ると,この戦略は明確な論理,最小限の指標とパラメータ,バックテストが容易で,中長期トレンド取引に適しており,強いトレンドから利益を得ることができます.

リスク分析

この戦略は,変動する,不安定な市場において,利益を維持できない状態で簡単に停止する傾向があります.また,極端な動きの間,価格は大きな損失につながる攻撃的なストップ損失を突破する可能性があります.

パラメータ調整はかなり主観的で,異なる市場段階に合わせて調整が必要である.固定取利益とアクティベーションオフセットは,変動する市場変動に適応できない.

増進 の 機会

ボランス,ボリンジャー帯などの他の指標は,入口信号をフィルタリングし,罠を避けるために組み込まれる.またはATRまたは価格変動に基づいて動的ストップを使用することができます.

エグジットルールは,トレーリングストップまたはチェンデリア・エグジットにアップグレードすることができる.価格がチャネルに戻ると,部分的な利益目標が考慮される.エントリーフィルターとエグジットルールを最適化することで,戦略の安定性が大幅に向上する.

結論

概要すると,これは価格チャネル,トレンドフォロー,ストップ損失/利益引き取り管理に基づく定量戦略である.明確な論理流量,シンプルなパラメータ構造,理解しやすくバックテストに適している.アルゴリズムの取引コンセプトを学ぶのに適している.戦略は,安定性と収益性を向上させるためにさまざまな側面で強化することができる.主なアイデアはトレンド方向を把握し,ストップ損失と利益引き取りを通じてリスクを管理することである.それは異なるタイムフレームでさまざまな製品に適用することができる.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-21 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
//  This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. 
//  It is based on moving averages of the highs and lows. 
//  Similar channel indicators can be found, whereas 
//  this one implements the persistency inside the channel, which is rather tricky.
//  The green line is the base line which decides entries and exits, possibly with trailing stops.
//  With respect to the original version, here one can play with different moving averages.
//  The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019

lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap

hma(sig, n) => // Hull moving average definition
    wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))

mcg(sig,length) => // Mc Ginley MA definition
    mg = 0.0
    mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))

tenkan(sig,len) =>
    0.5*(highest(sig,len)+lowest(sig,len))

ma(t,sig,len) =>
    sss=na
    if t =="SMA"
        sss := sma(sig,len)
    if t == "EMA"
        sss := ema(sig,len)
    if t == "HMA"
        sss := hma(sig,len)
    if t == "McG" // Mc Ginley
        sss := mcg(sig,len)
    if t == "Tenkan"
        sss := tenkan(sig,len)
    if t == "WMA"
        sss := wma(sig,len)
    sss

base(mah, mal) =>
    bbb = na
    inChannel = close<mah and close>mal
    belowChannel = close<mah and close<mal
    bbb := inChannel? bbb[1]: belowChannel? -1: 1
    uuu = bbb==1? mal: mah
    ddd = bbb==1? mah: mal
    [uuu, ddd]

maH = ma(maType, high, lb)
maL = ma(maType, low, lb)

[up, dn] = base(maH,maL)

plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)

long = crossover(dn,up)
short = crossover(up,dn)

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)

もっと