Chiến lược Zigzag định lượng

Tác giả:ChaoZhang, Ngày: 2023-11-21 13:43:24
Tags:

img

Tổng quan

Mục đích của chiến lược này là để kiểm tra xem liệu các biến đầu vào khác nhau như màu nến, khối lượng và phương pháp ngẫu nhiên có thể được sử dụng để dự đoán thay đổi giá dưới dạng sóng sinus hay không. Chiến lược chuyển đổi các biến này thành hình thức sóng sinus. Khi đỉnh hoặc đáy đạt đến số lần đặt, quyết định mua hoặc bán được thực hiện.

Nguyên tắc chiến lược

Chiến lược được chia thành ba phần. Phần đầu tiên phát hiện ra sự thay đổi màu sắc của nến. Khi một ngọn nến có màu khác nhau xuất hiện sau nhiều nến cùng màu, sóng sinus chuyển hướng. Phần thứ hai phát hiện ra khối lượng lớn hơn hoặc thấp hơn mức trung bình. Khi mức trung bình bị phá vỡ, sóng chuyển hướng. Phần thứ ba sử dụng một phương pháp ngẫu nhiên để mô phỏng việc ném đồng xu. Khi kết quả ngẫu nhiên khác nhau, sóng chuyển hướng. Khi ba sóng này tích lũy đến số lần đã thiết lập, các quyết định giao dịch được đưa ra.

Mã điều khiển chạy sóng bằng cách theo dõi hướng hiện tại, số đỉnh và vị trí của ngọn nến trước đó cho ba sóng. Khi số đỉnh đạt được cài đặt tham số, nó thay đổi hướng chạy.

Phân tích lợi thế

Lý thuyết sóng sinus này có vẻ hợp lý, và các hình dạng sóng mô phỏng cũng có một số mối tương quan với thị trường thực tế. Nhưng thông qua việc kiểm tra chiến lược này, có thể thấy rằng chúng thực sự là kết quả ngẫu nhiên. Sự kết hợp của các biến nào làm cho hình dạng sóng trông giống nhau hơn không cải thiện kết quả giao dịch.

Vì vậy, một lợi thế của chiến lược này là bác bỏ quan niệm sai lầm rằng "thị trường có thể được dự đoán". Các biến trong thị trường có ảnh hưởng đến giá cả, nhưng chúng không thể dự đoán được, và các quyết định ngẫu nhiên cũng có thể có kết quả tương tự.

Phân tích rủi ro

Rủi ro lớn nhất của chiến lược này là khó xác định lợi nhuận và lỗ trong giao dịch ngẫu nhiên. Kết quả dưới các tham số khác nhau cũng khó dự đoán, và không thể xác định trước liệu nó có thể có lợi nhuận hay không.

Ngoài ra, chính lý thuyết dự đoán sóng sinus là sai. Thay đổi thị trường quá phức tạp để mô phỏng với chu kỳ đơn giản. Vì vậy, chiến lược này không thực sự có thể được sử dụng cho giao dịch thực tế.

Để giảm rủi ro, cần phải phân tích thêm các kết quả ngẫu nhiên để xác định phạm vi tham số; hoặc kết hợp các phương pháp phân tích khác để xác minh tín hiệu giao dịch.

Hướng dẫn tối ưu hóa

Chiến lược này có thể được tối ưu hóa theo các hướng sau:

  1. Tăng nhiều biến đổi chuyển thành sóng để mở rộng không gian mẫu
  2. Kết hợp ba sóng hiện tại để tìm ra kết hợp đi qua tốt nhất
  3. Đặt các phương pháp dừng lỗ, chẳng hạn như tỷ lệ dừng lỗ phần trăm
  4. Tối ưu hóa logic nhập và xuất và backtest để tìm các thông số tối ưu

Tóm lại

Bằng cách thử nghiệm các sóng âm âm khác nhau, chiến lược này minh họa bản chất không thể đoán trước của thị trường. Đồng thời, nó cũng bác bỏ lý thuyết sai lầm sử dụng chu kỳ sóng để dự đoán.

Tiếp theo, tính thực tế của chiến lược có thể được cải thiện bằng cách tăng các biến, kết hợp các hình dạng sóng, thiết lập dừng và tối ưu hóa các thông số. Nhưng chìa khóa vẫn là hiểu rằng những thay đổi trên thị trường rất phức tạp và không thể đoán trước. Những gì chúng ta cần làm là giảm rủi ro ngẫu nhiên thay vì dự đoán thị trường.


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


Thêm nữa