移動平均ダブルクリックゴールデンクロス連続上昇戦略


作成日: 2023-11-13 10:47:48 最終変更日: 2023-11-13 10:47:48
コピー: 0 クリック数: 649
1
フォロー
1617
フォロワー

移動平均ダブルクリックゴールデンクロス連続上昇戦略

概要

これは,移動平均線金叉の形を利用して,トレンドラインが継続的に上向きに形成される配合の取引戦略である. 速い線が下方向から遅い線を突破すると,金叉信号が形成される. 金叉の後のトレンドが継続的に上向きであれば,この段階でポジションを開くことができます. 価格が止損線または止まり線に突入すると,止まりまたは止まりを選択することができます.

戦略原則

この戦略は,主に移動平均の金叉形状に基づいて,入場タイミングを判断する.具体的には,迅速な移動平均MA1と遅い移動平均MA2を定義する.MA1が下からMA2を突破すると,多額のシグナルである.

短期金叉による偽信号を避けるために,策略には角度値判断が加えられており,MA2の角度が設定された値より大きい場合にのみ買い信号が誘発される.これは,いくつかの非傾向的な短期上昇をフィルターすることができます.

ストップラインとストップストップラインを同時に設定する戦略.ストップラインは市場の突然の転換による損失を避けるために使用され,ストップストップは収益の出発をロックするために使用されます.具体的には入場価格の一定パーセントの範囲として設定されます.

価格上昇が止まり点に達すると,戦略は止まり場を退場する.同時に,本回上昇が強い場合は,戦略は再び空白反転操作を行う.

優位分析

これは比較的シンプルで直感的なトレンド追跡戦略で,以下の利点があります.

  1. 移動平均の組み合わせで市場のノイズをフィルターし,トレンドの方向を固定します.
  2. 角度の値は,短期的な振動に誤導されないようにします.
  3. 双方向操作で,震災時に利益を得られる
  4. ストップ・ストップを設定し,リスクを制御する

リスク分析

この戦略にはいくつかのリスクがあります.

  1. 移動平均は遅滞しており,価格転換点を逃している可能性があります.
  2. ストップオフがあるにもかかわらず,瞬く間に変化する市場では,ストップオフが破られる確率は存在する.
  3. 双方向取引のリスクが倍増し,売り場を誤って選択すると損失が及ぶ
  4. 移動平均周期の選択などのパラメータの設定が不適切で,戦略のパフォーマンスに影響を与える可能性があります.

最適化の方向

この戦略をさらに改善するには,以下の方法があります.

  1. MACD,ブリン帯などのトレンド判断指標を増やし,位置精度を向上させる
  2. 移動平均の周期パラメータを動的に最適化する機械学習などの方法
  3. ストップ・ストップの設定を最適化します.例えば,ストップ・トラッキングを使用します.
  4. 取引量管理を強化し,過度の損失を回避する
  5. 段指などの指標を組み合わせて,本回トレンドの強さを判断し,ポジション開設の強さを動的に調整する

要約する

全体的に見ると,これはシンプルで実用的トレンド追跡戦略である. 利点はあるが,リスクも注意する必要がある. 更にパラメータ最適化,指標優位化,ストップ・ストップの設定などにより改善することで,よりよい安定した収益を得ることができる. しかし,いかなる戦略も,市場のシステミックなリスクを完全に回避することはできません.

ストラテジーソースコード
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//written by [email protected]
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")