2つの移動平均のクロスオーバー MACD量的な戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-22 15時32分42秒
タグ:

img

概要

この戦略は,速い移動平均線と遅い移動平均線の違いを計算してMACDインジケーターを生成し,信号線とともに金融市場のトレンドとオーバーバイト/オーバーセールドエリアを判断する.価格が200日MA以上でゴールデンクロスを形成するときにMACDと信号ラインが長くなって,価格が200日MA以下でデッドクロスを形成するときに短くなってしまいます.これは典型的な二重移動平均クロスオーバーブレイクアウト戦略に属します.

戦略の論理

基本論理は,市場トレンド方向を決定するために,速いMAと遅いMAの違いから生成されたMACDインジケーターを使用し,オーバーバイト/オーバーセールレベルを判断するための信号線を使用しています.MACDと信号線が黄金十字を形成すると,それはロングシグナルです.デッドクロスを形成すると,それはショートシグナルです.一方,それは200日MAとの価格の関係を使用してシグナルをフィルタリングします.価格が200日MAを超えるときのロングシグナルと,価格が200日MA未満のときのショートシグナルのみを取り,強いトレンドの間にウィップソウを避けるため.

特定の計算方法は次のとおりです.

  1. MACD を得るために,Fast Moving Average (12日 EMA) を減算し,Slow Moving Average (26日 EMA) を減算します.
  2. 9日間のEMAが信号線になる
  3. MACDヒストグラムを得るためにMACDマイナス信号線

MACDがシグナルラインの上を横切ったとき,両方が0を下回っているとき,それはゴールデンクロスロングシグナルである.両者が0を下回っているとき,MACDがシグナルライン下を横切ったとき,それはデッドクロスショートシグナルである.一方,価格が200日MAを下回っているときのみ長引く,価格が200日MAを下回っているときのみ短引く.

利点

  1. 二重指標システムを使用することで,単一指標の限界を回避し,正確性を向上させる.
  2. 価格アクションとMAのダブルフィルターを組み合わせることで,強いトレンドの間,ヒップソーを避ける.
  3. 異なる市場環境に適応するための大きなパラメータ最適化空間
  4. 保守的なパラメータ設定は,より少ない,しかしより高い品質の信号につながります
  5. シンプルで簡単に実行できる戦略論理

リスク

  1. 市場変動は指標判断に誤りをもたらす可能性があります
  2. 資金調達の遅延は戦略のタイミングに影響を与える
  3. より少ない信号がトレンド機会を逃す可能性があります
  4. パラメータを最適化する際の過剰な最適化リスク
  5. 引き上げ制御やストップ・ロスのメカニズムの欠如

リスクを減らすには,MA期間を短縮し,他の指標を追加し,ストップロスを追加する.

オプティマイゼーションの方向性

1.15mから1Dまでの異なる時間枠でテストされ,リスク調整回帰の4Hで最適な結果

2. 速くて遅いMAを最適化してMACDがサイクルを捕捉します. 7-21は15mに有効です.

3.MACDのHull MAは良い結果を示した.

4.トライリングストップロスはリスク管理を改善する

結論

これは全体的に非常にシンプルで実践的な戦略であり,デュアルインジケーターシステムと価格フィルタリングを通じて高い確率の取引信号を生成する. 比較的高い利益率を有し,過剰な最適化を避けるためにクラシックMACDパラメータの組み合わせを使用する. MAパラメータを調整し,パフォーマンスをさらに改善するために他の指標やストップロスのメカニズムを追加することによって最適化する余地がまだ大きい. 全体的に,基本に基づいた典型的な定量戦略である.


/*backtest
start: 2024-02-14 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
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/
// © Hurmun

//@version=4
strategy("Simple MACD strategy ", overlay=true, margin_long=100, margin_short=100)


fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=false)
// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal


movinga2 = input(title="movinga 2", type=input.integer, defval=200)

movinga200 = sma(close, movinga2)

plot(movinga200, "MA", color.orange)
longCondition = crossover(macd, signal) and macd < 0 and signal < 0 and close > movinga200
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(macd, signal) and macd > 0 and signal > 0 and close < movinga200
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)
    
shortProfitPerc = input(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
longProfitPerc = input(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=2) / 100
    
stoploss = input(title="stoploss in %", minval = 0.0, step=1, defval=2) /100

longStoploss = strategy.position_avg_price * (1 - stoploss)
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStoploss = strategy.position_avg_price * (1 + stoploss)
    
if (strategy.position_size > 0 )
    strategy.exit(id="XL TP", limit=longExitPrice, stop=longStoploss)






if (strategy.position_size < 0 )
    strategy.exit(id="XS TP", limit=shortExitPrice, stop=shortStoploss)

もっと