Strategi MACD - Perdagangan Keluar Dua Arah

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

img

Ringkasan

Strategi ini menggunakan penunjuk Moving Average Convergence Divergence (MACD) untuk menjana isyarat panjang dan pendek dan membuat perdagangan pembalikan dalam keadaan trend yang baik dengan menetapkan titik keluar secara dinamik untuk menangkap keuntungan.

Prinsip Strategi

Inti strategi ini adalah berdasarkan salib emas MACD untuk isyarat panjang dan salib kematian untuk isyarat pendek. Khususnya, apabila garis MACD melintasi di atas garis isyarat dari bawah, salib emas dihasilkan sebagai isyarat panjang; apabila garis MACD melintasi di bawah garis isyarat dari atas, salib kematian dihasilkan sebagai isyarat pendek.

Pada isyarat salib emas, pergi panjang jika harga penutupan di atas EMA; pada isyarat salib kematian, pergi pendek jika harga penutupan di bawah EMA. Ini memastikan perdagangan pembalikan di bawah trend menaik.

Selepas memasuki kedudukan, strategi menggunakan stop loss dan mengambil keuntungan untuk mengawal keluar secara dinamik. Khususnya, stop loss untuk kedudukan panjang ditetapkan pada harga kemasukan * (1 - penarikan maksimum); mengambil keuntungan ditetapkan pada harga kemasukan * (1 + TARGET_STOP_RATIO * penarikan maksimum). Sebaliknya untuk kedudukan pendek. Di sini, penarikan maksimum dikira secara dinamik sebagai peratusan penurunan harga dari swing low hingga penutupan; TARGET_STOP_RATIO adalah lalai menjadi 2, yang bermaksud nisbah risiko / ganjaran 2.

Kelebihan strategi berhenti dinamik ini adalah bahawa ia dapat menyesuaikan stop loss dan nisbah risiko / ganjaran berdasarkan turun naik pasaran. Ia keluar dengan cepat dengan stop loss yang ketat semasa turun naik tinggi sementara menjejaki keuntungan dengan berhenti longgar semasa persekitaran turun naik rendah.

Kelebihan

  1. MACD adalah penunjuk yang berkesan untuk mengenal pasti peluang pembalikan.

  2. Penapis EMA memastikan dagangan panjang berlaku hanya dalam pasaran trend menaik.

  3. Sistem kawalan keluar dinamik memaksimumkan keuntungan sambil menguruskan risiko dengan berkesan.

  4. Kelajuan yang pantas mengurangkan masa pemantauan yang diperlukan, menjadikannya sesuai untuk pelabur yang sibuk.

Risiko dan Penyelesaian

  1. MACD sering berayun semasa pasaran sisi, menghasilkan isyarat palsu. Ini diselesaikan dengan menambah penapis EMA untuk mengelakkan perdagangan yang bertentangan dengan trend.

  2. Volatiliti yang melampau boleh menyebabkan DYNAMIC STOP menjadi terlalu longgar.

  3. Margin keuntungan yang terhad setiap perdagangan memerlukan perdagangan yang kerap. Pelabur memerlukan ketahanan psikologi dan komitmen masa tertentu. Boleh beralih ke bingkai masa yang lebih tinggi jika terlalu sibuk.

Arahan pengoptimuman

  1. Sesuaikan parameter MACD berdasarkan ciri simbol untuk mengoptimumkan kualiti isyarat.

  2. Uji purata bergerak yang berbeza sebagai penapis trend untuk mencari yang optimum.

  3. Uji pengiraan TARGET_STOP_RATIO dan definisi pengeluaran maksimum untuk mengoptimumkan strategi keluar.

  4. Tambah faktor lain seperti jumlah, turun naik dll untuk meningkatkan kualiti isyarat.

  5. meneroka model pembelajaran mesin untuk mengekstrak lebih banyak ciri dan membina model multifaktor adaptif untuk keluar yang lebih pintar.

Kesimpulan

Strategi ini mempunyai nilai praktikal yang kuat secara keseluruhan. Dengan MACD sebagai isyarat perdagangan teras, modul tambahan penapis trend dan kawalan keluar dinamik dapat meningkatkan prestasi MACD itu sendiri dengan ketara. Kawalan keluar adalah penting untuk pengoptimuman strategi dan strategi ini berinovasi secara besar-besaran di kawasan 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 lanjut