
Đây là một chiến lược theo dõi xu hướng tự điều chỉnh dựa trên tỷ lệ biến động và kết hợp với Williams Percent Range (Chỉ số Williams). Chiến lược này điều chỉnh độ nhạy cảm của phán đoán xu hướng bằng cách tính toán phạm vi biến động giá và bộ đếm tùy chỉnh, để có thể thích ứng tốt hơn trong các môi trường thị trường khác nhau.
Chiến lược đầu tiên tính toán phạm vi biến động giá (Range) và trung bình di chuyển của nó (AvgRange) trong một chu kỳ. Xây dựng hai bộ đếm (TrueCount và TrueCount2) để ghi lại tần suất biến động đáng kể bằng cách so sánh sự thay đổi giá theo thời gian thực với phạm vi biến động trung bình.
Đây là một chiến lược sáng tạo kết hợp phân tích biến động và theo dõi xu hướng, tăng sự ổn định và độ tin cậy của chiến lược thông qua cơ chế thích ứng. Mặc dù có một số rủi ro vốn có, chiến lược này có khả năng duy trì hiệu suất ổn định trong các môi trường thị trường khác nhau thông qua việc thiết lập tham số hợp lý và hướng tối ưu hóa.
/*backtest
start: 2024-10-28 00:00:00
end: 2024-11-27 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("ASCTrend", shorttitle="ASCTrend", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
eternalfg = input(false, title="eternal 確定")
eternal = eternalfg ? 1 : 0
ASClength = input.int(title="ASC Length", minval=4, defval=10)
RISK = input.int(title="RISK", minval=0, defval=3)
// Custom sum function
customSum(source, length) =>
sum = 0.0
for i = 0 to length - 1
sum := sum + source[i]
sum
x1 = 67 + RISK
x2 = 33 - RISK
Range = ta.highest(ASClength) - ta.lowest(ASClength)
AvgRange = ta.sma(Range, ASClength)
CountFg = math.abs(open - close) >= AvgRange * 2.0 ? 1 : 0
TrueCount = customSum(CountFg, ASClength)
CountFg2 = math.abs(close[3] - close) >= AvgRange * 4.6 ? 1 : 0
TrueCount2 = customSum(CountFg2, ASClength - 3)
wpr3RR = ta.wpr(3 + RISK + RISK)
wpr3 = ta.wpr(3)
wpr4 = ta.wpr(4)
WprAbs = 100 + (TrueCount2 > 0 ? wpr4 : TrueCount > 0 ? wpr3 : wpr3RR)
ASC_Trend = 0
ASC_Trend := WprAbs[eternal] < x2[eternal] ? -1 : WprAbs[eternal] > x1[eternal] ? 1 : ASC_Trend[1]
if (ta.crossover(ASC_Trend, 0))
strategy.entry("Long", strategy.long)
if (ta.crossunder(ASC_Trend, 0))
strategy.entry("Short", strategy.short)
plotshape(ta.crossover(ASC_Trend, 0), location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small, text="B", textcolor=color.white)
plotshape(ta.crossunder(ASC_Trend, 0), location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small, text="S", textcolor=color.white)
alertcondition(ta.crossover(ASC_Trend, 0), title="ASC_Trend UP", message="ASC_Trend UP")
alertcondition(ta.crossunder(ASC_Trend, 0), title="ASC_Trend Down", message="ASC_Trend Down")