Strategi berbalik arah


Tarikh penciptaan: 2023-11-17 16:56:24 Akhirnya diubah suai: 2023-11-17 16:56:24
Salin: 1 Bilangan klik: 345
1
fokus pada
1141
Pengikut

Strategi berbalik arah

Gambaran keseluruhan

Strategi pembalikan purata bergerak berganda (bahasa Inggeris: dual moving average reversion strategy) adalah strategi pembalikan purata bergerak jangka pendek yang tipikal. Strategi ini menggunakan dua set parameter yang berbeza untuk memberi isyarat perdagangan dan mengambil keuntungan apabila trend berubah.

Prinsip Strategi

Strategi ini menggunakan dua garis rata untuk menghasilkan isyarat perdagangan. Pertama, pembukaan garis rata digunakan untuk menentukan arah trend, dan kedua, penutupan garis rata digunakan untuk menghantar isyarat perdagangan.

Apabila maopening naik, menunjukkan bahawa ia kini berada dalam fasa naik trend; apabila maopening turun, menunjukkan bahawa ia kini berada dalam fasa menurun trend. Maclosing dikalikan dengan faktor yang lebih besar daripada 1, menjadikannya lebih sensitif, dapat menghantar isyarat pembalikan lebih awal.

Khususnya, apabila maopening naik dan maclosing turun melalui maopening, menunjukkan perubahan trend, maka strategi akan membuka posisi kosong; apabila maopening turun dan maclosing melalui maopening, menunjukkan perubahan trend, maka strategi akan membuka posisi lebih banyak.

Parameter strategi ini termasuk jenis garis rata-rata, panjang, sumber data, dan lain-lain, yang boleh disesuaikan dengan parameter ini untuk mendapatkan kesan perdagangan yang lebih baik. Selain itu, strategi ini juga mempunyai beberapa pilihan, seperti cara membuka kedudukan, cara menghentikan kerugian, dan lain-lain, yang boleh disesuaikan mengikut keperluan.

Analisis kelebihan

Kelebihan strategi pembalikan dua garis rata antara lain:

  1. Pengunduran kecil, sesuai untuk perdagangan garis pendek. Dengan menggunakan dua garis rata-rata cepat, anda dapat menangkap perubahan tren jangka pendek dengan cepat, pengunduran kecil.

  2. Kesimpulannya, ia mudah difahami. Bentuk dua garis yang bersilang adalah isyarat perdagangan, sangat mudah dan jelas.

  3. Pelbagai parameter boleh disesuaikan, boleh dioptimumkan. Parameter dan faktor yang mengandungi 2 garis purata, boleh dioptimumkan untuk mencari kombinasi parameter terbaik.

  4. Boleh dijadualkan, sesuai untuk perdagangan automatik. Logik strategi mudah dan jelas, frekuensi pelaksanaan tinggi, sangat sesuai untuk pengaturcaraan untuk mewujudkan perdagangan automatik.

  5. Risiko yang boleh dikawal, mempunyai mekanisme berhenti rugi. Anda boleh menetapkan berhenti bergerak atau berhenti berangka, anda boleh mengawal kerugian tunggal.

Analisis risiko

Ini adalah salah satu daripada beberapa risiko yang boleh dihadapi oleh strategi ini:

  1. Persilangan dua garis rata berada di belakang. Garis rata itu sendiri berada di belakang harga, dan trend mungkin telah berbalik untuk beberapa waktu ketika persilangan berlaku.

  2. Ia boleh menyebabkan kemerosotan yang tidak berkekalan, dan ia boleh menyebabkan kemerosotan yang tidak berkekalan.

  3. Penarikan balik masih wujud. Penangguhan tepat pada masanya dapat mengurangkan kerugian tunggal, tetapi penangguhan berterusan juga menyebabkan penarikan balik yang lebih besar.

  4. Risiko pengoptimuman data. Parameter pengoptimuman berlebihan, prestasi baik dalam data sejarah tetapi tidak berkesan dalam cakera hidup.

Penyelesaian untuk menghadapi risiko termasuk:

  1. Optimumkan parameter untuk mencari tetapan garis rata yang cepat bertindak balas.

  2. Mengelakkan penangkapan bersama-sama dengan petunjuk lain, seperti petunjuk harga kuantitatif, indikator kadar turun naik, dan sebagainya.

  3. Menyesuaikan kedudukan hentian untuk mengurangkan kebarangkalian hentian berterusan.

  4. Ujian pengoptimuman pelbagai parameter untuk menilai kekuatan parameter.

Arah pengoptimuman

Strategi pembalikan dua garis sejajar boleh dioptimumkan dalam beberapa aspek:

  1. Uji pelbagai jenis garis rata untuk mencari garis rata yang lebih sensitif terhadap tindak balas. Seperti Kama, ZLEMA dan lain-lain.

  2. Mengoptimumkan parameter garis purata untuk mencari kombinasi panjang yang optimum.

  3. Uji sumber data yang berbeza, seperti harga penutupan, harga purata, harga tipikal dan sebagainya.

  4. Tambah penapis trend untuk mengelakkan isyarat pembalikan yang tidak sesuai. Saluran Donchian boleh digunakan, dan sebagainya.

  5. Digabungkan dengan petunjuk lain, seperti petunjuk harga kuantiti MACD, OBV dan sebagainya.

  6. Menambah mekanisme pengurusan risiko, seperti berhenti bergerak, kerugian maksimum akaun, dan sebagainya.

  7. Mengoptimumkan portfolio untuk mencari perkadaran aset terbaik.

  8. Menambah ujian kekuatan parameter untuk menilai risiko parameter yang terlalu optimum.

ringkaskan

Strategi berbalik dua baris adalah strategi garis pendek yang mudah dan praktikal yang sesuai untuk menangkap perubahan jangka pendek di pasaran. Strategi ini berundur kecil, mudah dilaksanakan, sangat sesuai untuk perdagangan kuantitatif. Tetapi ada juga beberapa masalah, seperti risiko ketinggalan zaman, kurungan, dan lain-lain.

Kod sumber strategi
/*backtest
start: 2023-10-17 00:00:00
end: 2023-11-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title = "hamster-bot MRS 2", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 9, commission_value = 0.045, backtest_fill_limits_assumption = 1)
info_options = "Options"

on_close = input(false, title = "Entry on close", inline=info_options, group=info_options)
OFFS = input.int(0, minval = 0, maxval = 1, title = "| Offset View", inline=info_options, group=info_options)
trade_offset = input.int(0, minval = 0, maxval = 1, title = "Trade", inline=info_options, group=info_options)
use_kalman_filter = input.bool(false, title="Use Kalman filter", group=info_options)

//MA Opening
info_opening = "MA Opening"
maopeningtyp = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_opening, group=info_opening)
maopeningsrc = input.source(ohlc4, title = "", inline=info_opening, group=info_opening)
maopeninglen = input.int(3, minval = 1, maxval = 200, title = "", inline=info_opening, group=info_opening)

//MA Closing
info_closing = "MA Closing"
maclosingtyp = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_closing, group=info_closing)
maclosingsrc = input.source(ohlc4, title = "", inline=info_closing, group=info_closing)
maclosinglen = input.int(3, minval = 1, maxval = 200, title = "", inline=info_closing, group=info_closing)
maclosingmul = input.float(1, step = 0.005, title = "mul", inline=info_closing, group=info_closing)

long1on    = input(true, title = "", inline = "long1")
long1shift = input.float(0.96, step = 0.005, title = "Long", inline = "long1")
long1lot   = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "long1")
short1on    = input(true, title = "", inline = "short1")
short1shift = input.float(1.04, step = 0.005, title = "short", inline = "short1")
short1lot   = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "short1")
startTime = input(timestamp("01 Jan 2010 00:00 +0000"), "Start date", inline = "period")
finalTime = input(timestamp("31 Dec 2030 23:59 +0000"), "Final date", inline = "period")

HMA(_src, _length) =>  ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
EHMA(_src, _length) =>  ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
THMA(_src, _length) =>  ta.wma(ta.wma(_src,_length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)
tema(sec, length)=>
    tema1= ta.ema(sec, length)
    tema2= ta.ema(tema1, length)
    tema3= ta.ema(tema2, length)
    tema_r = 3*tema1-3*tema2+tema3
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
ATR_func(_src, _len)=>
    atrLow = low - ta.atr(_len)
    trailAtrLow = atrLow
    trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]
    supportHit = _src <= trailAtrLow
    trailAtrLow := supportHit ? atrLow : trailAtrLow
    trailAtrLow
f_dema(src, len)=>
    EMA1 = ta.ema(src, len)
    EMA2 = ta.ema(EMA1, len)
    DEMA = (2*EMA1)-EMA2
f_zlema(src, period) =>
    lag = math.round((period - 1) / 2)
    ema_data = src + (src - src[lag])
    zl= ta.ema(ema_data, period)
f_kalman_filter(src) =>
    float value1= na
    float value2 = na
    value1 := 0.2 * (src - src[1]) + 0.8 * nz(value1[1])
    value2 := 0.1 * (ta.tr) + 0.8 * nz(value2[1])
    lambda = math.abs(value1 / value2)
    alpha = (-math.pow(lambda, 2) + math.sqrt(math.pow(lambda, 4) + 16 * math.pow(lambda, 2)))/8
    value3 = float(na)
    value3 := alpha * src + (1 - alpha) * nz(value3[1])
//SWITCH
ma_func(modeSwitch, src, len, use_k_f=true) =>
      modeSwitch == "SMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.sma(src, len))  : ta.sma(src, len) :
      modeSwitch == "RMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.rma(src, len))  : ta.rma(src, len) :
      modeSwitch == "EMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.ema(src, len))  : ta.ema(src, len) :
      modeSwitch == "TEMA"  ? use_kalman_filter and use_k_f ? f_kalman_filter(tema(src, len))    : tema(src, len):
      modeSwitch == "DEMA"  ? use_kalman_filter and use_k_f ? f_kalman_filter(f_dema(src, len))  : f_dema(src, len):
      modeSwitch == "ZLEMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(f_zlema(src, len)) : f_zlema(src, len):
      modeSwitch == "WMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.wma(src, len))  : ta.wma(src, len):
      modeSwitch == "VWMA"  ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.vwma(src, len)) : ta.vwma(src, len):
      modeSwitch == "Hma"   ? use_kalman_filter and use_k_f ? f_kalman_filter(HMA(src, len))     : HMA(src, len):
      modeSwitch == "Ehma"  ? use_kalman_filter and use_k_f ? f_kalman_filter(EHMA(src, len))    : EHMA(src, len):
      modeSwitch == "Thma"  ? use_kalman_filter and use_k_f ? f_kalman_filter(THMA(src, len/2))  : THMA(src, len/2):
      modeSwitch == "ATR"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ATR_func(src, len)): ATR_func(src, len) :
      modeSwitch == "L"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.lowest(len)): ta.lowest(len) :
      modeSwitch == "H"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.highest(len)): ta.highest(len) :
      modeSwitch == "DMA"   ? donchian(len) : na

//Var
sum = 0.0
maopening = 0.0
maclosing = 0.0
os = maopeningsrc
cs = maclosingsrc
pos = strategy.position_size
p = 0.0
p := pos == 0 ? (strategy.equity / 100) / close : p[1]
truetime = true
loss = 0.0
maxloss = 0.0
equity = 0.0

//MA Opening
maopening := ma_func(maopeningtyp, maopeningsrc, maopeninglen)

//MA Closing
maclosing := ma_func(maclosingtyp, maclosingsrc, maclosinglen) * maclosingmul

long1 = long1on == false ? 0 : long1shift == 0 ? 0 : long1lot == 0 ? 0 : maopening == 0 ? 0 : maopening * long1shift
short1 = short1on == false ? 0 : short1shift == 0 ? 0 : short1lot == 0 ? 0 : maopening == 0 ? 0 : maopening * short1shift
//Colors
maopeningcol = maopening == 0 ? na : color.blue
maclosingcol = maclosing == 0 ? na : color.fuchsia
long1col = long1 == 0 ? na : color.green
short1col = short1 == 0 ? na : color.red
//Lines
plot(maopening, offset = OFFS, color = maopeningcol)
plot(maclosing, offset = OFFS, color = maclosingcol)
long1line = long1 == 0 ? close : long1
short1line = short1 == 0 ? close : short1
plot(long1line, offset = OFFS, color = long1col)
plot(short1line, offset = OFFS, color = short1col)

//Lots
lotlong1 = p * long1lot
lotshort1 = p * short1lot

//Entry
if maopening > 0 and maclosing > 0 and truetime
    //Long
    sum := 0
    strategy.entry("L", strategy.long, lotlong1, limit = on_close ? na : long1, when = long1 > 0 and pos <= sum and (on_close ? close <= long1[trade_offset] : true))
    sum := lotlong1

    //Short
    sum := 0
    pos := -1 * pos
    strategy.entry("S", strategy.short, lotshort1, limit = on_close ? na : short1, when = short1 > 0 and pos <= sum and (on_close ? close >= short1[trade_offset] : true))
    sum := lotshort1

strategy.exit("Exit", na, limit = maclosing)
if time > finalTime
    strategy.close_all()