双方向MAトレーリングストップロス戦略


作成日: 2023-11-16 17:18:59 最終変更日: 2023-11-16 17:18:59
コピー: 1 クリック数: 590
1
フォロー
1617
フォロワー

双方向MAトレーリングストップロス戦略

概要

この戦略は,双方向移動平均を使って多空信号を構築し,ストロップを追跡する.その核心思想は,移動平均を使用してトレンドの方向を判断し,トレンドの方向で多空を行うこと,そしてATRを使用してストロップを計算し,ストロップを追跡するということである.

戦略原則

この策略はhl2を源価格として使用し,一定の周期の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)