Chiến lược này sử dụng nhiều chỉ số kỹ thuật để xác định hướng xu hướng và khu vực mua quá mức để tạo ra tín hiệu giao dịch.
Các chỉ số chính bao gồm:
Chỉ số hướng trung bình ((ADX): đánh giá cường độ xu hướng
Chỉ số tương đối yếu (RSI): đánh giá quá mua quá bán
Đường trung bình (SMA): đánh giá xu hướng ngắn hạn
Chỉ số SAR cực đoan: Xác định xu hướng dài hạn
Thâm nhập: Thâm nhập theo xu hướng
Logic giao dịch:
ADX cho rằng xu hướng có và đủ mạnh
SAR đánh giá xu hướng dài hạn nhất quán
RSI xác định khoảng giá quá mua quá bán
Tham gia khi giá vượt qua đường SMA
Thêm vào khi giá vượt qua cổng
Nhiều chỉ số được xác nhận với nhau để tăng độ chính xác phán đoán, các chiến lược khác nhau kết hợp thành một hệ thống giao dịch.
Kết hợp nhiều chỉ số, cải thiện chất lượng tín hiệu
Sự kết hợp các chiến lược, nhập học có hệ thống
ADX xác định xu hướng, RSI đánh giá quá mua quá bán
SAR nắm bắt xu hướng, SMA và Channel đột phá
Thiết lập đa tham số, cần kiểm tra lặp lại để tối ưu hóa
Tỷ lệ thấp hơn của các điều kiện kết hợp
Chỉ số gây ra tín hiệu xung đột khó xử lý
Chiến lược này tận dụng lợi thế của các chỉ số khác nhau để xây dựng một hệ thống giao dịch vững chắc. Tuy nhiên, cần thiết phải thiết lập các tham số tối ưu hóa để đảm bảo tần suất giao dịch hợp lý.
/*backtest
start: 2023-09-12 00:00:00
end: 2023-09-13 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
// strategy("Combined Strategy", overlay=true, default_qty_value=100, initial_capital=1000, margin_long=0.1)
adxlen = input(7, title="ADX Smoothing")
dilen = input(7, title="DI Length")
dirmov(len) =>
up = ta.change(high)
down = -ta.change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
truerange = ta.rma(ta.tr, len)
plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
[plus, minus]
adx(dilen, adxlen) =>
[plus, minus] = dirmov(dilen)
sum = plus + minus
adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
// The same on Pine Script™
pine_supertrend(factor, atrPeriod) =>
src = hl2
atr = ta.atr(atrPeriod)
upperBand = src + factor * atr
lowerBand = src - factor * atr
prevLowerBand = nz(lowerBand[1])
prevUpperBand = nz(upperBand[1])
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand
upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand
int direction = na
float superTrend = na
prevSuperTrend = superTrend[1]
if na(atr[1]) and ta.rsi(close, 21) < 66 and ta.rsi(close,3) > 80 and ta.rsi(close, 28) > 49 and sig > 20
direction := 1
else if prevSuperTrend == prevUpperBand
direction := close > upperBand ? -1 : 1
else
direction := close < lowerBand ? 1 : -1
superTrend := direction == -1 ? lowerBand : upperBand
[superTrend, direction]
[pineSupertrend, pineDirection] = pine_supertrend(3, 10)
upTrend = pineDirection < 0
downTrend = pineDirection > 0
// Define the 20-period SMA
sma20 = ta.sma(close, 20)
a = ta.rsi(close,14)
OB = input(70)
OS = input(30)
os = a > OB
ob = a < OS
if upTrend and close > pineSupertrend and close > sma20 and os
strategy.entry("Buy", strategy.long)
if ta.crossunder(close, sma20) or ob
strategy.close_all()
//define when to breakout of channel
//("ChannelBreakOutStrategy", overlay=true)
length = input.int(title="Length", minval=1, maxval=1000, defval=5)
upBound = ta.highest(high, length)
downBound = ta.lowest(low, length)
if (not na(close[length]))
strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE")
strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE")