Chiến lược giao dịch bộ lọc rung sóng kép


Ngày tạo: 2023-11-13 10:38:20 sửa đổi lần cuối: 2023-11-13 10:38:20
sao chép: 1 Số nhấp chuột: 2569
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch bộ lọc rung sóng kép

Tổng quan

Chiến lược lọc dao động hai sóng là một chiến lược giao dịch dựa trên biến động giá. Nó sử dụng chỉ số phạm vi dao động trung bình của hai thiết lập tham số khác nhau, kết hợp mối quan hệ giữa giá và phạm vi dao động, tạo ra tín hiệu giao dịch. Chiến lược này có thể áp dụng cho các tài sản kỹ thuật số có biến động cao như bitcoin.

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

Chiến lược này sử dụng hai chỉ số phạm vi dao động trơn với độ dài chu kỳ khác nhau: chỉ số phạm vi dao động nhanh ((chu kỳ mặc định 27) và chỉ số phạm vi dao động chậm ((chu kỳ mặc định 55). Công thức tính toán cho chỉ số phạm vi dao động là: Đường trung bình di chuyển chỉ số của độ dao động giá trong chu kỳ hiện tại nhân với một nhân số ((như 1.6)).

Chiến lược lọc hai làn sóng dao động là so sánh mối quan hệ giữa giá và hai chỉ số phạm vi dao động để xác định xem giá hiện đang nằm trong một vùng dao động có độ lớn nhất định. Khi giá vượt qua vùng dao động, nó sẽ tạo ra tín hiệu giao dịch.

Cụ thể, chiến lược sử dụng đường trung bình làm chuẩn, đường trung bình là giá trị trung bình của hai chỉ số phạm vi dao động. Một tín hiệu giảm giá được tạo ra khi giá vượt quá một phạm vi dao động nhanh trên đường trung bình; Một tín hiệu giảm giá được tạo ra khi giá dưới một phạm vi dao động nhanh trên đường trung bình.

Để lọc các thông báo sai lệch, chiến lược này cũng thêm một điều kiện: chỉ khi giá đồng nhất với giá của một chu kỳ trước, tín hiệu sẽ được tạo ra. Ví dụ, chỉ khi giá tăng và vượt quá một phạm vi biến động của đường trung bình, tín hiệu đa sẽ được tạo ra.

Tóm lại, chiến lược này sử dụng chỉ số phạm vi hai biến động để xác định các khu vực chấn động, tạo ra lệnh giao dịch với tín hiệu giá vượt qua các khu vực chấn động. Đồng thời thêm bộ lọc hướng giá để giảm tín hiệu sai.

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

Những lợi thế của chiến lược lọc sóng động đôi là:

  1. Sử dụng tính năng biến động giá, có thể thích ứng với các tài sản có tỷ lệ biến động cao như Bitcoin. Chỉ số phạm vi dao động kép có thể xác định chính xác hơn các vùng dao động giá.

  2. Chỉ số phạm vi hai biến động bao gồm các độ dài thời gian khác nhau. Chỉ số nhanh nắm bắt các cơ hội đột phá ngắn hạn, chỉ số chậm xem xét xu hướng dài hạn.

  3. Thêm điều kiện lọc hướng giá để giảm tín hiệu sai do biến động ngắn hạn.

  4. Logic giao dịch đơn giản, rõ ràng, dễ hiểu và phù hợp với giao dịch số lượng.

Rủi ro chiến lược

Các chiến lược lọc rung hai sóng cũng có một số rủi ro cần lưu ý:

  1. Tùy thuộc vào chỉ số biến động, nó có thể không hiệu quả trong thị trường có biến động thấp.

  2. Các tham số phạm vi dao động cần được điều chỉnh và tối ưu hóa cho các giống khác nhau, nếu không sẽ bỏ lỡ cơ hội giao dịch hoặc tạo ra tín hiệu sai.

  3. Không tính đến tình trạng giá lệch so với biến động. Khi biến động tăng và giá không tăng tương ứng, có thể phát ra tín hiệu sai.

  4. Trong môi trường biến động cao, thiết lập điểm dừng có thể cần điều chỉnh.

Tối ưu hóa chiến lược

Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:

  1. Kiểm tra và tối ưu hóa các tham số phạm vi dao động để tìm ra sự kết hợp tham số tối ưu cho các chu kỳ khác nhau của các giống khác nhau.

  2. Tham gia vào cơ chế điều chỉnh vị trí dừng lỗ theo động thái biến động gần đây của tỷ lệ, tối ưu hóa chiến lược dừng lỗ.

  3. Thêm các điều kiện lọc dựa trên giá và biến động, tránh các tín hiệu sai.

  4. Kết hợp với các chỉ số khác, chẳng hạn như biến đổi khối lượng giao dịch, tăng độ chắc chắn nhập cảnh.

  5. Kiểm tra và tham gia các cơ chế rút lui phù hợp với chiến lược.

Tóm tắt

Chiến lược lọc rung hai sóng nói chung là một chiến lược giao dịch hiệu quả đối với các tài sản có biến động cao. Nó sử dụng đúng các đặc điểm biến động giá, tạo ra logic giao dịch đơn giản và rõ ràng.

Mã nguồn chiến lược
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 30m
basePeriod: 15m
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/
// © colinmck, greenmask9

//@version=4

strategy(title="Twin Range Filter Algo", overlay=true)

source = input(defval=close, title="Source")

// Smooth Average Range

per1 = input(defval=27, minval=1, title="Fast period")
mult1 = input(defval=1.6, minval=0.1, title="Fast range")

per2 = input(defval=55, minval=1, title="Slow period")
mult2 = input(defval=2, minval=0.1, title="Slow range")

smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2

// Range Filter

rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : 
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(source, smrng)

upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

hband = filt + smrng
lband = filt - smrng

longCond = bool(na)
shortCond = bool(na)
longCond := source > filt and source > source[1] and upward > 0 or source > filt and source < source[1] and upward > 0
shortCond := source < filt and source < source[1] and downward > 0 or source < filt and source > source[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]

long = longCond and CondIni[1] == -1
short = shortCond and CondIni[1] == 1

// Plotting

// Strategy
// From this part on, programmer is greenmaks9
//
Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false)
disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false)

//second
l2 = input(title="ATR1", defval=32, minval=1)
s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"])
atr2(source, l2) => 
    if s2 == "SMA"
        sma(source, l2)
    else
        if s2 == "RMA"
            rma(source, l2)
        else
            if s2 == "EMA"
                ema(source, l2)
            else
                wma(source, l2)

//third
l3 = input(title="ATR2", defval=64, minval=1)
s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
atr3(source, l3) => 
    if s3 == "RMA"
        rma(source, l3)
    else
        if s3 == "SMA"
            sma(source, l3)
        else
            if s3 == "EMA"
                ema(source, l3)
            else
                wma(source, l3)

atr20=atr2(tr(true), l2)
atr30=atr3(tr(true), l3)
strategy.initial_capital = 50000
ordersize=floor(strategy.initial_capital/close)
profit = input(title="Ticks profit", type=input.integer, defval=900)
stop = input(title="Ticks stoploss", type=input.integer, defval=300)
maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17)


bull = long and (atr20<atr30 or disabler)
bear = short and (atr20<atr30 or disabler)

bullclock = barssince(bull)
bearclock = barssince(bear)

if (bull)
    strategy.entry("Twin Long", strategy.long, ordersize)
    strategy.exit("Exit", from_entry =  "Twin Long", profit = profit, loss = stop)

if (bear)
    strategy.entry("Twin Short", strategy.short, ordersize)
    strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop)

//time stoploss
strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out")
strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")