Chiến lược lọc tín hiệu mua và bán dựa trên phạm vi biến động giá


Ngày tạo: 2024-03-08 17:06:50 sửa đổi lần cuối: 2024-03-08 17:06:50
sao chép: 2 Số nhấp chuột: 1110
1
tập trung vào
1617
Người theo dõi

Chiến lược lọc tín hiệu mua và bán dựa trên phạm vi biến động giá

Tổng quan

Chiến lược lọc tín hiệu mua bán dựa trên phạm vi biến động giá (Range Filter Buy Sell Signals Strategy) là một chiến lược giao dịch định lượng rất thực tế. Nó sử dụng phạm vi biến động giá để lọc tín hiệu mua và bán, giảm tín hiệu giả trong thị trường biến động thấp và nâng cao chất lượng tín hiệu trong thị trường biến động cao.

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

Chiến lược này bắt đầu bằng cách tính toán phạm vi biến động của giá tài sản trong một chu kỳ nhất định. Cụ thể, nó tính toán chênh lệch giữa giá cao nhất và giá thấp nhất trong một chu kỳ nhất định để xác định mức độ biến động của giá.

Sau đó, nó sẽ tạo ra các tín hiệu mua và bán. Tuy nhiên, không phải tất cả các tín hiệu sẽ kích hoạt vào, mà cần phải đáp ứng các điều kiện lọc phạm vi biến động giá. Ví dụ, tín hiệu mua chỉ được phát ra khi giá phá vỡ phạm vi biến động.

Bằng cách này, chiến lược này có thể lọc ra hầu hết các tín hiệu giả trong môi trường thị trường biến động thấp và tránh các bước vào không cần thiết. Trong khi đó, khi biến động cao, nó có thể nắm bắt các chuyển động theo hướng lớn hơn và kiếm lợi nhuận từ đó.

Lợi thế chiến lược

Ưu điểm lớn nhất của chiến lược này là có thể điều chỉnh động cường độ lọc của tín hiệu. Trong khi dao động thấp, nó chỉ chọn tín hiệu chất lượng cao; trong khi dao động cao, nó có thể nắm bắt nhiều cơ hội hơn mà thị trường cung cấp.

Chiến lược này thông minh hơn và thích ứng hơn so với bộ lọc với các tham số cố định. Nó có thể cung cấp lợi nhuận rủi ro tốt hơn cho dù thị trường có ở trạng thái nào.

Ngoài ra, chiến lược này kết hợp các yếu tố định hướng xu hướng để cung cấp tín hiệu giao dịch đáng tin cậy hơn so với các điều kiện hoạt động đơn lẻ. Đồng thời, nó có chức năng dừng lỗ và kiểm soát rủi ro của các giao dịch cá nhân một cách hiệu quả.

Rủi ro chiến lược

Rủi ro chính của chiến lược này là đặt các tham số phạm vi dao động. Nếu thiết lập phạm vi quá lớn hoặc quá nhỏ, nó sẽ ảnh hưởng xấu đến chất lượng tín hiệu và cơ hội kiếm lợi nhuận.

Ngoài ra, trong một thị trường có xu hướng biến động giá mạnh trong thời gian ngắn, cơ hội lợi nhuận của chiến lược này sẽ tương đối ít hơn. Việc sử dụng sự kết hợp của các hệ thống chu kỳ khác nhau có thể giúp giảm bớt vấn đề này.

Hướng tối ưu hóa chiến lược

Chiến lược này có thể được tối ưu hóa bằng cách:

  1. Sử dụng thuật toán tham số thích ứng để tự động tối ưu hóa tham số phạm vi dao động, làm cho nó thông minh hơn và năng động hơn.

  2. Thêm quy tắc lọc dựa trên xu hướng chu kỳ lớn để tránh bị mắc kẹt trong thị trường biến động.

  3. Chiến lược này kết hợp các chu kỳ khác nhau, tạo thành hệ thống và tăng sự ổn định tổng thể.

  4. Thêm các thuật toán học máy để cải thiện hiệu quả của các tham số và quy tắc lọc.

Tóm tắt

Chiến lược lọc tín hiệu mua và bán dựa trên phạm vi biến động giá là một chiến lược giao dịch định lượng rất thực tế và hiệu quả. Nó có thể điều chỉnh cường độ lọc một cách động và cung cấp lợi nhuận rủi ro tốt hơn trong các môi trường thị trường khác nhau. Đồng thời, chiến lược này có rất nhiều không gian để tối ưu hóa, đặc biệt là tối ưu hóa tham số và tối ưu hóa quy tắc.

Mã nguồn chiến lược
/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 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/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=5
strategy(title='Range Filter - B&S Signals', shorttitle='[Doan]_RF-B&S Signals', overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01

emaLength = input.int(200, title="EMA Length")

// Determine stop loss price

//Range Size Function
rng_size(x, qty, n) =>
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n) =>
    r = rng_
    var rfilt = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)

    hi_band = rng_filt1 + r
    lo_band = rng_filt1 - r
    rng_filt = rng_filt1
    [hi_band, lo_band, rng_filt]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, title='Swing Source')

//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')

//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')

//Bar Colors
use_barcolor = input(defval=false, title='Bar Colors On/Off')

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir == 1 ? 1 : 0
downward = fdir == -1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc


ema = ta.ema(close, emaLength)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)

//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band')
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band')

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill')
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill')

//Bar Color
barcolor(use_barcolor ? bar_color : na)
// Entry
strategy.entry("Long", strategy.long, when=longCondition)
strategy.entry("Short", strategy.short, when=shortCondition)

plot(ema)

//Plot Buy and Sell Labels
plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0))
plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title='Buy Alert', message='BUY')
alertcondition(shortCondition, title='Sell Alert', message='SELL')