双動平均 交差 持続 上向き 戦略

作者: リン・ハーンチャオチャン, 日付: 2023-11-13 10:47:48
タグ:

img

概要

これは,移動平均クロスオーバーパターンと持続的なアップトレンドを活用した取引戦略である. 速いMAがスローMAを超えると,ゴールデンクロスオーバー信号が生成される. クロスオーバー後もアップトレンドが持続すると,ロングポジションが開く. 価格がストップ・ロストまたは利益のレベルに達すると,ストップ・ロストまたは利益を取るためにポジションを閉める.

戦略の論理

この戦略は主にエントリー信号の移動平均クロスオーバーに基づいています.特に,速いMA (MA1) と遅いMA (MA2) が定義されています.MA1がMA2を超えると,それはロングに行く信号です.

短期クロスオーバーからの誤った信号を避けるため,角値が追加されるため,MA2角が設定された値を超えるとのみ買い信号が発信される.これは,トレンドではない短期的なラリーをフィルタリングする.

ストップ・ロスは,急激な市場逆転の場合の損失を回避し,プロフィット・ロックを利益に設定する.入場価格から百分比範囲として設定される.

価格が上昇し,利益を得るとき,戦略は利益を得るためにロングを閉じる.また,上昇が強い場合,戦略は平均逆転のためのショートポジションを開く.

利点分析

これはシンプルで直感的なトレンドフォロー戦略です. 利点は以下の通りです.

  1. MAコンボは市場のノイズをフィルターし,トレンド方向にロックします
  2. 角の値が短時間振動によって誤導されるのを避ける
  3. 双方向取引は,範囲限定市場から利益を得ることを可能にする
  4. ストップ・ロスト・アンド・テイク・プロフィート・コントロールリスク

リスク分析

リスクはいくつかあります.

  1. MA は遅延があり,ターニングポイントを逃すことがあります.
  2. ストップ・ロスは保証されません 急速な市場でギャップすることができます
  3. 双面取引はリスクを倍にする ショートエントリーのタイミングが鍵
  4. MA 期間のようなパラメータの調節が不十分である場合,結果は影響します.

改善 の 分野

戦略をさらに最適化する方法:

  1. MACD,ボリンジャーなどのトレンドフィルターを追加して正確性を向上します
  2. 機械学習を使用して MA 期間を動的に最適化します
  3. ストップ・ロスの設定を最適化し,トレリング・ストップなどで利益を得ます
  4. 損失を制限するためにポジションサイズを追加する
  5. ADX と サイズ 平均 リバース ポジション の 傾向 強度 を 計測 する

結論

ストロゲーシストは,戦略をフォローするシンプルで実践的なトレンドです.利点もありますがリスクもあります.パラメータ調節,最適な指標,ストップ損失設定などのさらなる改良により改善できます.しかし,戦略はシステムリスクを完全に排除しません.リスク管理は慎重な取引の鍵です.


/*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 markjames12210@gmail.com
//@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")

もっと