Chiến lược theo dõi đường trung bình động đột phá kênh


Ngày tạo: 2024-01-15 12:25:26 sửa đổi lần cuối: 2024-01-15 12:25:26
sao chép: 0 Số nhấp chuột: 639
1
tập trung vào
1617
Người theo dõi

Chiến lược theo dõi đường trung bình động đột phá kênh

Tổng quan

Chiến lược này là một chiến lược phá vỡ dựa trên kênh giá, kết hợp với chỉ số đường ngang và theo dõi dừng / dừng để vào và ra. Nó sử dụng đường ngang để xây dựng kênh giá cao và thấp, tham gia nhiều / trống khi giá phá vỡ kênh và sử dụng dừng cố định hoặc trailing stop để kiểm soát rủi ro.

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

Chiến lược này tạo ra một kênh giá bằng cách tính toán đường trung bình của giá cao và thấp. Cụ thể là tính toán đường trung bình SMA của giá cao và giá thấp với chiều dài 10 để tạo ra đường lên và đường xuống của kênh.

Sau khi vào, chiến lược sử dụng dừng cố định hoặc trailing stop để thoát khỏi vị trí giữ. Trailing stop bao gồm hai tham số: dừng cố định và offset kích hoạt. Khi giá đạt được di chuyển kích hoạt, dừng sẽ được trail theo dõi giá.

Chiến lược này cũng kết hợp các bộ lọc thời gian, chỉ được thử nghiệm trong các ngày lịch sử được chỉ định, để kiểm tra hiệu suất của các giai đoạn thị trường khác nhau.

Phân tích lợi thế

Chiến lược này sử dụng kênh giá và dừng theo dõi xu hướng, có thể nắm bắt hướng của xu hướng đường dài và đường dài. So với chiến lược đường trung bình di chuyển đơn giản, nó làm giảm các giao dịch không hiệu quả do biến động giá.

Nhìn chung, chiến lược này có logic rõ ràng, sử dụng ít chỉ số và tham số, dễ đánh giá lại, phù hợp với giao dịch xu hướng đường dài và trung bình, có thể kiếm lợi nhuận trong tình huống mạnh mẽ.

Phân tích rủi ro

Chiến lược này có thể dễ bị rút ra trong tình huống biến động và không thể tạo ra lợi nhuận lâu dài. Ngoài ra, trong tình huống cực đoan, giá có thể phá vỡ mức dừng lỗ trực tiếp và gây thiệt hại lớn.

Cài đặt tham số là chủ quan hơn, các tham số cần được điều chỉnh trong các giai đoạn thị trường khác nhau. Đặt điểm dừng cố định và kích hoạt di chuyển lệch, không thể điều chỉnh theo mức độ biến động của thị trường.

Hướng tối ưu hóa

Có thể xem xét kết hợp các chỉ số khác để lọc các tín hiệu nhập cảnh, chẳng hạn như khối lượng giao dịch, vùng Brin, v.v., để tránh bị che đậy. Hoặc sử dụng dừng động để thiết lập điểm dừng dựa trên ATR hoặc mức độ biến động của giá.

Các quy tắc thoát có thể được tối ưu hóa để di chuyển dừng hoặc Chandelier Exit. Một phần thoát cũng có thể được xem xét khi giá quay trở lại Channel. Việc tối ưu hóa các quy tắc lọc và thoát có thể làm tăng đáng kể sự ổn định chiến lược.

Tóm tắt

Chiến lược tổng thể này là một chiến lược định lượng dựa trên Price Channel, theo dõi xu hướng, quản lý dừng / dừng. Nó có cấu trúc logic rõ ràng, cấu trúc tham số đơn giản, dễ hiểu và đo lường, phù hợp để học giao dịch định lượng. Chiến lược này có thể được tối ưu hóa bằng nhiều cách để tăng sự ổn định và khả năng sinh lợi. Ý tưởng cốt lõi của nó là nắm bắt hướng của xu hướng giá và kiểm soát rủi ro bằng cách dừng và dừng.

Mã nguồn chiến lược
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-21 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
//  This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. 
//  It is based on moving averages of the highs and lows. 
//  Similar channel indicators can be found, whereas 
//  this one implements the persistency inside the channel, which is rather tricky.
//  The green line is the base line which decides entries and exits, possibly with trailing stops.
//  With respect to the original version, here one can play with different moving averages.
//  The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019

lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap

hma(sig, n) => // Hull moving average definition
    wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))

mcg(sig,length) => // Mc Ginley MA definition
    mg = 0.0
    mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))

tenkan(sig,len) =>
    0.5*(highest(sig,len)+lowest(sig,len))

ma(t,sig,len) =>
    sss=na
    if t =="SMA"
        sss := sma(sig,len)
    if t == "EMA"
        sss := ema(sig,len)
    if t == "HMA"
        sss := hma(sig,len)
    if t == "McG" // Mc Ginley
        sss := mcg(sig,len)
    if t == "Tenkan"
        sss := tenkan(sig,len)
    if t == "WMA"
        sss := wma(sig,len)
    sss

base(mah, mal) =>
    bbb = na
    inChannel = close<mah and close>mal
    belowChannel = close<mah and close<mal
    bbb := inChannel? bbb[1]: belowChannel? -1: 1
    uuu = bbb==1? mal: mah
    ddd = bbb==1? mah: mal
    [uuu, ddd]

maH = ma(maType, high, lb)
maL = ma(maType, low, lb)

[up, dn] = base(maH,maL)

plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)

long = crossover(dn,up)
short = crossover(up,dn)

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)