Strategi Zigzag Kuantitatif

Penulis:ChaoZhang, Tanggal: 2023-11-21 13:43:24
Tag:

img

Gambaran umum

Tujuan dari strategi ini adalah untuk menguji apakah variabel input yang berbeda seperti warna candlestick, volume dan metode acak dapat digunakan untuk memprediksi perubahan harga dalam bentuk gelombang sinus. Strategi ini mengubah variabel ini menjadi bentuk gelombang sinus. Ketika puncak atau lereng mencapai jumlah waktu yang ditetapkan, keputusan beli atau jual dibuat.

Prinsip Strategi

Strategi ini dibagi menjadi tiga bagian. Bagian pertama mendeteksi perubahan warna lilin. Ketika lilin dengan warna yang berbeda muncul setelah beberapa lilin dengan warna yang sama, gelombang sinus berputar arah. Bagian kedua mendeteksi apakah volume lebih tinggi atau lebih rendah dari rata-rata. Ketika rata-rata rusak, gelombang berputar arah. Bagian ketiga menggunakan metode acak untuk mensimulasikan lemparan koin. Ketika hasil acak berbeda, gelombang berputar arah. Ketika tiga gelombang ini terkumpul hingga jumlah waktu yang ditetapkan, keputusan perdagangan dibuat.

Kode ini mengontrol jalan gelombang dengan melacak arah saat ini, jumlah puncak, dan posisi lilin sebelumnya untuk tiga gelombang. Ketika jumlah puncak mencapai pengaturan parameter, itu mengubah arah berjalan.

Analisis Keuntungan

Teori gelombang sinus ini tampaknya masuk akal, dan bentuk gelombang simulasi juga memiliki beberapa korelasi dengan pasar nyata. tetapi melalui pengujian strategi ini, dapat ditemukan bahwa mereka sebenarnya hasil acak. kombinasi variabel mana yang membuat bentuk gelombang terlihat lebih mirip tidak meningkatkan hasil perdagangan.

Jadi salah satu keuntungan dari strategi ini adalah untuk menyangkal kesalahpahaman bahwa pasar dapat diprediksi. Variabel di pasar memang mempengaruhi harga, tetapi mereka tidak dapat diprediksi, dan keputusan acak juga dapat memperoleh hasil yang sama.

Analisis Risiko

Risiko terbesar dari strategi ini adalah bahwa sulit untuk menentukan keuntungan dan kerugian dalam perdagangan acak. Hasil di bawah parameter yang berbeda juga sulit diprediksi, dan tidak mungkin untuk menentukan sebelumnya apakah itu dapat menguntungkan.

Selain itu, teori prediksi gelombang sinus itu sendiri salah. perubahan pasar terlalu kompleks untuk disimulasikan dengan siklus sederhana. jadi strategi ini tidak benar-benar dapat digunakan untuk perdagangan yang sebenarnya.

Untuk mengurangi risiko, perlu menganalisis lebih lanjut hasil acak untuk menentukan rentang parameter; atau menggabungkan metode analisis lainnya untuk memverifikasi sinyal perdagangan.

Arahan Optimasi

Strategi ini dapat dioptimalkan dalam arah berikut:

  1. Meningkatkan lebih banyak variabel yang dikonversi menjadi gelombang untuk memperluas ruang sampel
  2. Gabungkan tiga gelombang arus untuk menemukan kombinasi traversal terbaik
  3. Mengatur metode stop loss, seperti stop loss persentase
  4. Mengoptimalkan masuk dan keluar logika dan backtest untuk menemukan parameter yang optimal

Ringkasan

Melalui pengujian gelombang sinus yang berbeda, strategi ini menggambarkan sifat pasar yang tidak dapat diprediksi. Pada saat yang sama, juga membantah teori yang salah menggunakan siklus gelombang untuk memprediksi.

Selanjutnya, kepraktisan strategi dapat ditingkatkan dengan meningkatkan variabel, menggabungkan bentuk gelombang, mengatur berhenti, dan mengoptimalkan parameter. Tapi kuncinya masih memahami bahwa perubahan pasar kompleks dan tidak dapat diprediksi. Apa yang perlu kita lakukan adalah mengurangi risiko acak daripada memprediksi pasar.


/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
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/
// © Gentleman-Goat

//@version=5
strategy("Sine Wave Theory",overlay=false, precision = 2, initial_capital = 1000,shorttitle = "SINE_W_T")

var bar_change_wave_direction = input.int(defval=1,title="Starting Wave Direction",group="Bar Change")
bar_change_sine_wave_number = input.int(defval=28,title="Sine Wave #",group="Bar Change")
bar_change_sine_wave_res = input.timeframe(defval="D",title="Resolution",group="Bar Change")
bar_change_trade = input.bool(defval=true,title="Trade",group="Bar Change")

var volume_wave_direction = input.int(defval=1,title="Starting Wave Direction",group="Volume")
avg_volume_length = input.int(7,title="Lookback Length",group="Volume")
volume_sine_wave_number = input.int(defval=28,title="Sine Wave #",group="Volume")
volume_sine_wave_res = input.timeframe(defval="D",title="Resolution",group="Volume")
volume_trade = input.bool(defval=false,title="Trade",group="Volume")

var coin_flip_wave_direction = input.int(defval=1,title="Starting Wave Direction",group="Coin Flip")
coin_flip_sine_wave_number = input.int(defval=28,title="Sine Wave #",group="Coin Flip")
coin_flip_seed = input.int(defval=1,title="Seed #",group="Coin Flip")
coin_flip_trade = input.bool(defval=false,title="Trade",group="Coin Flip")

avg_volume = ta.sma(volume,avg_volume_length)

//Green or Red Candle
bar_color = close>open ? color.green : color.red
bar_color_time_adj = request.security(syminfo.tickerid, bar_change_sine_wave_res, bar_color)

//Above or Below Average
volume_state = (volume>avg_volume) ? color.blue : color.purple
volume_state_time_adj = request.security(syminfo.tickerid, volume_sine_wave_res, volume_state)
 
//Coinflip
coin_flip = math.random(0,100,coin_flip_seed)>=50 ? color.teal : color.yellow

var bar_change_wave_count = 0
var volume_wave_count = 0
var coin_flip_wave_count = 0

//Wave Counters
if(volume_state_time_adj[1] != volume_state_time_adj)
    volume_wave_count := volume_wave_count + volume_wave_direction

if(bar_color_time_adj[1] != bar_color_time_adj)
    bar_change_wave_count := bar_change_wave_count + bar_change_wave_direction

if(coin_flip[1] != coin_flip)
    coin_flip_wave_count := coin_flip_wave_count + coin_flip_wave_direction

//Direction changers
if(math.abs(bar_change_wave_count) == bar_change_sine_wave_number and bar_color_time_adj[1] != bar_color_time_adj)
    bar_change_wave_direction := bar_change_wave_direction * -1

if(math.abs(volume_wave_count) == volume_sine_wave_number and volume_state_time_adj[1] != volume_state_time_adj)
    volume_wave_direction := volume_wave_direction * -1

if(math.abs(coin_flip_wave_count) == coin_flip_sine_wave_number and coin_flip[1] != coin_flip)
    coin_flip_wave_direction := coin_flip_wave_direction * -1

//Entry positions
if(bar_change_wave_count==bar_change_sine_wave_number and bar_change_trade==true)
    strategy.entry(id="short",direction=strategy.short)
if(bar_change_wave_count==bar_change_sine_wave_number*-1 and bar_change_trade==true)
    strategy.entry(id="long",direction=strategy.long)

if(volume_wave_count==volume_sine_wave_number and volume_trade==true)
    strategy.entry(id="short-volume",direction=strategy.short)
if(volume_wave_count==volume_sine_wave_number*-1 and volume_trade==true)
    strategy.entry(id="long-volume",direction=strategy.long)

if(coin_flip_wave_count==coin_flip_sine_wave_number and coin_flip_trade==true)
    strategy.entry(id="short-coinflip",direction=strategy.short)
if(coin_flip_wave_count==coin_flip_sine_wave_number*-1 and coin_flip_trade==true)
    strategy.entry(id="long-coinflip",direction=strategy.long)

hline(0, title='Center', color=color.white, linestyle=hline.style_dashed, linewidth=1)
plot(bar_change_wave_count,title="Bar Change", color=bar_color, linewidth=2)
plot(volume_wave_count,title="Volume Average Change", color=volume_state, linewidth=2)
plot(coin_flip_wave_count,title="Coin Flip Change", color=coin_flip, linewidth=2)


Lebih banyak