Chiến lược này kết hợp các chỉ số Elastic Vibration, Vibration Cycle, Trend Line Instant, và các chỉ số hệ số liên quan đến mức độ Spellman để tạo thành một chiến lược giao dịch định lượng toàn diện. Chiến lược này được gọi là Chiến lược kết hợp chỉ số Vibration Quantified.
Chiến lược này được đánh giá dựa trên 4 chỉ số quan trọng.
Thứ nhất, chỉ số Elastic Vibration của Enel, được tạo ra từ đường tín hiệu thông qua đường trung bình chỉ số được làm mịn, có thể xác định được hướng và cường độ của xu hướng hiện tại. Thứ hai, chỉ số vòng lặp của Enel, có thể xác định hiệu quả các điểm thấp của chu kỳ chu kỳ và xác định xem xu hướng chính có bị đảo ngược hay không. Một lần nữa, đường xu hướng tức thời của Enel theo dõi đường trung bình di chuyển nhanh để xác định hướng của xu hướng ngắn hạn.
Cụ thể, bốn điều kiện nhập cảnh của chiến lược là: đường tín hiệu của chỉ số nhịp nhàng và đường tín hiệu của chỉ số chu kỳ đi lên cùng một lúc; đường nguyên thủy đi lên vượt qua đường chu kỳ; đường nguyên thủy cao hơn đường xu hướng ngay lập tức tăng; hệ số liên quan cấp Spielman là dương.
Trong khi đó, các điều kiện ra sân là đơn giản hơn nhiều, chỉ khi đường nguyên thủy vượt qua đường xu hướng tức thời.
Điều kiện làm không tương tự như điều kiện làm nhiều, chỉ có điều kiện phán đoán được đảo ngược.
Ưu điểm lớn nhất của chiến lược này là kết hợp các chỉ số phù hợp, có thể tận dụng hiệu quả lợi thế của từng chỉ số, xác minh lẫn nhau, tránh kết quả dương tính giả, do đó lọc ra nhiều tiếng ồn và làm cho tín hiệu đáng tin cậy hơn.
Cụ thể, chỉ số rung nhã thanh lịch có thể xác định hướng và cường độ của xu hướng, chỉ số chu kỳ có thể xác định điểm biến chu kỳ, đường xu hướng tức thời có thể xác định xu hướng ngắn hạn, hệ số liên quan cấp Spielman có thể xác định quan hệ giá trị. Kết hợp bốn, có thể xác định toàn diện các đặc điểm của thị trường về xu hướng, chu kỳ, động lực và giá trị, do đó có tín hiệu giao dịch đáng tin cậy cao.
Ngoài ra, chiến lược này chỉ dùng đường trung bình làm đối tượng tham chiếu, tránh nhiễu loạn của tiếng ồn thị trường ngắn hạn, có thể giảm giao dịch đảo ngược không cần thiết. Đồng thời, tín hiệu chiến lược ít có, quy tắc xuất cảnh đơn giản, có thể làm giảm đáng kể tần suất giao dịch, tránh các vấn đề giao dịch quá mức.
Rủi ro lớn nhất của chiến lược này là thiếu cơ chế dừng lỗ. Việc không thể dừng lỗ kịp thời khi thị trường thay đổi mạnh có thể dẫn đến tổn thất. Ngoài ra, thiếu bộ lọc bổ sung, chẳng hạn như bộ lọc hệ thống biên và chỉ số năng lượng, có thể dẫn đến một số giao dịch sai lạc.
Để giảm thiểu những rủi ro này, có thể thiết lập điểm dừng an toàn, tự động dừng lại khi lỗ vượt quá một tỷ lệ nhất định. Ngoài ra, có thể tham gia chỉ số động lực như MACD để xác minh lại, tránh rủi ro do phá vỡ giả.
Chính sách này có thể được tối ưu hóa theo các khía cạnh sau:
Tham gia vào cơ chế dừng an toàn. Xây dựng điểm dừng tương ứng với việc tính toán rút lui tối đa dựa trên dữ liệu đánh giá lịch sử.
Thêm bộ lọc. Thêm các chỉ số MACD, Brin và các chỉ số khác để lọc nhiều lớp, giảm thêm tín hiệu giả.
Kết hợp nhiều chu kỳ thời gian hơn. Hiện tại chỉ có một tập hợp các tham số, có thể giới thiệu nhiều tham số chu kỳ hơn, sử dụng phương thức xác minh nhiều trục thời gian, cải thiện sự ổn định.
Thêm mô-đun tối ưu hóa tham số, điều chỉnh các tham số chỉ số theo các điều kiện thị trường khác nhau, làm cho chiến lược thích ứng hơn.
Định giá đa giống. Áp dụng chiến lược cho các giống khác nhau, tìm kiếm cơ hội để định giá để kiểm soát rủi ro hơn nữa.
Chiến lược này sử dụng sự kết hợp khéo léo của bốn chỉ số lớn của Ernst để tạo ra chiến lược giao dịch toàn diện để đánh giá xu hướng, chu kỳ, động lực và giá cả. Nó có khả năng lọc tiếng ồn tuyệt vời, có thể tạo ra 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')