Chiến lược giao dịch bộ lọc tầm song song

Tác giả:ChaoZhang, Ngày: 2023-11-13 10:38:20
Tags:

img

Tổng quan

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

Chiến lược logic

Chiến lược này sử dụng hai chỉ số phạm vi trơn tru với độ dài giai đoạn khác nhau: chỉ số phạm vi nhanh (thời gian mặc định 27) và chỉ số phạm vi chậm (thời gian mặc định 55).

Chiến lược Twin Range Filter so sánh giá với hai chỉ số phạm vi để xác định liệu nó hiện đang trong phạm vi dao động nhất định.

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

Để lọc các tín hiệu sai, nó cũng thêm một điều kiện: tín hiệu chỉ được tạo ra khi chuyển động giá hiện tại phù hợp với giai đoạn trước. Ví dụ, tín hiệu dài chỉ được kích hoạt khi giá tăng và vượt quá đường trung bình một phạm vi.

Tóm lại, chiến lược này xác định phạm vi dao động với các chỉ số phạm vi đôi và tạo ra lệnh khi giá vượt qua phạm vi.

Ưu điểm

Ưu điểm của chiến lược lọc tầm cỡ đôi:

  1. Sử dụng các tính năng biến động giá, thích nghi với các tài sản biến động cao như Bitcoin.

  2. Các chỉ số phạm vi đôi chứa các khung thời gian khác nhau. nhanh nhất nắm bắt cơ hội ngắn hạn, trong khi chậm nhất xem xét xu hướng dài hạn.

  3. Thêm các bộ lọc hướng giá làm giảm các tín hiệu sai từ biến động ngắn hạn.

  4. Logic đơn giản và rõ ràng, dễ hiểu và thực hiện, phù hợp với giao dịch algo.

Rủi ro

Một số rủi ro của chiến lược cần lưu ý:

  1. Dựa trên các chỉ số biến động, có thể hoạt động kém trong môi trường biến động thấp.

  2. Các thông số phạm vi cần được tối ưu hóa cho các sản phẩm khác nhau, nếu không các cơ hội giao dịch có thể bị bỏ lỡ hoặc các tín hiệu sai xuất hiện.

  3. Sự khác biệt giữa giá và biến động không được xem xét. Các tín hiệu sai có thể xảy ra nếu biến động tăng mà không có sự gia tăng giá tương ứng.

  4. Mức dừng lỗ có thể cần điều chỉnh trong môi trường biến động cao.

Tăng cường

Chiến lược có thể được cải thiện trong một số khía cạnh:

  1. Kiểm tra và tối ưu hóa các tham số phạm vi để tìm kết hợp tối ưu cho các sản phẩm và khung thời gian khác nhau.

  2. Thêm các cơ chế dừng lỗ năng động dựa trên sự biến động gần đây, để tối ưu hóa chiến lược dừng lỗ.

  3. Thêm các bộ lọc dựa trên sự khác biệt về biến động giá để tránh các tín hiệu sai.

  4. Bao gồm các chỉ số khác như thay đổi khối lượng để tăng độ chắc chắn nhập cảnh.

  5. Kiểm tra và thêm các cơ chế thoát lợi nhuận thích hợp phù hợp với chiến lược.

Tóm lại

Nhìn chung, bộ lọc phạm vi sinh đôi là một chiến lược giao dịch hiệu quả cho các tài sản biến động cao. Nó sử dụng các đặc điểm biến động giá tốt và tạo ra logic giao dịch đơn giản và rõ ràng. Với những cải tiến hơn nữa như tối ưu hóa tham số và quản lý rủi ro, nó có thể trở thành một thành phần có giá trị trong một hệ thống giao dịch lượng. Nó cũng cung cấp cái nhìn sâu sắc về giao dịch thuật toán dựa trên các tính năng biến động thị trường.


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



Thêm nữa