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.
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.
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ự.
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.
Chiến lược này có thể được tối ưu hóa theo các hướng sau:
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)