MACD+EMA マルチタイムスケールブレイクアウト戦略


作成日: 2024-03-22 11:13:12 最終変更日: 2024-03-22 11:13:12
コピー: 0 クリック数: 685
1
フォロー
1617
フォロワー

MACD+EMA マルチタイムスケールブレイクアウト戦略

概要

この戦略は,MACD指数と複数のEMA線を組み合わせて,周線と分線の2つの時間尺度から市場の強いトレンドを捕捉する.周線では,MACD指数を使用して大トレンドの方向性を判断し,分線では,5日,15日,30日,3つのEMA線を使用してトレンドを確認し,突破点で取引する.この戦略の主な考えは,強いトレンドを追うことであり,大波に乗って,短期EMA線は長期EMA線を突破し,取引を進めて,EMA線は引き戻すか,停止条件を触発する.

戦略原則

  1. 周線MACD大トレンド判定:周線MACD指標を計算し,今週と先週のMACD柱状図の差値と比較し,差値が0より大きいのはトレンドの上昇を示し,0より小さいのはトレンドの低下を示します.毎週一日の開盤時にトレンド方向を更新します.

  2. 複数EMA線によるトレンド確認:分線図に5日,15日,30日3つのEMA線を描画する.短期EMAが長期EMAの上に上向きに運行すると,トレンドは上向き,逆のトレンドは下向きである.

  3. EMA線交差点での取引:

    • オーバー:周期のMACDが上昇し,分線の閉店価格が15日EMAを突破するときにオーバーする. ストップロスは,持仓平均値より固定ポイントを設定し,または5日EMAの下の15日EMAを突破するときに平仓する.
    • 空白:周線MACDが下向きにトレンドし,第5日EMAの下では30日EMAを突破する時に空白する. ストップロスは,持仓平均値の固定ポイントを設定する,または第5日EMA上では第15日EMAを突破する時に平仓する.
  4. 追加条件を設定しない.

優位分析

  1. 双時間尺度を組み合わせると,トレンド判断はより信頼性が高くなります.周線MACDは,大きなトレンドを判断し,震動の市場で多額の被套を避ける.分線EMAは,トレンドの各波を把握し,トレンドを確認します.

  2. 分線EMAのパラメータは5,15,30日,三線組み合わせは,明確なトレンドを捉えるために,ノイズをフィルタリングするのに十分です.

  3. ストップ・ロスは合理的に設定され,単一取引のリスクを制御する.固定ポイントストップとEMAストップが組み合わせて,損失を制御するだけでなく,トレンドに従うことができます.

  4. コードがモジュール化され,MACD計算,EMA計算などの主要なモジュールは,強固な再利用性と拡張性がある.

リスク分析

  1. MACD柱状グラフの差値値の選択は不適切であり,傾向判断基準が過度に緩やかまたは厳格になり,判断が誤りになる可能性があります.回測とパラメータ最適化により最適な値を選択できます.

  2. 分線EMAパラメータの選択は不適切で,周期が短すぎると取引が頻繁になり,長すぎるとチャンスが失われる。反測とパラメータ最適化によって最適なパラメータの組み合わせを選択することができる。

  3. 固定ポイントのストップポジションの選択は不適切で,設定が小さすぎると頻繁にストップが起こり,大会を設定すると単発損失が多すぎます.品種の波動特性に応じて個別ストップが設定できます.

  4. トレンド転換のEMA線は遅滞し,ベストバイバイポイントを逃す可能性があります. しかし,長期的には,リスクを効果的に制御することができ,戦略の全体的なパフォーマンスは良好です.

最適化の方向

  1. MACDのトレンド判断を基に,RSIなどの指標を重ねてトレンドの強さを確認し,トレンド判断の正確性を向上させることが考えられます.

  2. EMA線交差の基礎で,取引信号のフィルタリング条件としてCCIなどの指標を追加し,取引頻度とリスクを減らすことができます.

  3. 個々の株の歴史的波動特性に応じて個別化されたストップポイントを設定し,品種特性に適した戦略を策定することができる.

  4. トレンドが強くなるときは徐々にポジションを増やし,トレンドが弱くなるときは徐々にポジションを下げ,資金利用の効率性を向上させる戦略を考慮することができる.

要約する

MACD+EMA多時間尺度突破戦略は,トレンド判断とトレンド確認において比較科学的な根拠を持つトレンド追跡型の戦略であり,市場の主なトレンドを効果的に把握し,安定した収益を得ることができる.同時に,この戦略は,リスク管理においても比較的に完善であり,合理的なストップ・ローズ設定とポジション条件によって,戦略の撤回を効果的に制御する.しかし,戦略には,トレンド判断の遅延後にポジション加減などの欠陥がある.

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


// 1) 전주와 전전주의 히스토그램의 차이를 계산하여, 매주 월요일에 매매 방향을 표시하고, 
// 2) 5일, 15일, 30일 선을 호출하여 평행하게 그리고, 매매 방향에 따라 
// 3) 분봉기준의 이동평균선 매매전략  
// 4) 수익 실현은 미설정 해둠 


//@version=5
strategy('Last week MACD+ 15day, 30day break through, by Ho.J', overlay=true, initial_capital=30000, commission_value = 7.5, commission_type=strategy.commission.cash_per_order, slippage = 0)

// 백테스팅 기간 설정
start_time = input(timestamp("Jan 19 2024 00:00:01"), confirm = true)
end_time = input(timestamp("MAR 19 2024 23:59:59"), confirm = true)
is_in_time = true
stopLoss = input.int(100, title="손절 수준")


// 지난주 값 불러오기 입력 매개변수, 1은 5일, 3은 15일, 6은 30일 이동평균선을 구하는 변수임
emaLength1 = input(1, title="EMA Length")
emaLength2 = input(3, title="EMA Length")
emaLength3 = input(6, title="EMA Length")
timeframePeriod = "W" // 'D'는 일간 데이터를 의미


// 분봉기준 EMA 계산
shortEMA = ta.ema(close, 50)
mediumEMA = ta.ema(close, 60)
longEMA = ta.ema(close, 150)


// 분봉기준 EMA 그리기
plot(shortEMA, color=color.blue, title="5일 EMA")
plot(mediumEMA, color=color.orange, title="15일 EMA")
plot(longEMA, color=color.red, title="30일 EMA")



// 주간 MACD 계산, 전주와 전전주 히스토그램을 계산하여 상대적인 상승, 하락을 계산 
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
histogram = macdLine - signalLine
histLastWeek = request.security(syminfo.tickerid, timeframePeriod, histogram[1], lookahead=barmerge.lookahead_on)
histWeekBeforeLast = request.security(syminfo.tickerid, timeframePeriod, histogram[2], lookahead=barmerge.lookahead_on)
histDiff = histLastWeek - histWeekBeforeLast


// 현재 주의 월요일 첫 봉인지 확인
isMondayFirstBar = (dayofweek == dayofweek.monday) and (hour == 09) and (minute == 00) // 여기서 시간은 시장 개장 시간에 따라 조정해야 함


// 월요일 첫봉에, 주간 MACD 히스토그램이 상승하면 '매수', 하락하면 '매도' 표시
var label myLabel = na
if (isMondayFirstBar)
    if (histDiff > 0)
        myLabel := label.new(bar_index, high, "이번주는 매수만", color=color.green, textcolor=color.white, style=label.style_label_down, size=size.large)
    else if (histDiff < 0)
        myLabel := label.new(bar_index, low, "이번주는 매도만", color=color.red, textcolor=color.white, style=label.style_label_up, size=size.large)


// 지난주 EMA 값 요청
// 'lookahead'를 사용하여 지난 데이터를 기준으로 계산
lastWeekEMA1 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength1), lookahead=barmerge.lookahead_on)
lastWeekEMA2 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength2), lookahead=barmerge.lookahead_on)
lastWeekEMA3 = request.security(syminfo.tickerid, timeframePeriod, ta.ema(close[1], emaLength3), lookahead=barmerge.lookahead_on)

// 지난주 EMA 그리기
plot(lastWeekEMA1, color=color.red, title="Last Week EMA1")
plot(lastWeekEMA2, color=color.rgb(157, 126, 126), title="Last Week EMA2")
plot(lastWeekEMA3, color=color.rgb(199, 192, 192), title="Last Week EMA3")


// 매수/매도 조건
buySignal = ta.crossover(close, lastWeekEMA2) and histDiff > 0
// addbuySignal = ta.crossover(close, lastWeekEMA3) and histDiff > 0

sellSignal = ta.crossunder(shortEMA, longEMA) and histDiff < 0
// addSellSignal = ta.crossunder(close, lastWeekEMA3) and histDiff < 0


// 매수 조건
if (buySignal)
    strategy.entry('Buy', strategy.long)
    alert('Buy Signal', alert.freq_once_per_bar_close)
	
// if (addbuySignal)
   // strategy.entry('Buy', strategy.long)
   // alert('add Buy Signal', alert.freq_once_per_bar_close)

if (strategy.position_size > 0 and ((strategy.position_avg_price - close) >= stopLoss) or ta.crossunder(close, mediumEMA))
    strategy.close('Buy')
    alert('Close Buy Signal', alert.freq_once_per_bar_close)

// 매도 조건
if (sellSignal)
    strategy.entry('Sell', strategy.short)
    alert('Sell Signal', alert.freq_once_per_bar_close)
	
//if (addSellSignal)
   // strategy.entry('Sell', strategy.short)
   // alert('add Sell Signal', alert.freq_once_per_bar_close)

if (strategy.position_size < 0 and ((close - strategy.position_avg_price) >= stopLoss) or ta.crossover(shortEMA, mediumEMA))
    strategy.close('Sell')
    alert('Close Sell Signal', alert.freq_once_per_bar_close)