Strategi Zigzag Kuantitatif

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

img

Ringkasan

Tujuan strategi ini adalah untuk menguji sama ada pembolehubah input yang berbeza seperti warna candlestick, jumlah dan kaedah rawak dapat digunakan untuk meramalkan perubahan harga dalam bentuk gelombang sinus. Strategi ini menukar pembolehubah ini menjadi bentuk gelombang sinus. Apabila puncak atau lereng mencapai jumlah masa yang ditetapkan, keputusan beli atau jual dibuat.

Prinsip Strategi

Strategi ini dibahagikan kepada tiga bahagian. Bahagian pertama mengesan perubahan warna candlestick. Apabila lilin dengan warna yang berbeza muncul selepas beberapa lilin dengan warna yang sama, gelombang sinus bertukar arah. Bahagian kedua mengesan sama ada jumlahnya lebih tinggi atau lebih rendah daripada purata. Apabila purata dipecahkan, gelombang bertukar arah. Bahagian ketiga menggunakan kaedah rawak untuk mensimulasikan meniup duit syiling. Apabila hasil rawak berbeza, gelombang bertukar arah. Apabila tiga gelombang ini terkumpul kepada bilangan masa yang ditetapkan, keputusan perdagangan dibuat.

Kod ini mengawal aliran gelombang dengan mengesan arah semasa, bilangan puncak, dan kedudukan lilin sebelumnya untuk tiga gelombang. Apabila jumlah puncak mencapai tetapan parameter, ia mengubah arah berjalan. gelung ini mensimulasikan aliran gelombang sinus.

Analisis Kelebihan

Teori gelombang sinus ini nampaknya masuk akal, dan bentuk gelombang yang disimulasikan juga mempunyai beberapa korelasi dengan pasaran sebenar. Tetapi melalui ujian strategi ini, dapat didapati bahawa mereka sebenarnya hasil rawak.

Oleh itu, salah satu kelebihan strategi ini adalah untuk membantah salah faham bahawa pasaran boleh diramalkan. Peralihan di pasaran mempengaruhi harga, tetapi mereka tidak dapat diramalkan, dan keputusan rawak juga boleh memperoleh hasil yang sama.

Analisis Risiko

Risiko terbesar strategi ini adalah bahawa sukar untuk menentukan keuntungan dan kerugian dalam perdagangan rawak. Hasil di bawah parameter yang berbeza juga sukar diramalkan, dan mustahil untuk menentukan terlebih dahulu sama ada ia boleh menguntungkan.

Selain itu, teori ramalan gelombang sinus itu sendiri salah. Perubahan pasaran terlalu kompleks untuk disimulasikan dengan kitaran sederhana. jadi strategi ini tidak boleh digunakan untuk perdagangan sebenar.

Untuk mengurangkan risiko, adalah perlu untuk menganalisis lebih lanjut hasil rawak untuk menentukan julat parameter; atau menggabungkan kaedah analisis lain untuk mengesahkan isyarat perdagangan.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan ke arah berikut:

  1. Meningkatkan lebih banyak pembolehubah ditukar kepada gelombang untuk mengembangkan ruang sampel
  2. Gabungkan tiga gelombang semasa untuk mencari gabungan traversal terbaik
  3. Tetapkan kaedah stop loss, seperti peratusan stop loss
  4. Mengoptimumkan logik masuk dan keluar dan backtest untuk mencari parameter optimum

Ringkasan

Dengan menguji gelombang sinus yang berbeza, strategi ini menggambarkan sifat pasaran yang tidak dapat diramalkan. Pada masa yang sama, ia juga membantah teori yang salah menggunakan kitaran gelombang untuk meramalkan.

Seterusnya, kepraktisan strategi dapat ditingkatkan dengan meningkatkan pembolehubah, menggabungkan bentuk gelombang, menetapkan berhenti, dan mengoptimumkan parameter. Tetapi kunci masih untuk memahami bahawa perubahan pasaran adalah kompleks dan tidak dapat diramalkan. Apa yang perlu kita lakukan adalah mengurangkan risiko rawak daripada meramalkan pasaran.


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