Chiến lược theo dõi xu hướng kênh trọng lực trung tâm


Ngày tạo: 2023-09-19 21:30:23 sửa đổi lần cuối: 2023-09-19 21:30:23
sao chép: 0 Số nhấp chuột: 747
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này kết hợp chỉ số trọng lực trung tâm và chỉ số kênh SSL, để thực hiện phán đoán và theo dõi đột phá về xu hướng giá, thuộc loại chiến lược theo dõi xu hướng. Đồng thời kết hợp với dừng ATR động để kiểm soát rủi ro.

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

  1. Chỉ số trọng lực trung tâm tính toán, trong đó đường ray trên và đường ray dưới là ranh giới xu hướng của giá tăng và giảm.

  2. Tính toán chỉ số kênh SSL, bên trong kênh là vùng cân bằng, bên ngoài kênh là hướng xu hướng.

  3. Khi giá phá vỡ đường đua hoặc kênh, nó được đánh giá là xu hướng tăng và làm nhiều; Khi giá phá vỡ đường đua hoặc kênh, nó được đánh giá là xu hướng giảm và làm trống.

  4. Sử dụng ATR dừng động khi giữ vị trí để theo dõi điểm dừng để tránh tổn thất mở rộng.

  5. Kết hợp với thời gian phản hồi để tạo ra tín hiệu giao dịch thực tế.

Chiến lược này sử dụng hai chỉ số để xác định xu hướng cùng một lúc, một chỉ số để xác định phá vỡ và một chỉ số để xác nhận xu hướng, kết hợp của cả hai có thể làm tăng độ chính xác của phán đoán. Động thái dừng có thể điều chỉnh điểm dừng tùy theo mức độ biến động của thị trường, là một phương tiện kiểm soát rủi ro rất thực tế.

Phân tích lợi thế

  1. Trong khi đó, việc sử dụng hai chỉ số để đánh giá xu hướng có thể giúp tăng độ chính xác.

  2. Chỉ số trọng lực trung tâm nhạy cảm với sự thay đổi xu hướng, kênh SSL xác định hướng xu hướng cleared。

  3. Hạn chế ATR động điều chỉnh mức dừng theo thời gian thực theo biến động của thị trường, có tính linh hoạt.

  4. Các quy tắc chiến lược đơn giản, rõ ràng, dễ hiểu và dễ thực hiện.

  5. Các tham số được tối ưu hóa rộng rãi, có thể được điều chỉnh cho các thị trường khác nhau.

  6. Có thể xác nhận hiệu quả của chiến lược.

Phân tích rủi ro

  1. Chỉ số trọng tâm và kênh SSL có thể bị hỏng, dẫn đến tín hiệu giao dịch bị lỗi. Các chỉ số khác có thể được thêm vào để xác nhận.

  2. Hạn chế động lực có thể quá quyết liệt, có thể nới lỏng mức độ dừng thích hợp.

  3. Việc lựa chọn thời gian phản hồi không đúng có thể dẫn đến hiệu quả chiến lược kém, cần phải phản hồi cho các giai đoạn thị trường khác nhau.

  4. Cần xem xét đầy đủ các tác động của chi phí giao dịch

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

  1. Kiểm tra các kết hợp tham số khác nhau để tìm ra cặp tham số tốt nhất.

  2. Tối ưu hóa chu kỳ ATR và tham số nhân của dừng động.

  3. Thêm một số chỉ số khác để lọc tín hiệu, chẳng hạn như MACD, KDJ.

  4. Thêm mô hình học máy để hỗ trợ định hướng xu hướng.

  5. Tối ưu hóa quản lý vốn, thiết lập kiểm soát vị trí.

  6. Điều chỉnh và tối ưu hóa các tham số cho các giống cụ thể.

Tóm tắt

Chiến lược này kết hợp các chỉ số trọng lực trung tâm và các chỉ số đường SSL để đánh giá xu hướng, sử dụng ATR động để kiểm soát rủi ro, là một chiến lược theo dõi xu hướng thực tế. Có thể cải thiện hơn nữa sự ổn định và hiệu quả chiến đấu của chiến lược bằng cách tối ưu hóa tham số, giới thiệu các chỉ số khác và học máy. Nhìn chung, chiến lược này có tính thực tiễn và khả năng mở rộng mạnh mẽ, là một ý tưởng chiến lược đáng xem xét trong giao dịch định lượng.

Mã nguồn chiến lược
/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-13 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Thanks to HPotter for the original code for Center of Gravity Backtest
strategy("CoG SSL BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// SSL Channels /////////////// 
_1 = input(false,  "═════════ SSL ══════════")
len1=input(title="SMA Length 1", defval=12)
len2=input(title="SMA Length 2", defval=13)

smaHigh = sma(high, len1)
smaLow = sma(low, len2)

Hlv = 0
Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? smaHigh : smaLow
sslUp = Hlv < 0 ? smaLow : smaHigh

///////////// Center of Gravity /////////////
_2 = input(false,  "═════════ CoG ══════════")
Length = input(25, minval=1)
m = input(5, minval=0)
Percent = input(6, minval=0, title="COG %")

xLG = linreg(close, Length, m)
xLG1r = xLG + ((close * Percent) / 100)
xLG1s = xLG - ((close * Percent) / 100)

pos = 0.0
pos := iff(close > xLG1r, 1, iff(close < xLG1s, -1, nz(pos[1], 0))) 
possig = iff(pos == 1, 1, iff(pos == -1, -1, pos))

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(2, "ROC Length",  minval=1)
pcntChange = input(10, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Srategy ///////////////
long = possig == 1 or (sslUp > sslDown and isMoving())
short = possig == -1 or (sslUp < sslDown and isMoving())

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false,  "════════ Stop Loss ═══════")
atrLkb = input(1, minval=1, title='ATR Stop Period')
atrMult = input(2, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("L",  strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=longStop, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting ///////////////
p1 = plot(sslDown, linewidth = 1, color=color.red, title="SSL down")
p2 = plot(sslUp, linewidth = 1, color=color.lime, title="SSL up")
fill(p1, p2,  color = not isMoving() ? color.white : sslDown < sslUp ? color.lime : color.red, transp=80)
plot(xLG1r, color=color.lime, title="LG1r")
plot(xLG1s, color=color.red, title="LG1s")
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=1)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=1)
bgcolor(long ? color.green : short ? color.red : not isMoving() ? color.white : na, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)