Trend MACD Berikutan Strategi Dagangan Berdasarkan Penunjuk MACD

Penulis:ChaoZhang, Tarikh: 2023-09-27 16:46:38
Tag:

Ringkasan

Strategi ini mengenal pasti arah trend berdasarkan penunjuk MACD dan membuat keputusan beli dan jual khusus menggunakan penunjuk Stoch.

Logika Strategi

  1. Menilai arah trend utama menggunakan penunjuk MACD

    • Pengiraan histogram EMA pantas, EMA perlahan dan MACD

    • Membandingkan pergerakan MACD dalam kitaran yang berbeza untuk menentukan trend

  2. Mengenali titik beli dan jual tertentu menggunakan penunjuk Stoch

    • Mengira baris %K dan baris %D

    • Divergensi berhampiran zon overbought atau oversold, dengan Stoch bangkit semula sebagai isyarat perdagangan

  3. Membuat keputusan membeli dan menjual berdasarkan arah trend dan isyarat Stoch

    • Pergi panjang apabila kitaran utama MACD naik dan isyarat beli Stoch muncul

    • Pergi pendek apabila kitaran utama MACD jatuh dan isyarat jual stok muncul

  4. Menetapkan stop loss dan mengambil keuntungan untuk mengoptimumkan pengurusan risiko

Analisis Kelebihan

  • Menggabungkan trend berikut dan penunjuk overbought-oversold membantu menangkap trend jangka sederhana hingga panjang dengan berkesan

  • MACD menentukan arah utama manakala Stoch bekerja butiran perdagangan yang mengurangkan risiko

  • Menggunakan sepenuhnya gabungan penunjuk untuk membentuk strategi sistematik

  • Menetapkan stop loss dan mengambil keuntungan mengawal risiko perdagangan

  • Parameter yang boleh dioptimumkan menyesuaikan diri dengan keadaan pasaran yang berbeza

Analisis Risiko

  • Penilaian trend jangka menengah hingga panjang yang tidak tepat boleh membawa kepada kerugian perdagangan yang bertentangan

  • Isyarat palsu dari Stoch menyebabkan keuntungan atau kerugian yang tidak mencukupi

  • Titik Stop Loss boleh dilanggar apabila perubahan trend, memperluaskan kerugian

  • Tahap sasaran keuntungan yang tidak tepat mempengaruhi prestasi strategi

  • Parameter yang tidak berkesan dan kegagalan untuk menyesuaikan diri dengan perubahan persekitaran boleh membatalkan strategi

  • Risiko boleh dikurangkan dengan mengoptimumkan penilaian trend, mengesahkan isyarat Stoch, menyesuaikan stop loss dan mengambil keuntungan, dll.

Arahan pengoptimuman

  • Mengoptimumkan campuran parameter MACD untuk meningkatkan ketepatan penilaian trend

  • Pertimbangkan stok berbilang kitaran untuk mengelakkan isyarat palsu

  • Sesuaikan secara dinamik nisbah stop loss dan mengambil keuntungan untuk menyesuaikan turun naik pasaran

  • Tambah isyarat penunjuk lain untuk mengesahkan dan meningkatkan kesahihan

  • Mengoptimumkan parameter berdasarkan ciri-ciri produk dan sesi dagangan yang berbeza

  • Memperkenalkan model pembelajaran mesin untuk membantu penilaian arah trend

  • Masukkan penunjuk jumlah untuk mengelakkan pengejaran yang tidak mencukupi atau mengikuti berlebihan

Kesimpulan

Strategi ini mengintegrasikan kekuatan penunjuk MACD dan Stoch untuk menangkap trend jangka menengah hingga panjang sambil mengawal risiko. Ia boleh berkesan dalam pelbagai keadaan pasaran dengan mengoptimumkan parameter, menetapkan stop loss dan mengambil keuntungan, mengesahkan isyarat, dll. Masih ada ruang untuk peningkatan dengan penyesuaian parameter lebih lanjut, meningkatkan ketepatan isyarat, dan menggabungkan pembelajaran mesin. Strategi ini boleh menjadi lebih komprehensif dan pintar.


/*backtest
start: 2023-09-19 00:00:00
end: 2023-09-26 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// strategy(title="自用策略v0.2",calc_on_order_fills=false,calc_on_every_tick =false, initial_capital=10000,commission_type=strategy.commission.percent, commission_value=0.00,overlay = true,default_qty_type = strategy.cash, default_qty_value = 10000)



//STOCH
periodD = input(3, title="%D Smoothing", minval=1)
periodK = input(14, title="%K Length", minval=1)
periodK2 = input(42, title="%K2 Length", minval=1)
periodK3 = input(126, title="%K3 Length", minval=1)
periodK4 = input(378, title="%K4 Length", minval=1)
periodK5 = input(14, title="%K5 Length", minval=1)
periodK6 = input(30, title="%K6 Length", minval=1)
smoothK = input(1, title="%K Smoothing", minval=1)
k = sma(stoch(close, high, low, periodK), smoothK)
k2 = sma(stoch(close, high, low, periodK2), smoothK*3)
k3 = sma(stoch(close, high, low, periodK3), smoothK*3*3)
k4 = sma(stoch(close, high, low, periodK4), smoothK*3*3*3)
d = sma(k, periodD)
all = (k+k2*3+k3*9+k4*18)/31
allp = sma(all, periodK6)



buffer = input(title="buffer", type=input.float, defval=0.3, minval = 0, step = 0.1)
b1 = close[1]* (1+buffer/100)
b2 = close[1]* (1-buffer/100)

//MACD
fast_length = input(title="Fast Length", defval=144)
slow_length = input(title="Slow Length", defval=312)

src = input(title="Source", defval=close)
signal_length = input(title="Signal Smoothing",  minval = 1, maxval = 200, defval = 108)
sma_source = input(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// Calculating
fast_ma = sma_source == "SMA" ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source == "SMA" ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
MACDCHA = input(title="MACDCHA步长", defval=30)
MACDCHA2 = input(title="MACDCHA步长2", defval=20)
MACDCHA3 = input(title="MACDCHA步长3", defval=10)
MACDCHA4 = input(title="MACDCHA步长4", defval=5)
MACDCHA5 = input(title="MACDCHA步长5", defval=3)
MACDCHA6 = input(title="MACDCHA步长6", defval=1)
HISTCHA = input(title="hist步长", defval=50)
macdcha = hist - hist[MACDCHA]
macdcha2 = hist - hist[MACDCHA2]
macdcha3 = hist - hist[MACDCHA3]
macdcha4 = hist - hist[MACDCHA4]
macdcha5 = hist - hist[MACDCHA5]
macdcha6 = hist - hist[MACDCHA6]
histcha = hist[HISTCHA]
var true2 = 0
var true2_1 = 0
var true2_2 = 0
var true2_3 = 0
var true2_4 = 0//延伸
var fangxiang =0
//确认方向
if(macdcha>=0 and macdcha2>=0 and macdcha3>=0 and macdcha4>=0 and macdcha5>=0 and macdcha6>=0)
    fangxiang := 1
    true2_2 := 0
if(macdcha<=0 and macdcha2<=0 and macdcha3<=0 and macdcha4<=0 and macdcha5<=0 and macdcha6<=0)
    fangxiang :=-1
    true2_1 := 1
//k3min = min(k3,k3[1],k3[2],k3[3],k3[4],k3[5],k3[6],k3[7],k3[8],k3[9],k3[10],k3[11],k3[12],k3[13],k3[14],k3[15],k3[16],k3[17],k3[18],k3[19],k3[20],k3[21],k3[22],k3[23],k3[24],k3[25],k3[26],k3[27],k3[28],k3[29],k3[30],k3[31],k3[32],k3[33],k3[34],k3[35],k3[36],k3[37],k3[38],k3[39],k3[40],k3[41],k3[42],k3[43],k3[44],k3[45],k3[46],k3[47],k3[48],k3[49],k3[50])
//k3max = max(k3,k3[1],k3[2],k3[3],k3[4],k3[5],k3[6],k3[7],k3[8],k3[9],k3[10],k3[11],k3[12],k3[13],k3[14],k3[15],k3[16],k3[17],k3[18],k3[19],k3[20],k3[21],k3[22],k3[23],k3[24],k3[25],k3[26],k3[27],k3[28],k3[29],k3[30],k3[31],k3[32],k3[33],k3[34],k3[35],k3[36],k3[37],k3[38],k3[39],k3[40],k3[41],k3[42],k3[43],k3[44],k3[45],k3[46],k3[47],k3[48],k3[49],k3[50])
allpmax = max(allp[1],allp[2],allp[3],allp[4],allp[5],allp[6])
allpmin = min(allp[1],allp[2],allp[3],allp[4],allp[5],allp[6])
if(histcha < 0 and macdcha>=0 and macdcha2>=0 and macdcha3>=0 and macdcha4>=0 and macdcha5>=0 and macdcha6>=0 and d < 20 and volume > volume[1] and true2_1 == 1 and allp>allp[1] and allp <80)//and k3max < 80  //and k3min < 30 and k3 >20 and k2<50
    strategy.entry("开多", true, comment = "开多") // and close > close[1] and cci1> MEA1
    true2_1 :=0
if(d >80)
    strategy.close( "开多", comment = "平多")
    true2_1 :=1

stop_loss=input(4, "做多止损 %", minval = 1, step = 1)
sl = strategy.position_avg_price * (1-stop_loss/100)
close_Stop = close < sl
if(close_Stop or(allp<20 and allp[1]>20))
    strategy.close( "开多", comment = "做多止损")
    true2_1 :=1
Target_profit=input(10, "做多止盈 %", minval = 1, step = 1)
tp = strategy.position_avg_price * (1+Target_profit/100)
close_Target = close > tp
strategy.close("开多", when = close_Target, comment ="做多盈利")


//空
if(histcha > 0 and macdcha<=0 and macdcha2<=0 and macdcha3<=0 and macdcha4<=0 and macdcha5<=0 and macdcha6<=0 and d > 80 and volume > volume[1] and true2_2 == 1 and allp<allp[1] and allp >20) // and k3max>70 and k3<80
    //strategy.entry("开空", comment = "开空") 
    strategy.entry("开空", strategy.short,comment ="开空")
    true2_2 := 0
if( d <20)
   // strategy.close(  comment = "平空")
    strategy.close("开空",  comment = "平空")
    true2_2 := 1

stop_loss2=input(4, "做空止损 %", minval = 1, step = 1)
sl2 = strategy.position_avg_price * (1+stop_loss2/100)
close_Stop2 = close > sl2
if(close_Stop2 or(allp>80 and allp[1]<80))
    strategy.close( "开空", comment = "做空止损")
    true2_2 == 1
Target_profit2=input(10, "做空止盈 %", minval = 1, step = 1)
tp2 = strategy.position_avg_price * (1-Target_profit2/100)
close_Target2 = close < tp2
strategy.close("开空", when = close_Target2, comment ="做空盈利")





Lebih lanjut