Strategi Dagangan Kuantitatif Tekanan Berganda

Penulis:ChaoZhang, Tarikh: 2023-11-02 13:56:23
Tag:

img

Ringkasan

Strategi perdagangan kuantitatif Tekanan Berganda adalah strategi trend berikut yang menggabungkan penunjuk Stochastic dan jumlah. Ia terutamanya menggunakan garis Stochastic K dan D bersama dengan penunjuk jumlah untuk menjana isyarat beli dan jual, dilengkapi dengan persilangan purata bergerak untuk isyarat tambahan.

Logika Strategi

Beli Isyarat

Isyarat beli utama diaktifkan apabila:

  1. Kedua-dua garis K dan D menyeberangi di bawah kawasan oversold (contohnya 20) dan bertukar ke atas, dan kedua-dua K dan D meningkat

  2. Volume melebihi ambang (contohnya 1.4 kali jumlah purata)

  3. Tutup adalah di atas terbuka (lilin putih)

Isyarat beli tambahan boleh datang dari:

  1. Gelang emas: EMA pantas melintasi EMA perlahan, kedua-duanya meningkat

  2. Kedua-dua K dan D naik dari zon rendah ke zon tengah (contohnya dari bawah 20 ke 20-80)

Jual Isyarat

Isyarat jual utama mencetuskan apabila:

  1. Kedua-dua K dan D memasuki kawasan overbought (contohnya di atas 80)

  2. Pembebasan kematian: EMA pantas melintasi EMA perlahan

  3. K menyeberang di bawah D, dan kedua-dua K dan D jatuh

Hentikan Kerugian

Peratusan (contohnya 6%) di bawah harga beli ditetapkan sebagai tahap stop loss.

Analisis Kelebihan

  • Stoichastic berganda mengelakkan isyarat palsu
  • Volume menapis bunyi bising dan memastikan trend
  • Pelbagai isyarat digabungkan meningkatkan ketepatan
  • Purata bergerak membantu trend keseluruhan
  • Pengendalian risiko Stop Loss

Kelebihan 1: Dual Stochastic Mengelakkan Isyarat Palsu

Satu stokastik boleh menghasilkan banyak isyarat palsu. gabungan stokastik berganda menapis isyarat palsu dan meningkatkan kebolehpercayaan.

Kelebihan 2: Volume menapis bunyi bising dan memastikan trend

Keadaan jumlah menapis titik-titik yang tidak trend dengan jumlah yang rendah dan mengurangkan risiko terperangkap.

Kelebihan 3: Pelbagai Isyarat Meningkatkan Keakuratan

Pelbagai penunjuk mesti sejajar untuk mencetuskan isyarat perdagangan sebenar. Ini meningkatkan kebolehpercayaan isyarat.

Kelebihan 4: Purata Bergerak Membantu Trend Umum

Peraturan seperti purata bergerak berganda memastikan isyarat sejajar dengan trend keseluruhan.

Kelebihan 5: Hentikan Kerugian Mengendalikan Risiko

Logik stop loss mewujudkan keuntungan dan mengawal kerugian pada perdagangan tunggal.

Analisis Risiko

  • Parameter memerlukan pengoptimuman yang teliti, tetapan yang tidak betul membawa kepada prestasi yang buruk
  • Penempatan stop loss mesti mengambil kira risiko jurang
  • Risiko kecairan harus dipantau untuk instrumen dagangan
  • Masalah melihat balik antara jangka masa yang berbeza

Risiko 1: Parameter Perlu Dioptimumkan dengan Teliti

Strategi ini mempunyai pelbagai parameter. Mereka memerlukan pengoptimuman untuk instrumen yang berbeza, jika tidak prestasi menderita.

Risiko 2: Penempatan Stop Loss mesti mempertimbangkan risiko jurang

Titik stop loss harus mengambil kira senario celah harga. Ia tidak boleh terlalu dekat dengan harga beli.

Risiko 3: Memantau Risiko Kecairan

Untuk instrumen tidak cair, peraturan jumlah mungkin menapis terlalu banyak isyarat.

Risiko 4: Isu Lihat Kembali Antara Jangka Masa

Kesesuaian antara isyarat pada jangka masa yang berbeza mungkin berlaku. Isyarat mesti disahkan untuk sepadan.

Peluang Peningkatan

Strategi ini boleh ditingkatkan dalam bidang seperti:

  1. Mengoptimumkan parameter untuk ketahanan

  2. Memperkenalkan pembelajaran mesin untuk parameter penyesuaian

  3. Meningkatkan strategi stop loss untuk mengurangkan kadar stop loss

  4. Tambah penapis untuk mengurangkan kekerapan perdagangan

  5. Meneroka perintah bersyarat atau mengambil keuntungan untuk meningkatkan ganjaran

Peluang 1: Mengoptimumkan Parameter untuk Ketahanan

Kaedah seperti algoritma genetik dapat secara sistematik mengoptimumkan parameter untuk kestabilan di seluruh rejim pasaran.

Peluang 2: Memperkenalkan Pembelajaran Mesin untuk Parameter Penyesuaian

Model boleh menilai keadaan pasaran dan menyesuaikan parameter dengan sewajarnya, mencapai pengoptimuman dinamik.

Peluang 3: Meningkatkan strategi Stop Loss untuk mengurangkan kadar Stop Loss

Algoritma stop loss yang lebih baik dapat mengurangkan berhenti yang tidak perlu sambil mengekalkan kawalan risiko.

Peluang 4: Tambah penapis untuk mengurangkan kekerapan perdagangan

Meningkatkan penapis boleh mengurangkan kekerapan perdagangan, mengurangkan kos, dan meningkatkan pulangan setiap perdagangan.

Peluang 5: Jelajahi Perintah Bersyarat atau Mengambil Keuntungan

Menurut keadaan pasaran, pesanan bersyarat atau strategi mengambil keuntungan dapat memaksimumkan keuntungan dengan lebih baik sambil mengawal risiko.

Kesimpulan

Strategi ini menyeimbangkan trend, kawalan risiko, kos dan aspek lain. Kelebihan teras adalah dua stokastik ditambah jumlah untuk trend dan stop loss untuk kawalan risiko. Langkah seterusnya adalah untuk meningkatkan ketahanan, parameter adaptif, pengoptimuman stop loss dan lain-lain untuk menghasilkan keuntungan yang stabil dalam lebih banyak rejim pasaran.


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

//@version=3
// SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]
// Script created by Sergio Waldoke (BETA VERSION v0.5, fine tuning PENDING)
// Stochastic process is the main source of signals, reinforced on buying by Volume. Also by Golden Cross.
// Selling is determined by K and D entering overselling zone or EMA's Death Cross signal, the first occurring,
// and some other signals combined.
// Buy Long when you see a long buy arrow.
// Sell when you see a close arrow.
// This is a version to be tuned and improved, but already showing excelent results after tune some parameters
// according to the kind of market.
// Strategy ready for doing backtests.

// SVE SYSTEM DESIGN:
// Buy Signal Trigger:
// - Both Stoch <= 20 crossing up and both growing and green candle and Vol/sma vol >= 1.40 Avg Vol
//   or
// - Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//   both prior Stoch crossing up
//   or
//   [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
// - Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle

// Exit position:
// - Both Stoch <= 20 and Both Stoch were > 20 during position
//   or
// - CrossingUnder(Fast EMA, Medium EMA)
//   or   [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
// - CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line

//calc_on_every_tick=true,
//calc_on_order_fills=true,   (affects historical calculation, triggers in middle of the bar, may be better for automatic orders)
strategy("SW SVE - Stochastic+Vol+EMAs [Sergio Waldoke]", shorttitle="SW SVE", overlay=true, max_bars_back=5000,
         default_qty_type=strategy.percent_of_equity, default_qty_value=100, currency="USD",
         commission_type=strategy.commission.percent, commission_value=0.25)

//Strategy Parameters
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2018, title = "From Year", minval = 2009, maxval = 2200)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 2030, title = "To Year", minval = 2009, maxval = 2200)

//Indicator Parameters
//Original defaults for 4HS: 14, 3, 80, 20,   14, 23, 40,   20, 40,   3:
stoch_k = input(title="Stoch K",  defval=14, minval=1)
stoch_d = input(title="Stoch D",  defval=3, minval=1)
over_buying  = input(title="Stoch Overbuying Zone",  defval=80, minval=0, maxval=100)
over_selling = input(title="Stoch Overselling Zone",  defval=20, minval=0, maxval=100)

fast_ema_periods = input(title="Fast EMA (Death Cross)",  defval=14, minval=1, maxval=600)
slow_ema_periods = input(title="Slow EMA (Death Cross)",  defval=23, minval=1, maxval=600)
trend_ema_periods = input(title="Slowest EMA (Trend Test)",  defval=40, minval=1, maxval=600)

volume_periods = input(title="Volume Periods",  defval=20, minval=1, maxval=600)
volume_factor = input(title="Min Volume/Media Increase (%)",  defval=80, minval=-100) / 100 + 1

threshold_sl_perc = input(title="[Sell Trigger] Stop Loss Threshold %", defval=6.0, type=float, minval=0, maxval=100)

//before_buy = input(title="# Growing Before Buy",  defval=2, minval=1)
//before_sell = input(title="# Decreasing Before Sell",  defval=1, minval=1)
//stepsignal = input(title="Show White Steps", type=bool, defval=true)
//steps_base = input(title="White Steps Base",  defval=242, minval=0)

//Signals
fast_ema = ema(close, fast_ema_periods)
slow_ema = ema(close, slow_ema_periods)
trend_ema = ema(close, trend_ema_periods)
k = stoch(close, high, low, stoch_k)
d = sma(k, stoch_d)
vol_ma = sma(volume, volume_periods)

//REVIEW CONSTANT 1.75:
in_middle_zone(a) => a > over_selling * 1.75 and a < over_buying
growing(a) => a > a[1] 

was_in_middle_zone = k == d
was_in_middle_zone := was_in_middle_zone[1] or in_middle_zone(k) and in_middle_zone(d)

//Buy Signal Trigger:
//- Both Stoch <= 20 crossing up and both growing and 
//  green candle and Vol/sma vol >= 1.40 Avg Vol
buy = k <= over_selling and d <= over_selling and crossover(k, d) and growing(k) and growing(d) and
      close > open and volume/vol_ma >= volume_factor

//or
//- Both Stoch growing up and Vol/sma vol >= 1.40 Avg Vol and green candle and
//  both prior Stoch crossing up
buy := buy or (growing(k) and growing(d) and volume/vol_ma >= volume_factor and close > open and
              crossover(k[1], d[1]) )
//Worse:
//              (crossover(k[1], d[1]) or (crossover(k, d) and k[1] <= over_selling and d[1] <= over_selling) ) )

//or
//  [OPTIONAL]: (Bad for BTC 2018, excelent for 2017)
//- Crossingover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and green candle
buy := buy or (crossover(fast_ema, slow_ema) and growing(fast_ema) and growing(slow_ema) and close > open)


//Debug:
//d1 = close > open  ? 400 : 0
//plot(d1+5200, color=white, linewidth = 3, style = stepline)

//Exit position:
//- Both Stoch <= 20 and Both Stoch were > 20 during position
sell = k <= over_selling and d <= over_selling and was_in_middle_zone

//  or
//- CrossingUnder(Fast EMA, Medium EMA)
sell := sell or crossunder(fast_ema, slow_ema)

//  or  [OPTIONAL] (Better for BTC 2018, Worse for BNB 1H)
//- CrossingUnder(k, d) and (k and d starting over over_buying) and (k and d descending) and k crossing down over_buying line
sell := sell or (crossunder(k, d) and k[1] >= over_buying and d[1] >= over_buying and
                 not growing(k) and not growing(d) and k <= over_buying)

color = buy ? green : red

bought_price = close
bought_price := nz(bought_price[1])

already_bought = false
already_bought := nz(already_bought[1], false)

//Date Ranges
buy  := buy and  not already_bought


//d1 = buy ? 400 : 0
//plot(d1+6500, color=white, linewidth = 3, style = stepline)

was_in_middle_zone := (not buy and was_in_middle_zone) or (in_middle_zone(k) and in_middle_zone(d))

already_bought   := already_bought[1] or buy
bought_price := buy ? close * (1 - threshold_sl_perc/100) : bought_price[1]
trigger_SL = close < bought_price[0]
sell := sell or trigger_SL

sell := sell and  
                 already_bought and not buy and (was_in_middle_zone or trigger_SL)

//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
                 
already_bought   := already_bought[0] and not sell
bought_price := sell ? 0 : bought_price[0]

//plot((was_in_middle_zone?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

was_in_middle_zone := not sell and was_in_middle_zone

//Plot signals
plot(fast_ema, title="Fast EMA", color=red, linewidth = 4)
plot(slow_ema, title="Slow EMA", color=blue, linewidth = 4)
plot(trend_ema, title="Trend EMA", color=yellow, linewidth = 4)

//Stop Loss
plot(bought_price, color=gray, linewidth=2, style=cross, join=true, title="Stop Loss")

//Y = stepsignal ? lowest(40) : na
//Y = steps_base
//plot(mysignal+Y, title="Steps", color=white, linewidth = 3, style = stepline)
//Unit steps - for debugging
//plot(mysteps+Y, title="Steps2", color=yellow, linewidth = 3, style = stepline)

//Bought or not - for debugging
//plot((already_bought?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)
//plot((sell?400:0)+5200, title="Buy-Sell", color=yellow, linewidth = 3, style = stepline)

plotshape(buy, title="Buy arrows", style=shape.arrowup, location=location.belowbar, color=color, text="Buy", textcolor=color, size=size.huge, transp=30)
plotshape(sell, title="Sell arrows", style=shape.arrowdown, location=location.abovebar, color=color, text="Sell", textcolor=color, size=size.huge, transp=30)

//if n>2000
strategy.entry("buy", strategy.long, when=buy)
strategy.close_all(when=sell)

//plot(strategy.equity, title="Equity", color=white, linewidth = 4, style = line)

//AlertS trigger
//msg = "[SW Magic Signals EMA] BUY/SELL Signal has been triggered." + "(" + tostring(fastema) + ", " + tostring(slowema) + ") on " + tickerid + ", " + period + "."
msg = "SW SVE BUY/SELL Signal has been triggered. (#, #) on EXCH:PAIR, period: #."

alertcondition(buy or sell, title="SW SVE (BUY/SELL SIGNAL)", message=msg)
alertcondition(buy, title="SW SVE (BUY SIGNAL)", message=msg)
alertcondition(sell, title="SW SVE (SELL SIGNAL)", message=msg)


Lebih lanjut