MACD EMAゴールデンクロストレンドフォロー戦略


作成日: 2024-02-18 15:17:36 最終変更日: 2024-02-18 15:17:36
コピー: 0 クリック数: 760
1
フォロー
1617
フォロワー

MACD EMAゴールデンクロストレンドフォロー戦略

概要

この戦略は,MACD指数とその移動平均信号線の交差を計算してトレンドの方向を決定し,EMA指数と組み合わせて現在のトレンドの強さを判断し,トレンド追跡を実現する.MACD線が下から上へと突破する信号線が多ければ,上から下へと突破して空き間を空く,EMA線もトレンドの強さを判断し,偽の突破をフィルターする.

戦略原則

この戦略は,主にMACD指標に基づいてトレンドの方向と入場時間を判断する.MACD線突破シグナルラインは,価格トレンドが反転していることを示すので,突破方向に基づいて判断する.具体的判断論理は,閉盘価格がEMA平均より高く,MACD線が信号線を下から突破するときに,多めにすること.閉盘価格がEMA平均より低く,MACD線が信号線を下から突破するときに,空きをする.

EMA平均線は,価格がEMA平均線を示しより高い場合,上昇傾向にある場合,MACDの下の突破は,実行中の黄金のクロス信号を形成しやすい;価格がEMA平均線を示しより低い場合,下降傾向にある場合,MACD上の突破は,デッドフォーク信号を形成しやすい.EMAの長さは,傾向を判断する中長期の程度も決定する.

上記の方法で,価格が逆転して新しいトレンドを形成し始めるときに,タイムリーに場に入ることができ,トレンド追跡効果を実現します.

優位分析

この戦略は,価格のトレンドの方向を考慮し,特定の入場時刻を判断するために指標を使用し,偽突破のリスクを回避するために,二重判断条件を組み合わせて,戦略の信頼性を高めます. MACD指標のみを使用するよりも,この戦略は,新しいトレンドの開始をより正確に判断できます.

EMA平均線の使用は,戦略が短期的な波動の影響を一定程度にフィルタリングし,中長線トレンドをロックすることを可能にします.これはMACD指標の判断逆転の効果を発揮するのに役立ちます.

さらに,戦略は,オールと空白の条件を同時に設定し,落の市場環境に適用することができます.これは,戦略の適応性を強化します.

リスク分析

この戦略の主なリスクは,MACD指標自体がフェイクアウトを判断する確率が高いことであり,信号は誤認される可能性がある.この場合,EMA均線の補助機能が必要となるが,特殊な状況では失効する可能性もある.

さらに,戦略は,止損停止条件を設定するために,利回り比率を採用しており,これはある程度の主観性があり,不適切な設定が策略の効果に影響する.

最後に,戦略は,資金管理の問題を考慮せずに,ポジションの開設数を100%の口座権益に単純に設定します. これは,実存でも一定のリスクがあります.

最適化の方向

この戦略は,以下のいくつかの最適化方向に重点を置いています.

  1. 他の指標判断を加えて,複数の指標組合せを形成することで,MACDが誤信号を発する確率をさらに回避することができる.例えば,KDJ,BOLLなども考慮できる.

  2. EMA平均線長は,トレンドの方向を判断する最適なパラメータを見つけるために多組み合わせ最適化を行うことができます.

  3. MACDパラメータはさらに最適化され,反転時刻を決定する最も正確なパラメータの取値を見つけることができます.

  4. 資金管理モジュールを追加します.例えば,利回り率は動的な入力として使用できます.スライドポイントのストップ損失を設定することもできます.

  5. 異なる種類の契約の効果をテストし,最もマッチする取引の種類を探します.例えば,暗号通貨,株式指数先物など.

要約する

このMACD EMAゴールドクロストレンド追跡戦略は,全体的に比較的シンプルで実用的で,双重指標判断によって信号の信頼性を確保し,合理的なストップ・ストップ方式を設定して利益をロックする.主要最適化スペースは,パラメータ選択,指標組み合わせ,資金管理などである.この戦略は,さらにテストを最適化すれば,高効率のトレンド追跡戦略の1つになる可能性があると信じている.

ストラテジーソースコード
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type =  strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD)

// Time Range
FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12)
FromDay=input(defval=1,title="FromDay",minval=1,maxval=31)
FromYear=input(defval=2020,title="FromYear",minval=2016)
ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12)
ToDay=input(defval=1,title="ToDay",minval=1,maxval=31)
ToYear=input(defval=9999,title="ToYear",minval=2017)
start=timestamp(FromYear,FromMonth,FromDay,00,00)
finish=timestamp(ToYear,ToMonth,ToDay,23,59)
window()=>true

// STEP 2:
// See if this bar's time happened on/after start date
afterStartDate = true

//EMA
emasrc = close
res = input(title="EMA Timeframe", type=input.resolution, defval="15")
len1 = input(title="EMA Length", type=input.integer, defval=206)
col1 = color.yellow
// Calculate EMA
ema1 = ema(emasrc, len1)
emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off)
// Draw EMA
plot(emaSmooth, title="EMA", linewidth=1, color=col1)

//MACD
fast_length = input(title="Fast Length", type=input.integer, defval=15)
slow_length = input(title="Slow Length", type=input.integer, defval=24)
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=true)
sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=true)
zeroline = 0

// 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
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)
//plot(zeroline, title="Zero Line", color=color.black, transp=0)

///////////////////////////LONG////////////////////////////////////////////////////////////////////

enablelong = input(true, title="Enable long?")

//Long Signal
upcondition = close > emaSmooth and close[1] > emaSmooth[1]
macdunderhis = macd < zeroline
macdcrossup = crossover(macd, signal)

longcondition = upcondition and macdunderhis and macdcrossup

//strategy buy long
if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true)
    strategy.entry("long", strategy.long)

//////////////////////////////////////SHORT//////////////////////////////////////////////////////////////////////////////////

enableshort = input(true, title="Enable short?")

//Short Signal
downcondition = close < emaSmooth and close[1] < emaSmooth[1]
macdoverhis = macd > zeroline
macdcrosunder = crossunder(macd, signal)

shortcondition = downcondition and macdoverhis and macdcrosunder

//strategy buy short
if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true)
    strategy.entry("short", strategy.short)


//////////////////////////////////////EXIT CONDITION//////////////////////////////////////////////////////////////////////////////////
bought = strategy.position_size[1] < strategy.position_size
sold = strategy.position_size[1] > strategy.position_size
barsbought = barssince(bought)
barssold = barssince(sold)
//////LOWEST LOW//////
//Lowest Low LONG
profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9)
loLen = input(title="Lowest Low Lookback", type=input.integer,
  defval=46, minval=2)
stop_level_long = lowest(low, loLen)[1]

if strategy.position_size>0 
    profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong)
    strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long)

//Lowest Low SHORT
profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1)
highLen = input(title="highest high lookback", type=input.integer,
  defval=25, minval=2)
stop_level_short = highest(high, highLen)[1]

if strategy.position_size<0 
    profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort)
    strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short)
    
//PLOTT TP SL
plot(stop_level_long, title="SL Long", linewidth=1, color=color.red)
plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)