マッキンリー移動平均取引戦略

作者: リン・ハーンチャオチャン, 日時: 2023-11-14 15:48:46
タグ:

img

概要

この戦略は,マギンレー動的移動平均指標に基づいている.マギンレーMA指標は,価格動向をよりよく追跡できる移動平均値の改良版である.この戦略は,マギンレーMA指標によって生成された信号を,MAsの価格ブレイクと組み合わせて,利益のための取引規則を確立するために利用する.

戦略の論理

この戦略は主に21期EMAと42期EMAという2つの移動平均値を使用する.より短いMAがより長いMAを超えると,それは購入信号とみなされる.より短いMAがより長いMAを下回ると,それは販売信号とみなされる.

さらに,この戦略は,価格がマギンリーダイナミックMAよりも高くなり,より短いMAよりも低くなり,購入信号を生成することを要求する.販売信号では,価格がマギンリーMAよりも低くなり,より短いMAよりも低くなり,ブレイクする必要があります.

特に,購入信号は,以下のように発生します:短期間MAが長期間MAを超越し,マッキンリーMAが接近し,短期間MAが接近し,低価格MAが接近し,短期間MAが接近し,低価格MAが接近し,低価格MAが接近し,低価格MAが接近し,低価格MAが接近し.

マッキンリーのMAは,以下のように計算される: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Period * (Close / MDIt-1) ^4, 1).この式では,MDItは現在の値であり,MDIt-1は以前の値であり,Closeは閉値であり,kはスムージング定数であり,Periodは計算期間である.この式により,MAはリアルタイムで価格変化を追跡することができます.

利点

  1. McGinley MAは,伝統的なMAの遅れの問題を改善し,トレンドの変化を迅速に把握することができます.

  2. 信号を生成するために二重MAsを使用することで 誤ったブレイクを効果的にフィルターすることができます.

  3. マッキンリー・MAより高い/低い価格を追加することで,レンジ・バインド市場での過剰な取引が回避されます.

  4. EMAを使用すると,MAは最近の価格変動により敏感になります.

リスク

  1. Whipsawsは横向市場で誤った信号を生成し,損失を引き起こす可能性があります.パラメータはフィルター信号に調整できます.

  2. ギャップが開く場合 間に合う入場ができません 入場規則は緩和されるかもしれません

  3. パラメータの調整が不十分である場合,戦略のパフォーマンスに影響を与えます. パラメータを最適化する必要があります.

  4. 長期保持期間にはシステムリスクがあります.ストップロスを使用することを検討してください.

改良

  1. 最適な組み合わせを見つけるために異なるMA長さをテストする.

  2. KD,MACDなどの他の指標を追加して 入口/出口タイミングを改善します

  3. 異なる製品と市場に基づいて k 値を調整して McGinley MA 計算を最適化します.

  4. ダイナミックなポジションサイズ化とリスク管理のための波動性測定を組み込む.

  5. 損失を制御するためにストップ・ロスを設定します.トライリング・ストップは,利益をロックするためにテストすることもできます.

結論

この戦略は,トレンドを効果的にフォローし,トレンドが逆転するとポジションを切り替えるために,マッキンリーMAの高速追跡能力と価格ブレイクシグナルを組み合わせて利用する.従来のダブルMA戦略と比較して,トレンドの変化をより早く捉えることができる.しかし,リスクを制御するためにパラメータの最適化と調整を必要とするリスクがあります.


/*backtest
start: 2022-11-07 00:00:00
end: 2023-11-13 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/
// © LucasZancheta

//@version=4
strategy(shorttitle="Maguila", title="McGinley Dynamic Indicator", overlay=true)

//Médias móveis
MA1Period=input(21, title="MA1")
MA2Period=input(42, title="MA2")

MA1 = ema(close, MA1Period)
MA2 = ema(close, MA2Period)

aboveAverage = MA1 >= MA2
hunderAverage = MA2 >= MA1

//Período do backtest
startDate = input(title="Start Date", type=input.integer, defval=28, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=5, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer, defval=28, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer, defval=5, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer, defval=2030, minval=1800, maxval=2100)

//Verifica se o candle está dentro do período do backtest
inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))

//Número de periodos da média móvel
period  = input(title="Períodos", type=input.integer, defval=20)
//Constante K (0.6)
k = input(title="Constante K", type=input.float, defval=0.6)
//Preço de fechamento 
closePrice = input(title="Preço", type=input.source, defval=close)

mdi = 0.0

//Fórmula de McGinley
mdi := na(mdi[1]) ? closePrice : mdi[1] + (closePrice - mdi[1]) / max((k * period * pow(closePrice / mdi[1], 4)), 1)

//Regra de coloração 
mdiColor = closePrice > mdi ? color.green : closePrice < mdi ? color.red : color.black

//Inserindo as informações no gráfico    
plot(MA1, color=color.blue, linewidth=2)
plot(MA2, color=color.purple, linewidth=2)

barcolor(mdiColor)

//Estratégia
buySignal = aboveAverage and closePrice > mdi and crossunder(low, MA1) and close > MA1  
buyLoss = closePrice < mdi and close < MA1 and close < MA2

if (inDateRange)
    strategy.entry("Compra", strategy.long, qty=1, when= buySignal)
    strategy.exit("Gain da compra", "Compra", qty=1, profit=20)
    strategy.close("Compra", qty=1, when= buyLoss, comment="Loss na operação")

sellSignal = hunderAverage and closePrice < mdi and crossover(high, MA1) and close < MA1
sellLoss = closePrice > mdi and close > MA1 and close > MA2

if (inDateRange)
    strategy.entry("Venda", strategy.short, qty=1, when= sellSignal)
    strategy.exit("Gain da venda", "Venda", qty=1, profit=20)
    strategy.close("Venda", qty=1, when= sellLoss, comment="Loss na operação")

if (not inDateRange)
    strategy.close_all()




もっと