Chiến lược giao dịch kết hợp nhiều chỉ báo ADX, RSI, SMA


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

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

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:

  1. Chỉ số hướng trung bình ((ADX): đánh giá cường độ xu hướng

  2. Chỉ số tương đối yếu (RSI): đánh giá quá mua quá bán

  3. Đường trung bình (SMA): đánh giá xu hướng ngắn hạn

  4. Chỉ số SAR cực đoan: Xác định xu hướng dài hạn

  5. Thâm nhập: Thâm nhập theo xu hướng

Logic giao dịch:

  1. ADX cho rằng xu hướng có và đủ mạnh

  2. SAR đánh giá xu hướng dài hạn nhất quán

  3. RSI xác định khoảng giá quá mua quá bán

  4. Tham gia khi giá vượt qua đường SMA

  5. 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.

Lợi thế chiến lược

  • 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á

Rủi ro chiến lược

  • 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ý

Tóm tắt

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ý.

Mã nguồn chiến lược
/*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")