双動平均追跡ストップ損失戦略

作者: リン・ハーンチャオチャン, 日付: 2023-11-16 17:18:59
タグ:

img

概要

この戦略は,ダブル・ムービング・平均値を通じてロング・ショート・シグナルを生成し,ストップ・ロスを追跡することを実装する. 基本的なアイデアは,ムービング・平均値でトレンド方向を決定し,トレンドに沿ってロング・ショート・ロングをしたり,ストップ・ロスを追跡するためにストップ・ロスを計算するためにATRを使用することです.

戦略の論理

この戦略は,ソース価格として hl2 を使用し,特定の期間の ATR をストップ損失範囲として計算する.上位および下位帯は,ATR を一定因数で掛け算した値に基づいて計算される.価格が上位帯を超えると,ロングに行くための買い信号が生成される.価格が下位帯を下回ると,ショートに行くための販売信号が生成される.

ポジションを開いた後,ストップロスはATRの変化に基づいてリアルタイムで調整され,ストップロスを追跡する.特に,ロングした後,下帯はストップロスを追跡するために最新の低値に基づいて徐々に上昇する.ショートした後,上帯はストップロスを追跡するために最新の高値に基づいて徐々に低下する.

この戦略は,動向指数の動向指数を完全に利用し,トレンド方向を決定し,ATRに基づくストップロスの追跡メカニズムを組み込み,取引方向性とリスク管理を保証します.

利点

この戦略の最大の利点はリスク管理にあります.従来の移動平均戦略は方向判断のみを考慮し,簡単に口座を爆破することができます.ストップロスを追跡するためのATRを組み込むことで,この戦略は市場の変動に基づいてストップロスを動的に調整して取引リスクを効果的に制御することができます.

さらに,この戦略は二方向取引を組み合わせます.単方向戦略と比較すると,トレンドが逆転するとポジションの方向性を迅速に調整することができ,一つの方向に閉じ込められることを避け,戦略の収益性を向上させます.

リスク

この戦略の主なリスクは,ATR期間のパラメータ設定と倍数から生じる.ATR期間の短すぎたり倍数が大きすぎたりすると,ストップ損失範囲はリスクを効果的に制御するには小さすぎる.ATR期間の長すぎたり倍数が小さすぎたりすると,ストップ損失は利益を得るためにあまりにも緩い.また,価格が移動平均を突破すると偽のブレイクアウトのリスクがある.

リスクは,停止損失と利益目標のバランスをとるためにATR期間と倍数値を最適化し,偽ブレイクをフィルタリングし,信号品質を改善するために他の指標を組み込むことで管理できます.

増進 の 機会

この戦略は次の側面から強化できます.

  1. 最適なパラメータ組み合わせを見つけるために移動平均期を最適化します

  2. MACD,KDJなどの他の指標を追加してシグナルをフィルタリングして質を改善します

  3. 固定分数,マルティンゲールなどのポジションサイズを組み込み 収益性を向上させる

  4. 研究パラメータ 最適化のための様々な製品間の違い

  5. パラメータトレーニングと最適化のために 遺伝子アルゴリズムのような機械学習を適用します

結論

この戦略は,トレンド判断とリスク管理を完全に考慮し,引き下げを低減しながら利益を追求する.パラメータ最適化とポートフォリオ方法によるさらなる強化は戦略の収益性を向上させるのに役立ちます.要約すると,これは明確な論理と容易な実装を持つ堅牢で安定した定量的な取引戦略です.


/*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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


//@version=4
strategy("Trenbolone Strategy", overlay = true)
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : 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)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 999)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 999)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)       
window()  => time >= start and time <= finish ? true : false
longCondition = buySignal
if (longCondition)
    strategy.entry("BUY", strategy.long, when = window())
shortCondition = sellSignal
if (shortCondition)
    strategy.entry("SELL", strategy.short, when = window())
buy1 = barssince(buySignal)
sell1 = barssince(sellSignal)
color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na
barcolor(barcoloring ? color1 : na)

もっと