Стратегия комбинации количественных показателей колебаний

Автор:Чао Чжан, Дата: 2024-02-27 16:46:42
Тэги:

img

Обзор

Эта стратегия объединяет Элерс элегантный осциллятор, Элерс дециклер, Элерс мгновенная линия тренда и Элерс Спирман коэффициент корреляции ранга в одну стратегию, формируя количественную торговую стратегию, которая полностью охватывает тенденции, колебания, импульс и характеристики цены и объема.

Принципы стратегии

Эта стратегия использует 4 ключевых показателя для оценки.

Во-первых, Элерс элегантный осциллятор, где разница между исходной линией и сигнальной линией, сглаженной экспоненциальной скользящей средней, может определить направление и силу текущего тренда. Во-вторых, Элерс дециклер, который может эффективно идентифицировать низкие точки цикла и определить, обращается ли основный тренд. Далее, Элерс мгновенная линия тренда отслеживает быстро движущиеся средние, чтобы судить о краткосрочных направлениях тренда. Наконец, коэффициент корреляции ранга Элерса Спирмана оценивает отношение цена-объем, который может эффективно фильтровать ложные прорывы.

В частности, четыре условия входа в стратегию: линия сигнала Elegant Oscillator и линия сигнала Decycler одновременно превышают 0, первоначальная линия превышает линию Decycler, первоначальная линия выше растущей мгновенной линии тренда и положительный коэффициент корреляции ранга Спирмана.

Условия выхода намного проще: выход, когда исходная линия опускается ниже мгновенной линии тренда.

Короткие условия похожи на длинные условия, только с обратной стороны.

Анализ преимуществ

Наибольшее преимущество этой стратегии заключается в соответствующей комбинации индикаторов, которые могут эффективно использовать сильные стороны каждого индикатора, взаимно проверять, избегать ложноположительных результатов, фильтровать много шума и генерировать более надежные сигналы.

В частности, Элегантный осциллятор может судить о направлении и силе тренда, Дециклер может судить о поворотных точках цикла, Мгновенная линия тренда может судить о краткосрочных тенденциях, а Рейтинг Спирмана судит о взаимосвязи цены и объема.

Кроме того, используя только среднесрочные цены в качестве отсчета, стратегия избегает помех от краткосрочного шума рынка и уменьшает ненужные операции с обратным движением.

Анализ рисков

Самый большой риск этой стратегии заключается в отсутствии механизма остановки потерь. В случае насильственных рыночных движений неспособность вовремя остановить потерю может привести к большим потерям.

Для смягчения этих рисков можно установить защитный стоп-лосс, который автоматически останавливает потери, когда потери превышают определенные уровни.

Руководство по оптимизации

Стратегия может быть оптимизирована в следующих аспектах:

  1. Добавьте механизм управления рисками стоп-лосса. Вычислите максимальный исторический вывод, чтобы установить соответствующие уровни стоп-лосса.

  2. Добавьте дополнительные фильтры. Добавьте такие индикаторы, как MACD, Bollinger Bands для большей фильтрации, чтобы еще больше уменьшить ложные сигналы.

  3. Включить больше временных рамок. В настоящее время используется только один набор параметров. Для улучшения стабильности можно добавить больше временных рамок для проверки с несколькими временными рамками.

  4. Динамическая настройка параметров. Добавьте оптимизацию параметров для динамической настройки параметров показателей на основе меняющихся рыночных условий для улучшения адаптивности.

  5. Применение стратегии на различные активы, чтобы искать возможности арбитража для лучшего контроля рисков.

Заключение

Эта стратегия умело сочетает в себе 4 основных индикатора Ehlers, чтобы сформировать стратегию, которая оценивает тенденции, циклы, импульс и объем цен во всех аспектах. Она имеет превосходные возможности фильтрации шума и может производить высококачественные сигналы. Но отсутствие стоп-потери и фильтрации вспомогательных индикаторов подвергает ее некоторым рискам. Добавляя стоп-потери, фильтры, больше временных рамок и т. д., ее можно эффективно оптимизировать для повышения стабильности и надежности.


/*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')



Больше