MACD 移動平均 組み合わせクロスペリオド 動的トレンド戦略

作者: リン・ハーンチャオチャン,日付: 2024-02-19 10:48:11
タグ:

img

概要

この戦略は,MACD指標の移動平均値の組み合わせをベースに,時間帯間の動的トレンド判断を実現する.これは,よりクラシックなトレンド追跡戦略に属している.主にMACDの高速および遅い移動平均値の違いと信号線間の関係を通じて,現在のトレンド方向と強さを判断する.同時に,精度を向上させ,ポジションを動的に調整するために,クロス・ペリオド判断が導入される.

戦略原則

  1. 現行のトレンド方向をMACD指標の高速移動平均と遅移動平均との違いと信号線関係に基づいて判断する.
  2. 信号線上のMACD差が長い信号で,下の差が短い信号です.
  3. MACD差とMACDヒストグラムを同じ方向に導入して戦略信号を強化します.
  4. クロスサイクル判断モジュールを追加し,より高い時間枠のMACD指標をシグナルフィルターと位置調整ベースとして使用します.
  5. ダイナミックな位置調整,クロスサイクル信号が弱くなると位置サイズを小さくし,信号が強化されると位置を増やす.

利点分析

  1. 傾向の方向性を決定するMACDの有効性は比較的高い.
  2. MACD差とヒストグラムの二重検証の組み合わせにより,信号の正確性が向上します.
  3. クロスサイクルの判断は戦略の安定性を高め 高周波信号によって誤導されるのを防ぎます
  4. ポジションのダイナミックな調整により,戦略は機会をよりうまく把握し,余剰利益を増やすことができます.

リスク分析と解決策

  1. MACD信号には遅延があり,信号効果が少し劣る可能性があります.
  • 解決策: 信号を事前に捕捉するために,高速移動平均値と遅い移動平均値の違いを増加させる.
  1. クロスサイクル信号は必ずしも正確で 戦略を誤導する可能性があります
  • 解決策: 主要サイクルの戦略が優勢であることを確保するために動的位置調整メカニズムを導入する.
  1. 多要素組み合わせの戦略の全体的な安定性は不十分かもしれない.
  • 解決策: 全体の安定性を確保するために,各戦略パラメータの重量の割合を注意深く調整する.

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

  1. 異なるサイクルパラメータの組み合わせの効果を試験する.
  2. 異なるクロスサイクル組み合わせが戦略の効果に与える影響をテストする.
  3. MACD指標のパラメータを調整する.例えば,高速・遅い移動平均周期,信号線周期など.
  4. 異なる位置調整因子の効果を試験する.
  5. 他の品種へのバックテスト効果をテストします

概要

このMACD移動平均組合せクロス・ペリオド動的トレンド戦略は,古典的な指標とマルチタイムフレーム参照の利点を統合している.パラメータ最適化と組み合わせテストを通じて,比較的安定し収益性の高いトレンド追跡戦略を構築することができる.それはリアルマネーテストと適用に価値がある.


/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@temelbulut
//@version=5
strategy('MACD Strategy %80', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50)

fastLength = input.int(title='MACD Fast Length', defval=12, minval=1)
slowLength = input.int(title='MACD Slow Length', defval=26, minval=1)
signalLength = input.int(title='MACD Signal Length', defval=9, minval=1)
crossscore = input(title='Cross (buy/sell) Score', defval=10.)
indiside = input(title='indicator Direction Score', defval=8)
histside = input(title='Histogram Direction Score', defval=2)
shotsl = input(title='Show Stop Loss Line', defval=false)
Mult = input.float(title='Stop Loss Factor', defval=1.2, minval=0.1, maxval=100)
Period = input.int(title='Stop Loss Period', defval=10, minval=1, maxval=100)
lookaheadi = input(title='Lookahead', defval=true)

HTF = timeframe.period == '1' ? '5' : timeframe.period == '3' ? '15' : timeframe.period == '5' ? '15' : timeframe.period == '15' ? '60' : timeframe.period == '30' ? '60' : timeframe.period == '45' ? '60' : timeframe.period == '60' ? '240' : timeframe.period == '120' ? '240' : timeframe.period == '180' ? '240' : timeframe.period == '240' ? 'D' : timeframe.period == 'D' ? 'W' : 'W'

calc = timeframe.period == '1' ? 5 : timeframe.period == '3' ? 5 : timeframe.period == '5' ? 3 : timeframe.period == '15' ? 4 : timeframe.period == '30' ? 4 : timeframe.period == '45' ? 4 : timeframe.period == '60' ? 4 : timeframe.period == '120' ? 3 : timeframe.period == '180' ? 3 : timeframe.period == '240' ? 6 : timeframe.period == 'D' ? 5 : 1

count() =>
    indi = ta.ema(close, fastLength) - ta.ema(close, slowLength)
    signal = ta.ema(indi, signalLength)
    Anlyse = 0.0
    // direction of indi and histogram
    hist = indi - signal
    Anlyse := indi > indi[1] ? hist > hist[1] ? indiside + histside : hist == hist[1] ? indiside : indiside - histside : 0
    Anlyse += (indi < indi[1] ? hist < hist[1] ? -(indiside + histside) : hist == hist[1] ? -indiside : -(indiside - histside) : 0)
    Anlyse += (indi == indi[1] ? hist > hist[1] ? histside : hist < hist[1] ? -histside : 0 : 0)
    // cross now earlier ?
    countcross = indi >= signal and indi[1] < signal[1] ? crossscore : indi <= signal and indi[1] > signal[1] ? -crossscore : 0.
    countcross += nz(countcross[1]) * 0.6
    Anlyse += countcross
    nz(Anlyse)

Anlys = count()
AnlysHfrm = lookaheadi ? request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_on) : request.security(syminfo.tickerid, HTF, count(), lookahead=barmerge.lookahead_off)
Result = (AnlysHfrm * calc + Anlys) / (calc + 1)

longCondition = ta.change(Result) != 0 and Result > 0
if longCondition
    strategy.entry('MACD Long', strategy.long,alert_message = 'MACD Long')

shortCondition = ta.change(Result) != 0 and Result < 0
if shortCondition
    strategy.entry('MACD Short', strategy.short,alert_message = 'MACD Short')

countstop(pos) =>
    Upt = hl2 - Mult * ta.atr(Period)
    Dnt = hl2 + Mult * ta.atr(Period)
    TUp = 0.
    TDown = 0.
    TUp := close[1] > TUp[1] ? math.max(Upt, TUp[1]) : Upt
    TDown := close[1] < TDown[1] ? math.min(Dnt, TDown[1]) : Dnt
    tslmtf = pos == 1 ? TUp : TDown
    tslmtf

pos = longCondition ? 1 : -1
stline = 0.
countstop__1 = countstop(pos)
security_1 = request.security(syminfo.tickerid, HTF, countstop__1)
stline := ta.change(time(HTF)) != 0 or longCondition or shortCondition ? security_1 : nz(stline[1])
plot(stline, color=shotsl ? color.rgb(148, 169, 18) : na, style=plot.style_line, linewidth=2, title='Stop Loss')



もっと