Strategi MACD - Trading exit dua arah

Penulis:ChaoZhang, Tanggal: 2023-12-12 12:44:50
Tag:

img

Gambaran umum

Strategi ini menggunakan indikator Moving Average Convergence Divergence (MACD) untuk menghasilkan sinyal panjang dan pendek dan melakukan perdagangan pembalikan dalam kondisi tren yang baik dengan mengatur titik keluar secara dinamis untuk menangkap keuntungan.

Prinsip Strategi

Inti dari strategi ini didasarkan pada salib emas MACD untuk sinyal panjang dan salib kematian untuk sinyal pendek. Secara khusus, ketika garis MACD melintasi di atas garis sinyal dari bawah, salib emas dihasilkan sebagai sinyal panjang; ketika garis MACD melintasi di bawah garis sinyal dari atas, salib kematian dihasilkan sebagai sinyal pendek.

Pada sinyal golden cross, pergi panjang jika harga penutupan di atas EMA; pada sinyal death cross, pergi pendek jika harga penutupan di bawah EMA. Ini memastikan pembalikan perdagangan di bawah tren naik.

Setelah masuk ke posisi, strategi menggunakan stop loss dan take profit untuk mengendalikan keluar secara dinamis. Secara khusus, stop loss untuk posisi panjang ditetapkan pada harga masuk * (1 - max drawdown); take profit ditetapkan pada harga masuk * (1 + TARGET_STOP_RATIO * max drawdown). Sebaliknya untuk posisi pendek. Di sini max drawdown secara dinamis dihitung sebagai persentase penurunan harga dari swing low hingga close; TARGET_STOP_RATIO adalah default menjadi 2, yang berarti rasio risiko / imbalan 2.

Keuntungan dari strategi stop yang dinamis ini adalah dapat menyesuaikan stop loss dan rasio risiko / imbalan berdasarkan volatilitas pasar.

Keuntungan

  1. MACD adalah indikator yang efektif untuk mengidentifikasi peluang pembalikan.

  2. Filter EMA memastikan perdagangan panjang hanya terjadi di pasar tren naik.

  3. Sistem kontrol keluar dinamis memaksimalkan keuntungan sementara secara efektif mengelola risiko.

  4. Kecepatan eksistensi yang cepat mengurangi waktu pemantauan yang diperlukan, membuatnya cocok untuk investor yang sibuk.

Risiko dan Solusi

  1. MACD sering berosilasi selama pasar sisi, menghasilkan sinyal palsu. Hal ini diselesaikan dengan menambahkan filter EMA untuk menghindari perdagangan kontra-tren.

  2. Volatilitas ekstrim dapat menyebabkan DYNAMIC STOP menjadi terlalu longgar.

  3. Margin keuntungan terbatas per perdagangan membutuhkan perdagangan yang sering. Investor membutuhkan ketahanan psikologis tertentu dan komitmen waktu.

Arahan Optimasi

  1. Perbaiki parameter MACD berdasarkan karakteristik simbol untuk mengoptimalkan kualitas sinyal.

  2. Uji rata-rata bergerak yang berbeda sebagai filter tren untuk menemukan yang optimal.

  3. Uji perhitungan TARGET_STOP_RATIO dan definisi penarikan maksimum untuk mengoptimalkan strategi keluar.

  4. Tambahkan faktor lain seperti volume, volatilitas dll untuk meningkatkan kualitas sinyal.

  5. Jelajahi model pembelajaran mesin untuk mengekstrak lebih banyak fitur dan membangun model multifaktor adaptif untuk keluar yang lebih cerdas.

Kesimpulan

Strategi ini memiliki nilai praktis yang kuat secara keseluruhan. Dengan MACD sebagai sinyal perdagangan inti, modul tambahan filter tren dan kontrol keluar dinamis dapat secara signifikan meningkatkan kinerja MACD itu sendiri. Kontrol keluar sangat penting untuk optimasi strategi dan strategi ini sangat inovatif di bidang ini.


/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 00:00:00
period: 1d
basePeriod: 1h
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/
// © maxencetajet

//@version=5
strategy("MACD Strategy", overlay=true, initial_capital=1000, slippage=25)

src = input(title="Source", defval=close)
target_stop_ratio = input.float(title='Risk/Reward', defval=2, minval=0.5, maxval=100)
risk = input.float(2, title="Risk per Trade %")

riskt = risk / 100 + 1

useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
     group="Backtest Time Period")
backtestStartDate = input(timestamp("5 June 2022"), 
     title="Start Date", group="Backtest Time Period",
     tooltip="This start date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")
backtestEndDate = input(timestamp("5 July 2022"),
     title="End Date", group="Backtest Time Period",
     tooltip="This end date is in the time zone of the exchange " + 
     "where the chart's instrument trades. It doesn't use the time " + 
     "zone of the chart or of your computer.")

inTradeWindow =  true
emaV = input.int(200, title="Length", group="EMA")
swingHighV = input.int(7, title="Swing High", group="number of past candles")
swingLowV = input.int(7, title="Swing Low", group="number of past candles")

ema = ta.ema(src, emaV)

fast_length = input(title="Fast Length", defval=12, group="MACD")
slow_length = input(title="Slow Length", defval=26, group="MACD")
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD")

fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

longcondition = close > ema and ta.crossover(macd, signal) and macd < 0
shortcondition = close < ema and ta.crossunder(macd, signal) and macd > 0

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

risk_long := risk_long[1]
risk_short := risk_short[1]

swingHigh = ta.highest(high, swingHighV)
swingLow = ta.lowest(low, swingLowV)

lotB = (strategy.equity*riskt-strategy.equity)/(close - swingLow)
lotS = (strategy.equity*riskt-strategy.equity)/(swingHigh - close)

if strategy.position_size == 0 and longcondition and inTradeWindow
    risk_long := (close - swingLow) / close
    strategy.entry("long", strategy.long, qty=lotB)
    
if strategy.position_size == 0 and shortcondition and inTradeWindow
    risk_short := (swingHigh - close) / close  
    strategy.entry("short", strategy.short, qty=lotS)

if strategy.position_size > 0

    stopLoss := strategy.position_avg_price * (1 - risk_long)
    takeProfit := strategy.position_avg_price * (1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("long exit", "long", stop = stopLoss, limit = takeProfit)
    
if strategy.position_size < 0

    stopLoss := strategy.position_avg_price * (1 + risk_short)
    takeProfit := strategy.position_avg_price * (1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("short exit", "short", stop = stopLoss, limit = takeProfit)
    
plot(ema, color=color.white, linewidth=2, title="EMA")
p_ep = plot(entry_price, color=color.new(color.white, 0), linewidth=2, style=plot.style_linebr, title='entry price')
p_sl = plot(stopLoss, color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr, title='stopLoss')
p_tp = plot(takeProfit, color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr, title='takeProfit')
fill(p_sl, p_ep, color.new(color.red, transp=85))
fill(p_tp, p_ep, color.new(color.green, transp=85))



Lebih banyak