Strategi panjang gabungan momentum dan purata bergerak

Penulis:ChaoZhang, Tarikh: 2024-02-29 11:57:18
Tag:

img

Ringkasan

Strategi ini menggabungkan penunjuk momentum MACD dan penunjuk trend DMI untuk pergi lama apabila syarat dipenuhi. Keluarannya menetapkan keuntungan yang tetap dan hentian volatiliti tersuai untuk mengunci keuntungan.

Prinsip-prinsip

Entri strategi ini bergantung kepada penunjuk MACD dan DMI:

  • Apabila MACD positif (garis MACD di atas garis isyarat), ia menunjukkan penguatan momentum menaik di pasaran
  • Apabila DI + lebih tinggi daripada DI- dalam DMI, ia menunjukkan pasaran berada dalam trend menaik

Apabila kedua-dua syarat dipenuhi pada masa yang sama, pergi panjang.

Terdapat dua standard untuk keluar kedudukan:

  • Keuntungan tetap: harga penutupan meningkat kepada peratusan yang ditetapkan untuk keuntungan
  • Volatiliti trailing stop loss: gunakan ATR dan harga tertinggi terkini untuk mengira kedudukan stop loss yang diselaraskan secara dinamik.

Kelebihan

  • Gabungan MACD dan DMI dapat menentukan arah trend pasaran dengan lebih dipercayai dan mengurangkan operasi yang salah
  • Keadaan mengambil keuntungan menggabungkan keuntungan tetap dan turun naik stop loss yang boleh dengan fleksibel mengunci keuntungan

Risiko

  • Kedua-dua MACD dan DMI boleh menghasilkan isyarat palsu, yang membawa kepada kerugian yang tidak perlu
  • Keuntungan tetap boleh menghalang keuntungan daripada memaksimumkan
  • Kelajuan penghentian turun naik mungkin tidak disesuaikan dengan betul, terlalu agresif atau konservatif

Arahan pengoptimuman

  • Pertimbangkan untuk menambah penunjuk lain untuk menapis isyarat kemasukan, seperti menggunakan penunjuk KDJ untuk menentukan sama ada ia terlalu banyak dibeli atau terlalu banyak dijual
  • Parameter yang berbeza boleh diuji untuk mengambil keuntungan yang lebih baik dan hentikan kesan kerugian
  • Parameter seperti purata bergerak boleh diselaraskan mengikut jenis perdagangan tertentu untuk mengoptimumkan sistem

Ringkasan

Strategi ini menghimpunkan pelbagai penunjuk untuk menilai trend dan keadaan pasaran, dan campur tangan dalam situasi dengan kebarangkalian yang agak besar.


/*backtest
start: 2024-01-29 00:00:00
end: 2024-02-28 00:00:00
period: 2h
basePeriod: 15m
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/
//@version=4
strategy(shorttitle='(MACD + DMI Scalping with Volatility Stop',title='MACD + DMI Scalping with Volatility Stop by (Coinrule)', overlay=true, initial_capital = 100, process_orders_on_close=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type=strategy.commission.percent, commission_value=0.1)

// Works better on 3h, 1h, 2h, 4h

//Backtest dates
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2021, title = "From Year",       type = input.integer, minval = 1970)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2112, title = "Thru Year",       type = input.integer, minval = 1970)

showDate  = input(defval = true, title = "Show Date Range", type = input.bool)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true

// DMI and MACD inputs and calculations

[pos_dm, neg_dm, avg_dm] = dmi(14, 14)
[macd, macd_signal, macd_histogram] = macd(close, 12, 26, 9)


Take_profit= ((input (3))/100)

longTakeProfit = strategy.position_avg_price * (1 + Take_profit)

length = input(20, "Length", minval = 2)
src = input(close, "Source")
factor = input(2.0, "vStop Multiplier", minval = 0.25, step = 0.25)
volStop(src, atrlen, atrfactor) =>
    var max     = src
    var min     = src
    var uptrend = true
    var stop    = 0.0
    atrM        = nz(atr(atrlen) * atrfactor, tr)
    max         := max(max, src)
    min         := min(min, src)
    stop        := nz(uptrend ? max(stop, max - atrM) : min(stop, min + atrM), src)
    uptrend     := src - stop >= 0.0
    if uptrend != nz(uptrend[1], true)
        max    := src
        min    := src
        stop   := uptrend ? max - atrM : min + atrM
    [stop, uptrend]

[vStop, uptrend] = volStop(src, length, factor)


closeLong = close > longTakeProfit or crossunder(close, vStop)


//Entry 
strategy.entry(id="long", long = true, when = crossover(macd, macd_signal) and pos_dm > neg_dm and window())


//Exit
strategy.close("long", when = closeLong and window())


Lebih lanjut