Эта стратегия рассчитывает сглаженный ценовой сигнал на основе теории киберцикла, предложенной Элерсом для разработки торговой стратегии с сглаженными торговыми сигналами.
Сгладить исходный ценовой сигнал src сглаживанием второго порядка, чтобы получить сглаженный сигнал.
Вычислить циклический цикл индикатора на основе сглаженного сигнала. цикл:= (1 - 0,5альфа) (1 - .5 альфа)(гладкий - 2)гладкий[1] + гладкий[2]) + 2(1 - альфа)цикл[1] - (1 - альфа)(1-альфа) * цикл[2]
где α - параметр сглаживания.
Экспоненциально сглаживать циклический индикатор с сглаживанием первого порядка, чтобы получить окончательный сигнал торгового сигнала. Сигнал:= алфа-2цикл + (1 - альфа2)nz ((сигнал[1])
где α2 - параметр сглаживания первого порядка.
Длинный, когда сигнал пересекает сигнал[1]; Короткий, когда сигнал пересекает сигнал[1].
Второй порядок сглаживания ценового сигнала может эффективно отфильтровать высокочастотный шум и сделать торговые сигналы более надежными.
Применение теории киберцикла Элерса позволяет более точно определить поворотный момент рыночных тенденций.
Экспоненциальное сглаживание первого порядка отфильтровывает часть шума в циклическом индикаторе, чтобы создать более надежные торговые сигналы.
Весь процесс стратегии является разумным и научным, с большим пространством оптимизации параметров и отличной фактической производительностью.
Как и другие стратегии технических индикаторов, эта стратегия также относительно чувствительна к системному рыночному риску.
Из-за сложного процесса расчета неправильное настройка параметров может вызвать задержку расчета, что влияет на фактическую производительность.
Сглаживание обработки также приводит к отставанию торговых сигналов, которые могут не успеть вовремя захватить переломные моменты рынка, что приводит к упущению возможностей.
Различные типы алгоритмов сглаживания могут быть протестированы, такие как экспоненциальное сглаживание первого порядка, сглаживание скользящей средней и т. д., чтобы найти оптимальную схему сглаживания.
Механизм адаптивной настройки параметров может быть введен для динамической корректировки параметров на основе рыночных условий для повышения надежности стратегии.
Стратегии остановки потерь и получения прибыли могут быть разработаны таким образом, чтобы снизить риск однократной потери и одновременно зафиксировать прибыль.
Он может быть объединен с другими моделями машинного обучения для создания портфелей моделей и использования других моделей для фильтрации торговых сигналов.
Эта стратегия разрабатывает торговый сигнал, сглаживающий стратегию торговли киберцикла Ehlers, посредством сглаживания ценового сигнала и расчета индикатора киберцикла Ehlers. Она может эффективно фильтровать шум и генерировать более надежные торговые сигналы. В то же время, пространство параметров большое, а фактическая производительность хорошая. Благодаря внедрению адаптивных механизмов, стратегий остановки потерь и другой оптимизации, стабильность и эффективность стратегии могут быть еще больше повышены.
/*backtest start: 2024-01-19 00:00:00 end: 2024-02-18 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Ehlers Cyber Cycle Strategy",overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1) src = input(hl2, title = "Source") alpha = input(.07, title = "Alpha") lag = input(9, title = "Lag") smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6 cycle = na if na(cycle[7]) cycle := (src - 2 * src[1] + src[2]) / 4 else cycle := (1 - .5 * alpha) * (1 - .5 * alpha) * (smooth - 2 * smooth[1] + smooth[2]) + 2 * (1 - alpha) * cycle[1] - (1 - alpha) * (1 - alpha) * cycle[2] alpha2 = 1 / (lag + 1) signal = na signal := alpha2 * cycle + (1 - alpha2) * nz(signal[1]) oppositeTrade = input(true) barsSinceEntry = 0 barsSinceEntry := nz(barsSinceEntry[1]) + 1 if strategy.position_size == 0 barsSinceEntry := 0 if (crossover(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossunder(signal, signal[1])) strategy.entry("Long", strategy.long) barsSinceEntry := 0 if (crossunder(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossover(signal, signal[1])) strategy.entry("Short", strategy.short) barsSinceEntry := 0 if strategy.openprofit < 0 and barsSinceEntry > 8 strategy.close_all() barsSinceEntry := 0 plot(0, title="ZeroLine", color=gray) plotSrc = signal cyclePlot = plot(plotSrc, title = "CyberCycle", color = blue) triggerPlot = plot(plotSrc[1], title = "Trigger", color = green) fill(cyclePlot, triggerPlot, color = plotSrc < plotSrc[1] ? red : lime, transp = 50)