Chiến lược kết hợp chỉ số dao động định lượng

Tác giả:ChaoZhang, Ngày: 2024-02-27 16:46:42
Tags:

img

Tổng quan

Chiến lược này kết hợp Tiến độ Elegant của Ehlers, Tiến độ Decycler của Ehlers, Đường xu hướng tức thời của Ehlers và hệ số tương quan xếp hạng của Ehlers Spearman thành một chiến lược, tạo thành một chiến lược giao dịch định lượng nắm bắt hoàn toàn xu hướng, dao động, động lượng và đặc điểm giá & khối lượng.

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

Chiến lược này sử dụng 4 chỉ số chính để đánh giá.

Đầu tiên, Đường dao động thanh lịch Ehlers, trong đó sự khác biệt giữa đường ban đầu và đường tín hiệu được làm mịn bằng đường trung bình động theo cấp số nhân có thể xác định hướng và sức mạnh xu hướng hiện tại. Thứ hai, Đường dao động Ehlers, có thể xác định hiệu quả các điểm thấp của chu kỳ và xác định xem xu hướng chính đang đảo ngược hay không. Tiếp theo, Đường xu hướng tức thời Ehlers theo dõi đường trung bình di chuyển nhanh để đánh giá hướng xu hướng ngắn hạn. Cuối cùng, hệ số tương quan xếp hạng Ehlers Spearman đánh giá mối quan hệ giá - khối lượng, có thể lọc hiệu quả các đột phá sai.

Cụ thể, bốn điều kiện đầu vào cho chiến lược là: đường tín hiệu Elegant Oscillator và đường tín hiệu Decycler đồng thời phá vỡ trên 0, đường ban đầu phá vỡ trên đường Decycler, đường ban đầu cao hơn đường xu hướng tức thời tăng và hệ số tương quan xếp hạng Spearman dương.

Các điều kiện thoát ra đơn giản hơn nhiều: thoát ra khi đường ban đầu giảm xuống dưới đường xu hướng tức thời.

Các điều kiện ngắn tương tự như các điều kiện dài, chỉ đảo ngược.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này nằm ở sự kết hợp phù hợp của các chỉ số, có thể tận dụng hiệu quả các điểm mạnh của mỗi chỉ số, xác minh lẫn nhau, tránh các kết quả dương tính giả, lọc ra nhiều tiếng ồn và tạo ra các tín hiệu đáng tin cậy hơn.

Cụ thể, Bộ dao động thanh lịch có thể đánh giá hướng xu hướng và sức mạnh, Bộ dao động giảm giá có thể đánh giá các điểm chuyển đổi chu kỳ, Đường xu hướng tức thời có thể đánh giá xu hướng ngắn hạn và Xếp hạng Spearman đánh giá mối quan hệ giá-tháng lượng. Sự kết hợp của bốn bộ dao động có thể đánh giá toàn diện các đặc điểm thị trường về xu hướng, chu kỳ, động lực và khối lượng giá, do đó tạo ra các tín hiệu giao dịch rất đáng tin cậy.

Ngoài ra, chỉ với giá trung hạn như tham chiếu, chiến lược tránh sự can thiệp từ tiếng ồn thị trường ngắn hạn và giảm các giao dịch đảo ngược không cần thiết.

Phân tích rủi ro

Rủi ro lớn nhất của chiến lược này là thiếu cơ chế dừng lỗ. Trong trường hợp biến động thị trường dữ dội, không thể dừng lỗ kịp thời có thể dẫn đến tổn thất lớn hơn. Nó cũng thiếu các bộ lọc bổ sung như Các kênh Donchian và các chỉ số năng lượng có thể dẫn đến một số mức độ giao dịch dương tính sai.

Để giảm thiểu những rủi ro này, một lệnh dừng lỗ bảo vệ có thể được thiết lập để tự động dừng lỗ khi lỗ vượt quá một số mức nhất định.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Thêm vào một cơ chế quản lý rủi ro dừng lỗ.

  2. Thêm thêm các bộ lọc. Thêm các chỉ số như MACD, Bollinger Bands để lọc nhiều hơn để giảm thêm các tín hiệu sai.

  3. Thêm nhiều khung thời gian hơn. Hiện tại chỉ có một bộ tham số được sử dụng. Có thể thêm nhiều khung thời gian cho xác minh nhiều khung thời gian để cải thiện tính ổn định.

  4. Điều chỉnh động các tham số. Thêm tối ưu hóa tham số để điều chỉnh động các tham số chỉ số dựa trên các điều kiện thị trường thay đổi để cải thiện khả năng thích nghi.

  5. Đặt ra chiến lược trên các tài sản khác nhau để tìm kiếm các cơ hội phân phối để kiểm soát tốt hơn rủi ro.

Kết luận

Chiến lược này kết hợp thông minh 4 chỉ số Ehlers chính để tạo thành một chiến lược đánh giá xu hướng, chu kỳ, động lực và khối lượng giá trong tất cả các khía cạnh. Nó có khả năng lọc tiếng ồn tuyệt vời và có thể tạo ra các tín hiệu chất lượng cao.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © simwai

//@version=5
strategy('Ehlers Elegant Oscillator + Ehlers Decycler + Ehlers Instantaneous + Ehlers Spearman Rank', 'Ehlers Combo', overlay=true, margin_long=100, margin_short=100)

// -- Inputs --
inp = input(title='Source', defval=close)
res = input.timeframe(title='Resolution', defval='')
bar = input(title='Allow Bar Color Change?', defval=true)
src = inp
length = input.int(title='Length', defval=20, minval=2, maxval=300)
rmsLength = input.int(title='Rms Length', defval=50, minval=2)
decyclerLength = length

// -- Calculation --
// Ehlers Elegant Oscillator
a1 = math.exp(-1.414 * math.pi / length)
b1 = 2 * a1 * math.cos(1.414 * math.pi / length)
c2 = b1
c3 = -a1 * a1
c1 = 1 - c2 - c3

deriv = src - nz(src[2])
rms = math.avg(math.pow(deriv, 2), rmsLength)
rms := rms != 0 ? math.sqrt(rms) : 0
nDeriv = rms != 0 ? deriv / rms : 0
iFish = nDeriv != 0 ? (math.exp(2 * nDeriv) - 1) / (math.exp(2 * nDeriv) + 1) : 0

ss = 0.0
ss := bar_index < 3 ? 0 : (c1 * ((iFish + nz(iFish[1])) / 2)) + (c2 * nz(ss[1])) + (c3 * nz(ss[2]))
ssSig = ta.wma(ss, length)

slo = ss - ssSig
sig = slo > 0 ? slo > nz(slo[1]) ? 2 : 1 : slo < 0 ? slo < nz(slo[1]) ? -2 : -1 : 0
eoColor = sig > 1 ? color.green : sig > 0 ? color.lime : sig < -1 ? color.maroon : sig < 0 ? color.red : color.black

hline(0)
plot(ssSig, title='EO', color=eoColor, linewidth=2)

// Ehlers Decycler
pi = 2 * math.asin(1)
twoPiPrd = 2 * pi / decyclerLength
alpha = (math.cos(twoPiPrd) + math.sin(twoPiPrd) - 1) / math.cos(twoPiPrd)

dec = 0.0
dec := ((alpha / 2) * (src + nz(src[1]))) + ((1 - alpha) * nz(dec[1]))

decyclerSig = src > dec ? 1 : src < dec ? -1 : 0
decColor = decyclerSig > 0 ? color.green : decyclerSig < 0 ? color.red : color.black
plot(dec, title='Decycler', color=decColor, linewidth=2)

// Ehlers Instantaneous Trendline
getItrend(src, alpha) =>
    Price = src
    Smooth = 0.0
    ITrend = 0.0
    Trigger = 0.0
    
    ITrend := (alpha - alpha * alpha / 4) * Price + .5 * alpha * alpha  * Price[1] - (alpha - .75 * alpha * alpha) * Price[2] + 2 * (1 - alpha) * nz(ITrend[1]) - (1 - alpha) * (1 - alpha) * nz(ITrend[2])
    if(bar_index < 7)
        ITrend := (Price + 2 * Price[1] + Price[2]) / 4
    Trigger := 2 * ITrend - ITrend[2]
    [ITrend, Trigger]

itrendAlpha = 2 / (length + 1) / 2
[iT, Tr] = getItrend(src, itrendAlpha)

iTColor = Tr > iT ? color.aqua : color.maroon
plot(iT, 'Instantaneous Trend', iTColor, 2)

// Ehlers Spearman Rank
priceArray = array.new_float(300, 0.0)
rank = array.new_float(300, 0.0)
for i = 1 to length
    array.set(priceArray, i, nz(src[i - 1]))
    array.set(rank, i, i)

for i = 1 to length
    count = length + 1 - i
    for j = 1 to length - count
        if array.get(priceArray, j + 1) < array.get(priceArray, j)
            tempPrice = array.get(priceArray, j)
            tempRank = array.get(rank, j)
            array.set(priceArray, j, array.get(priceArray, j + 1))
            array.set(rank, j, array.get(rank, j + 1))
            array.set(priceArray, j + 1, tempPrice)
            array.set(rank, j + 1, tempRank)
         
sum = 0.0   
for i = 1 to length
    sum := sum + math.pow(i - array.get(rank, i), 2)
signal = 2 * (0.5 - (1 - ((6 * sum) / (length * (math.pow(length, 2) - 1)))))
spearmanSlo = signal - nz(signal[1])
spearmanSig = spearmanSlo > 0 or signal > 0 ? spearmanSlo > nz(spearmanSlo[1]) ? 2 : 1 : spearmanSlo < 0 or signal < 0 ? spearmanSlo < nz(spearmanSlo[1]) ? -2 : -1 : 0

// -- Signals --
bool enterLong = ta.crossover(sig, 0) and ta.crossover(decyclerSig, 0) and ta.crossover(src, dec) and (src > iT) and iT[1] < iT and spearmanSig > 0
bool enterShort = ta.crossunder(sig, 0) and ta.crossunder(decyclerSig, 0) and ta.crossunder(src, dec) and (src < iT) and iT[1] > iT and spearmanSig < 0
bool exitLong = ta.crossunder(src[100], iT) 
bool exitShort = ta.crossover(src[100], iT)

barcolor(bar and strategy.position_size > 0 ? color.green : bar and strategy.position_size < 0 ? color.red : color.gray)

// -- Long Exits --
strategy.close('long', when=exitLong and strategy.position_size > 0, comment='EXIT_LONG')

// -- Short Exits --
strategy.close('short', when=exitShort and strategy.position_size < 0, comment='EXIT_SHORT')

bool isStrategyEntryEnabled = true
// -- Long Entries --
if (isStrategyEntryEnabled)
    strategy.entry('long', strategy.long, when=enterLong, comment='ENTER_LONG')
else
    strategy.order('long', strategy.long, when=enterLong, comment='ENTER_LONG')

// -- Short Entries --
if (isStrategyEntryEnabled)
    strategy.entry('short', strategy.short, when=enterShort, comment='ENTER_SHORT')
else
    strategy.order('short', strategy.short, when=enterShort, comment='ENTER_SHORT')



Thêm nữa