指数移動平均とMACD指標に基づく定量取引戦略


作成日: 2023-12-08 16:58:01 最終変更日: 2023-12-08 17:04:03
コピー: 0 クリック数: 706
1
フォロー
1621
フォロワー

指数移動平均とMACD指標に基づく定量取引戦略

概要

この戦略は,インデックス移動平均とMACD指標の突破シグナルを組み合わせ,長期と短期の2つのポジション周期を設定し,トレンド追跡と反転取引によって利益を得ます.

戦略原則

この戦略は以下の原則に基づいています.

  1. 200日指数移動平均を計算し,大トレンドの方向を判断する。 closes 価格は,その平均より高いのは看板であり,低いのは看板である。

  2. 最高価格,最低価格,閉盘価格に基づく平均価格指数移動平均を描き,その平均値と最高価格および最低価格の差値を計算し,MACD柱状図を構成する.

  3. MACD柱状図の9日移動平均を計算し,MACD信号線を構成する.

  4. MACDは,下から上へ突破する信号線で買信信号を生じ,上から下へ突破する信号線で売信信号を生じます.

  5. 長期トレンドの方向と短期トレンドの方向を組み合わせて判断する.

戦略的優位性

この戦略は,トレンドと逆転取引を組み合わせて,より長い周期のトレンドを追跡し,短線での逆転の機会を捉え,異なる市場状況に柔軟に対応します.

具体的には以下の通りです.

  1. 200日移動平均を使って主要トレンドの方向を判断し,逆転操作を避ける.

  2. MACD指数は,短期的な価格変動に敏感であり,より効果的な反転の機会を捉えることができる.

  3. 異なるパラメータ設定のMACD組み合わせにより,複数のタイムフレームの取引シグナルを実現できます.

  4. ストップ・ロスの戦略と組み合わせれば,単一損失を効果的にコントロールできます.

戦略リスク

この戦略には以下のリスクがあります.

  1. 長期短期指標が取引信号を発する際には,一定の時間差がある可能性があり,大傾向を総合的に判断する必要がある.

  2. MACDは反転指標として,急激な状況が発生すると,その指標の解釈力が低下する.

  3. 止損ポイントの設定が不適切で,早すぎる止損または止損幅が大きすぎる可能性があります.

  4. 突破信号が頻度が高いと判断され,さらに偽信号が生成される可能性がある.

対応方法:

  1. MACDパラメータを最適化し,指標の感度調整する.

  2. MACD信号を盲目的に追跡することを避けるために,他の指標の判断段階を組み合わせます.

  3. テストし,ストップ・ローズ戦略のパラメータを最適化する.

  4. フィルタリング条件を増やして,偽信号を多く発生させないようにする.

戦略最適化の方向性

この戦略は以下の方向から最適化できます.

  1. 移動平均とMACDのパラメータを最適化して,より効果的な取引信号を得る.

  2. 戦略の有効性を高めるために,Volume,RSIなどの他の指標を追加する.

  3. 各取引に対して固定ロットの代わりにポジションサイジング戦略を設定する

  4. such as profit target, trailing stops etc. 単にストップロストではなく,より高度な退出ルールを追加する.

  5. より複雑な手数料設定でバックテストし,実際の取引環境をより良くシミュレートする.

  6. Walk forward analysis, robustness test among multiple products to enhance reliability. ウォークフォワード分析, 信頼性を高めるために複数の製品間の頑丈性テスト.

要約する

この戦略は,トレンドと反転取引の両方を兼ね備えている.重要なことは,指標パラメータの設定と大きなトレンドの理解の正確さである.パラメータ設定を継続的に最適化し,波条件を増加させるなどの手段によって,戦略は,市場情勢の信号判断をより正確にし,利益をより安定させることができる.全体的に,この戦略は,統合度が高く,適用の見通しは良好である.

ストラテジーソースコード
/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Strategia EMA + Impulse MACD", shorttitle="EMA+IMACD", overlay=true)

// Impostazioni
ema_length = input(200, title="Periodo EMA a 200", type=input.integer)
lengthMA = input(34, title="Periodo EMA", type=input.integer)
lengthSignal = input(9, title="Periodo Signal", type=input.integer)
lengthImpulseMACD = input(12, title="Periodo Impulse MACD", type=input.integer)
lengthImpulseMACDSignal = input(9, title="Periodo Impulse MACD Signal", type=input.integer)
stopLossPeriod = input(20, title="Periodo Stop Loss", type=input.integer)

var float ema200 = na
if bar_index >= ema_length
    ema200 := ema(close, ema_length)

// Impulse MACD
var float hi = na
var float lo = na
var float mi = na
var float impulseMACD = na
var float impulseMACDSignal = na

calc_smma(src, len) =>
    var float smma = na
    if na(smma)
        smma := sma(src, len)
    else
        smma := (smma[1] * (len - 1) + src) / len
    smma

calc_zlema(src, length) =>
    ema1 = ema(src, length)
    ema2 = ema(ema1, length)
    d = ema1 - ema2
    ema1 + d

if bar_index >= lengthMA
    src = hlc3
    hi := calc_smma(high, lengthMA)
    lo := calc_smma(low, lengthMA)
    mi := calc_zlema(src, lengthMA)

    impulseMACD := (mi > hi) ? (mi - hi) : (mi < lo) ? (mi - lo) : 0
    impulseMACDSignal := sma(impulseMACD, lengthSignal)

// Calcolo dello stop loss
var float stopLossLong = na
var float stopLossShort = na

stopLossLong := lowest(low, stopLossPeriod)
stopLossShort := highest(high, stopLossPeriod)

// Calcolo del take profit
var float takeProfitLong = na
var float takeProfitShort = na

if not na(stopLossLong)
    takeProfitLong := close + (close - stopLossLong) * 1.5
if not na(stopLossShort)
    takeProfitShort := close - (stopLossShort - close) * 1.5

// Condizioni per aprire una posizione long
longCondition = not na(ema200) and not na(impulseMACD) and not na(impulseMACDSignal) and close > ema200 and impulseMACD < 0 and impulseMACDSignal < 0 and crossover(impulseMACD, impulseMACDSignal)

// Condizioni per aprire una posizione short
shortCondition = not na(ema200) and not na(impulseMACD) and not na(impulseMACDSignal) and close < ema200 and impulseMACD > 0 and impulseMACDSignal > 0 and crossunder(impulseMACD, impulseMACDSignal)

// Disegna l'EMA 200 sul grafico
plot(ema200, color=color.blue, title="EMA 200")

// Imposta lo stop loss e il take profit
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)
strategy.exit("Take Profit/Stop Loss Long", from_entry="Long", stop=stopLossLong, limit=takeProfitLong)
strategy.exit("Take Profit/Stop Loss Short", from_entry="Short", stop=stopLossShort, limit=takeProfitShort)

// Impulse MACD
plot(0, color=color.gray, linewidth=1, title="MidLine")
plot(impulseMACD, color=color.red, linewidth=2, title="ImpulseMACD", style=plot.style_histogram)
plot(impulseMACDSignal, color=color.blue, linewidth=2, title="ImpulseMACDSignal", style=plot.style_histogram)

// Disegna le operazioni long e short sul grafico
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.triangleup, title="Long Entry")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.triangledown, title="Short Entry")