Strategi Perdagangan Kuantitatif Tekanan Ganda

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

img

Gambaran umum

Strategi perdagangan kuantitatif Dual Pressure adalah strategi mengikuti tren yang menggabungkan indikator Stochastic dan volume.

Logika Strategi

Beli Sinyal

Sinyal beli utama diaktifkan ketika:

  1. Kedua garis K dan D menyeberang di bawah area oversold (misalnya 20) dan berbalik ke atas, dan kedua K dan D naik

  2. Volume di atas ambang batas (misalnya 1,4 kali volume rata-rata)

  3. Tutup adalah di atas terbuka (lilin putih)

Sinyal pembelian tambahan dapat datang dari:

  1. EMA yang cepat melintasi EMA yang lambat, keduanya naik

  2. Baik K dan D naik dari zona rendah ke zona tengah (misalnya dari bawah 20 menjadi 20-80)

Jual Sinyal

Sinyal jual utama diaktifkan ketika:

  1. Baik K dan D masuk ke area overbought (misalnya di atas 80)

  2. Death cross: EMA cepat melintasi EMA lambat

  3. K melintasi bawah D, dan kedua K dan D jatuh

Hentikan Kerugian

Persentase (misalnya 6%) di bawah harga beli ditetapkan sebagai level stop loss.

Analisis Keuntungan

  • Dual stochastic menghindari sinyal palsu
  • Volume menyaring kebisingan dan memastikan tren
  • Beberapa sinyal yang dikombinasikan meningkatkan akurasi
  • Rata-rata bergerak mendukung tren keseluruhan
  • Stop loss mengontrol risiko

Keuntungan 1: Dual Stochastic Menghindari Sinyal Palsu

Stokastik tunggal dapat menghasilkan banyak sinyal palsu. Kombinasi stokastik ganda menyaring sinyal palsu dan meningkatkan keandalan.

Keuntungan 2: Volume Menyaring Kebisingan dan Memastikan Tren

Kondisi volume menyaring titik-titik non-trend volume rendah dan mengurangi risiko terjebak.

Keuntungan 3: Berbagai Sinyal Meningkatkan Keakuratan

Beberapa indikator harus selaras untuk memicu sinyal perdagangan yang nyata.

Keuntungan 4: Rata-rata Bergerak Membantu Tren Umum

Aturan seperti rata-rata bergerak ganda memastikan sinyal sejajar dengan tren keseluruhan.

Keuntungan 5: Stop Loss Mengontrol Risiko

Logika stop loss mewujudkan keuntungan dan mengendalikan kerugian pada perdagangan tunggal.

Analisis Risiko

  • Parameter perlu optimasi hati-hati, pengaturan yang tidak benar menyebabkan kinerja yang buruk
  • Penempatan stop loss harus mempertimbangkan risiko gap
  • Risiko likuiditas harus dipantau untuk instrumen perdagangan
  • Masalah melihat kembali antara kerangka waktu yang berbeda

Risiko 1: Parameter Perlu Dioptimalkan Dengan Hati-Hati

Strategi memiliki beberapa parameter. Mereka perlu optimasi untuk instrumen yang berbeda, jika tidak kinerja menderita.

Risiko 2: Penempatan Stop Loss Harus Mempertimbangkan Risiko Gap

Titik stop loss harus memperhitungkan skenario celah harga.

Risiko 3: Memantau Risiko Likuiditas

Untuk instrumen tidak likuid, aturan volume dapat menyaring terlalu banyak sinyal.

Risiko 4: Masalah Melihat Kembali Antara Kerangka Waktu

Kesalahan keselarasan antara sinyal pada kerangka waktu yang berbeda mungkin terjadi.

Peluang Peningkatan

Strategi ini dapat ditingkatkan di bidang-bidang seperti:

  1. Mengoptimalkan parameter untuk ketahanan

  2. Memperkenalkan pembelajaran mesin untuk parameter adaptif

  3. Meningkatkan strategi stop loss untuk mengurangi tingkat stop loss

  4. Tambahkan filter untuk mengurangi frekuensi perdagangan

  5. Jelajahi perintah bersyarat atau mengambil keuntungan untuk meningkatkan imbalan

Peluang 1: Optimalkan Parameter untuk Ketahanan

Metode seperti algoritma genetik dapat secara sistematis mengoptimalkan parameter untuk stabilitas di seluruh rezim pasar.

Peluang 2: Memperkenalkan Pembelajaran Mesin untuk Parameter Adaptif

Model dapat menilai kondisi pasar dan menyesuaikan parameter sesuai, mencapai optimasi dinamis.

Kesempatan 3: Meningkatkan strategi stop loss untuk mengurangi tingkat stop loss

Algoritma stop loss yang lebih baik dapat mengurangi stop yang tidak perlu sambil menjaga pengendalian risiko.

Peluang 4: Tambahkan Filter untuk Mengurangi Frekuensi Perdagangan

Memperkuat filter dapat mengurangi frekuensi perdagangan, menurunkan biaya, dan meningkatkan hasil per perdagangan.

Peluang 5: Jelajahi Pemesanan Bersyarat atau Mengambil Keuntungan

Menurut kondisi pasar, perintah bersyarat atau strategi mengambil keuntungan dapat lebih memaksimalkan keuntungan sambil mengendalikan risiko.

Kesimpulan

Strategi ini menyeimbangkan tren, pengendalian risiko, biaya dan aspek lainnya. Keuntungan utamanya adalah stokastik ganda ditambah volume untuk tren dan stop loss untuk pengendalian risiko. Langkah selanjutnya adalah meningkatkan ketahanan, parameter adaptif, pengoptimalan stop loss dll untuk menghasilkan keuntungan yang stabil dalam lebih banyak rezim pasar.


/*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 banyak