Strategi perdagangan kuantitatif tekanan dua arah


Tanggal Pembuatan: 2023-11-02 13:56:23 Akhirnya memodifikasi: 2023-11-02 13:56:23
menyalin: 0 Jumlah klik: 633
1
fokus pada
1617
Pengikut

Strategi perdagangan kuantitatif tekanan dua arah

Ringkasan

Strategi perdagangan dua arah adalah strategi pelacakan tren yang menggabungkan indikator acak dan indikator volume. Strategi ini terutama menggunakan garis K dan D indikator acak dan indikator volume untuk menghasilkan sinyal beli dan jual, ditambah dengan garpu garis lurus dan garpu mati untuk menghasilkan sinyal tambahan.

Prinsip Strategi

Sinyal pembelian

Logika pemicu utama dari sinyal pembelian adalah:

  1. Garis K dan Garis D pada saat yang sama menembus zona oversold (misalnya 20), dan menghasilkan persilangan ke atas, dan Garis K dan Garis D pada saat yang sama berada dalam tren naik

  2. Volume transaksi lebih tinggi dari batas tertentu (misalnya 1,4 kali volume transaksi rata-rata)

  3. Harga penutupan lebih tinggi dari harga pembukaan (garis K putih)

Sinyal pembelian tambahan mungkin berasal dari:

  1. Fork rata-rata: melewati garis EMA lambat pada garis EMA cepat, dan dua garis rata-rata naik secara bersamaan

  2. Garis K dan Garis D secara bersamaan masuk ke zona oversold dari posisi rendah (misalnya naik dari bawah 20 ke kisaran 20 sampai 80)

Menjual sinyal

Logika pemicu utama dari sinyal jual adalah:

  1. Garis K dan Garis D masuk ke zona oversold (misalnya 80)

  2. Fork mati rata-rata: EMA cepat di bawah EMA lambat

  3. Garis K melewati Garis D, dan Garis K dan Garis D pada saat yang sama dalam tren menurun

Sinyal berhenti

Tetapkan persentase tertentu dari harga beli (misalnya 6%) sebagai garis stop loss yang akan memicu stop loss sell jika harga turun dari garis tersebut.

Analisis Keunggulan Strategi

  • Menghindari sinyal palsu dengan menggunakan indikator ganda acak
  • Kombinasi penyaringan kebisingan lalu lintas untuk memastikan tren
  • Multi-Signal Overlapping, Meningkatkan Akurasi
  • Garis rata-rata membantu menentukan arah tren besar
  • Menetapkan strategi stop loss dan mengendalikan risiko

Keuntungan 1: Indikator acak ganda menghindari sinyal palsu

Sebuah indikator acak tunggal dapat menghasilkan sejumlah besar sinyal palsu. Strategi ini menggunakan kombinasi indikator acak ganda K-line dan D-line (moving average of K-line) yang dapat secara efektif memfilter sinyal palsu dan memastikan keandalan sinyal.

Keuntungan 2: Menyaring kebisingan lalu lintas, memastikan tren

Termasuk kondisi volume transaksi sebagai kriteria penilaian tambahan, yang mengharuskan volume transaksi untuk melebihi tingkat tertentu, sehingga menyaring titik jual beli non-trending yang rendah, mengurangi risiko pegangan.

Keuntungan 3: Lebih akurat dengan sinyal yang saling bertumpuk

Strategi ini menggabungkan beberapa sinyal jual beli dari indikator acak, volume, dan rata-rata yang harus dipicu secara bersamaan untuk menghasilkan sinyal perdagangan yang sebenarnya. Berbagai indikator yang ditumpuk dapat meningkatkan keandalan sinyal.

Keunggulan 4: Garis rata membantu menentukan arah tren besar

Menambahkan aturan penilaian garis rata-rata, misalnya hanya mempertimbangkan sinyal beli ketika garis rata-rata naik dengan cepat dan lambat. Ini dapat menghindari pembelian berlawanan atau puncak, dan menilai tren dari periode waktu yang lebih besar.

Keuntungan 5: Setel strategi stop loss untuk mengontrol risiko

Strategi ini mengandung desain sinyal stop loss yang secara otomatis berhenti jika harga turun di bawah persentase tertentu saat membeli. Ini dapat secara efektif mengontrol kerugian maksimum dalam satu perdagangan.

Analisis risiko

  • Parameter kebijakan perlu debug dengan hati-hati, pengaturan yang tidak tepat dapat menyebabkan kinerja yang buruk
  • Pengaturan titik henti perlu mempertimbangkan risiko melompat
  • Perhatian terhadap risiko likuiditas varietas yang diperdagangkan
  • Perhatian terhadap risiko urutan dalam indikator multi-siklus

Risiko 1: Parameter strategi yang perlu di-debug dengan hati-hati

Strategi ini terdiri dari beberapa parameter, seperti parameter acak, parameter rata-rata, dan parameter volume transaksi. Parameter ini perlu dioptimalkan untuk varietas yang berbeda, dan pengaturan yang tidak tepat dapat menyebabkan hasil yang kurang memuaskan.

Risiko 2: Pengaturan Stop Loss Mengingat Risiko Terbang

Jika stop loss terlalu dekat dengan harga pembelian, stop loss yang tidak perlu dapat terjadi.

Risiko 3: Perhatian terhadap risiko likuiditas pada varietas yang diperdagangkan

Untuk varietas dengan mobilitas yang kurang baik, aturan kuantitas kawin dapat menyaring sinyal yang berlebihan. Pada saat ini perlu untuk menurunkan batasan kondisi kuantitas kawin.

Risiko 4: Risiko urutan bit untuk indikator multi-siklus waktu

Masalah yang mungkin terjadi antara indikator periode yang berbeda adalah ketidakkonsistenan urutan bit, yang dapat mempengaruhi akurasi sinyal. Perlu untuk memverifikasi urutan titik sinyal yang konsisten.

Arah optimasi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Optimalkan parameter untuk meningkatkan stabilitas

  2. Menambahkan parameter penyesuaian dinamis untuk metode pembelajaran mesin

  3. Optimalkan strategi stop loss untuk mengurangi stop loss

  4. Menambahkan lebih banyak filter mengurangi jumlah transaksi

  5. Mencoba strategi conditional or stop-loss untuk meningkatkan yield

Arah 1: Optimalkan parameter untuk meningkatkan stabilitas

Parameter utama dapat dioptimalkan melalui metode yang lebih sistematis seperti algoritma genetik, memastikan bahwa parameter dapat memperoleh kinerja yang stabil dalam berbagai siklus pasar.

Arah 2: Menambahkan parameter penyesuaian dinamis metode pembelajaran mesin

Model dapat dilatih untuk mengevaluasi kondisi pasar secara real-time, dan menyesuaikan parameter strategi sesuai dengan itu, untuk mengoptimalkan parameter secara dinamis.

Arah 3: Mengoptimalkan strategi stop loss untuk mengurangi stop loss

Anda dapat mempelajari strategi stop loss yang lebih baik, mengurangi stop loss yang tidak perlu, dan meningkatkan ruang untuk keuntungan, sambil tetap mengendalikan risiko.

Arah 4: Tambahkan lebih banyak filter untuk mengurangi jumlah transaksi

Meningkatkan kondisi penyaringan dengan tepat untuk mengurangi jumlah transaksi, mengurangi dampak biaya transaksi, dan menghasilkan keuntungan yang lebih tinggi dari setiap transaksi.

Arah 5: Mencoba strategi conditional or stop-loss untuk meningkatkan tingkat pengembalian

Bisa sesuai dengan karakteristik pasar, desain kondisi strategi tunggal atau strategi stop-loss bergerak, sambil menjamin stop loss, semaksimal mungkin dalam keuntungan posisi setara.

Meringkaskan

Strategi ini secara komprehensif mempertimbangkan beberapa aspek seperti penilaian tren, kontrol risiko, dan frekuensi perdagangan. Keunggulan utama adalah indikator acak ganda yang menggabungkan penilaian tren indikator kuantitas, dan mekanisme stop loss yang dikendalikan risiko. Langkah selanjutnya dapat dioptimalkan dari segi meningkatkan stabilitas parameter, menyesuaikan parameter secara dinamis, dan mengurangi stop loss, sehingga strategi dapat memperoleh keuntungan yang stabil di lebih banyak lingkungan pasar.

Kode Sumber Strategi
/*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)