
この戦略は,マッキン非動的平均線指数に基づいた取引戦略である.マッキン非動的平均線指数は,改善版の移動平均指標であり,市場動向の変化をよりよく捉える.この戦略は,マッキン非動的平均線指数のシグナルを利用し,価格が平均線を突破するシグナルと組み合わせて,購入と販売のルールを制定し,利益の目的を達成する.
この戦略は,主に2つの平均線,すなわち21日指数移動平均線と42日指数移動平均線を使用する.短期平均線の上を長期平均線に突破すると,買入シグナルとみなされ,短期平均線下を長期平均線に突破すると,売出シグナルとみなされる.
さらに,この戦略は,価格がマッキンフィー非動平均線より高く,価格が短期平均線を突破する条件を満たす必要があり,買いのシグナルを生成する. 売るシグナルには,価格がマッキンフィー非平均線より低く,価格が短期平均線を下回る条件を満たす必要もある.
具体的には,買入シグナルのトリガー条件は,短平均線上での長平均線を貫通し,閉店価格がマッキン非平均線上よりも高く,閉店価格が短平均線を下に突破する.売出シグナルのトリガー条件は,短平均線下での長平均線を貫通し,閉店価格がマッキン非平均線上よりも低く,閉店価格が短平均線上を突破する.
マッキン非動平均線の計算式は:MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Period * (Close / MDIt-1) ^4, 1) 。その中で,MDItは現在の値を表し,MDIt-1は前日の値を表し,Closeは当日の閉盘価格を表し,kは平滑常数を表し,Periodは計算を表します。周期は,平均線が価格変化をリアルタイムで追跡できるようにします。
マッキンフィー平均線指標は,価格動向の変化をより早く捉えるために,従来の平均線の遅滞性を改善しました.
双均線と結合して取引信号を形成し,偽突破を効果的にフィルターすることができる.
マッキンフィー平均線より高い/低い価格の条件を追加し,震動区間の頻繁に取引を避ける.
インデックス移動平均線を用いて,平均線を最近の価格変化に敏感にします.
横盤の振動市場では,偽信号が生み出され,その結果,損失が発生する可能性がある。パラメータを適切に調整し,信号をフィルターすることができる。
大規模な空飛ぶ突破は,倉庫の建設を間に合わない可能性をもたらし,適切な入場条件の緩和が求められます.
パラメータの設定が不適切であることも,戦略の効果に影響し,パラメータを最適化テストを行うべきである.
長期保有によるシステムリスクに注意し,ストップポイントを設定できます.
異なる長さの平均線パラメータをテストして,より適切な組み合わせを見つけることができます.
KD,MACDなどの他の技術指標を追加して,購入・販売のポイント選択を最適化できます.
マッキン非平均線の計算を最適化するために,異なる品種,市場に応じてパラメータkの値を調整できます.
波動率指標と組み合わせて,ダイナミックなポジションサイジングを実現し,単一のリスクを制御する.
損失のリスクを制御するためにストップポイントを設定することも,利益をロックするためにストップを移動することもできます.
この戦略は,マッキン非均線指標の迅速な追跡能力を利用し,価格が均線を突破して形成された取引信号と組み合わせて,トレンドを効果的に追跡し,トレンドが転じるときに適時にポジションを切り替えることができます.従来の双均線戦略と比較して,この戦略は,価格トレンドの変化をより迅速に捉えることができます.しかし,この戦略には一定のリスクもあります.
/*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()