Strategi Dagangan Jangka Pendek Dual Moving Average dan Kombinasi MACD

Penulis:ChaoZhang, Tarikh: 2023-10-09 16:47:42
Tag:

Ringkasan

Strategi ini menggabungkan purata bergerak berganda, penunjuk stokastik dan MACD untuk mengenal pasti peluang perdagangan jangka pendek, yang merupakan strategi perdagangan jangka pendek yang agak klasik.

Prinsip

Strategi ini berdasarkan prinsip-prinsip berikut:

  1. Menggunakan EMA 50-period dan 100-period untuk menentukan arah trend. EMA dengan tempoh yang lebih pendek boleh bertindak balas dengan cepat terhadap perubahan harga. Menyambung EMA 50-period di atas EMA 100-period mewakili penubuhan kedudukan panjang; Menyambung ke bawah mewakili penubuhan kedudukan pendek.

  2. Gunakan perbezaan antara MACD untuk menentukan titik kemasukan dan keluar. Apabila perbezaan melintasi di atas 0, ia menunjukkan penguatan kuasa bull dan membawa kepada kemasukan panjang; apabila ia melintasi di bawah 0, ia menunjukkan penguatan kuasa bear dan membawa kepada kemasukan pendek.

  3. Menggabungkan penunjuk RSI Stochastic untuk menilai keadaan overbought dan oversold. Penunjuk ini menggabungkan kelebihan KDJ dan RSI, dan boleh menunjukkan keadaan overbought dan oversold dengan baik. Apabila ia lebih rendah daripada 20, pasaran adalah oversold, dan entri panjang boleh dianggap menggabungkan penunjuk lain; apabila lebih tinggi daripada 80, pasaran adalah overbought, dan entri pendek boleh dipertimbangkan.

  4. Selepas menentukan arah kemasukan, jika 4 daripada 5 candlestick terbaru mempunyai harga penutupan menyentuh purata bergerak, ia menunjukkan bahawa terdapat sokongan / rintangan di sekitar purata bergerak, dan kedudukan boleh dibuka.

  5. Gunakan stop loss dan mengambil keuntungan untuk menguruskan risiko.

Kelebihan

Kelebihan strategi ini termasuk:

  1. Gabungan beberapa penunjuk meningkatkan kadar kemenangan, menggunakan purata bergerak, penunjuk overbought / oversold dan penunjuk momentum bersama.

  2. Purata bergerak jangka pendek dapat menangkap trend dan pembalikan dengan cepat. Parameter MACD dioptimumkan untuk menjana isyarat kemasukan yang tepat.

  3. Parameter RSI stokastik dioptimumkan untuk mengenal pasti keadaan overbought / oversold dengan baik.

  4. Menggunakan sokongan / rintangan di sekitar purata bergerak untuk kawalan masa mengelakkan terperangkap oleh pecah palsu.

  5. Stop loss dan mengambil keuntungan yang munasabah berkesan mengawal risiko untuk setiap perdagangan.

Risiko

Terdapat juga beberapa risiko strategi ini:

  1. Kegagalan untuk mengelakkan sepenuhnya kerugian yang disebabkan oleh pelarian palsu.

  2. Perbezaan mungkin berlaku antara penunjuk, menyebabkan isyarat perdagangan yang tidak konsisten.

  3. Stop loss tetap dan mengambil keuntungan mungkin gagal menyesuaikan diri dengan perubahan pasaran.

  4. Kod yang kompleks dengan banyak parameter sukar untuk dioptimumkan.

Penyelesaian adalah:

  1. Mengoptimumkan parameter untuk meningkatkan kualiti isyarat dan mengurangkan kemungkinan pecah palsu.

  2. Menetapkan keutamaan antara penunjuk untuk mengelakkan konflik.

  3. Mengambil stop loss dinamik dan mengambil keuntungan berdasarkan julat ATR.

  4. Mempermudah logik dan mengekstrak parameter teras untuk ujian dan pengoptimuman.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Uji dan cari gabungan optimum tempoh purata bergerak dan parameter MACD.

  2. Uji penunjuk overbought / oversold yang berbeza untuk menggantikan RSI Stochastic.

  3. Cuba stop loss dinamik dan mengambil keuntungan, trailing berhenti untuk membuat pengurusan risiko lebih pintar.

  4. Tambah syarat penapisan seperti meningkatkan jumlah untuk meningkatkan kualiti isyarat.

  5. Mengoptimumkan logik kemasukan untuk mengelakkan pecah yang tidak berkesan, menggunakan lebih banyak penunjuk untuk menentukan trend.

  6. Tetapkan had stop loss mengikut saiz akaun, bilangan dagangan setiap hari untuk mengawal risiko keseluruhan.

Ringkasan

Strategi ini mengintegrasikan kelebihan pelbagai penunjuk, dan sangat praktikal untuk perdagangan jangka pendek. Dengan terus mengoptimumkan parameter, logik kemasukan yang ketat, dan pengurusan risiko yang lebih baik, kestabilan dan keuntungan dapat ditingkatkan lagi. Ia sesuai untuk peniaga jangka pendek dengan beberapa pengalaman, tetapi risiko mesti dikawal untuk mengelakkan kerugian besar.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Forex scalper 2xEMA + SRSI + MACD", shorttitle="Forex scalper 5-15min", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(4, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 10)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// 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_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, 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((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=columns, color=lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=columns, color=red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(200)
sl=input(200)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=tp,  loss=sl, when=touch  )
strategy.exit("x_short", "short",profit=tp, loss=sl,when = touch )

Lebih lanjut