Эта стратегия основана на индикаторе Ehlers Fisher Stochastic Relative Vigor Index, предложенном Джоном Элерсом в его книге "Кибернетический анализ акций и фьючерсов". Стратегия использует индикатор Ehlers Fisher для оценки относительной силы акций и сочетает его с пользовательскими правилами торговли для входов и выходов.
Стратегия сначала рассчитывает цену закрытия - цену открытия, которая является телом свечи. Затем она рассчитывает высокую цену - низкую цену, которая является тенью свечи. Принимая сумму и среднее значение этих двух частей соответственно, она получает импульс акции. Затем деля импульс с волатильностью акции, она получает индекс относительной энергии (RVI).
Далее на RVI применяется формула Элерса Фишера, чтобы получить значение сигнала. Он длинный, когда сигнал пересекает триггер, и короткий, когда сигнал пересекает ниже триггера. Кроме того, для контроля рисков реализуются фиксированные стоп-потери и стоп-потери.
Эта стратегия объединяет характеристики импульса и стохастический индикатор акций, которые могут эффективно определять относительную силу на рынке. Конструкция индикатора Элерса Фишера может уменьшить влияние шума и генерировать относительно надежные торговые сигналы. Индекс энергии отражает качество тренда и волатильность самого акции, что делает его динамическим индикатором.
По сравнению с использованием одного индикатора импульса или стохастического индикатора, эта стратегия органично объединяет индикаторы и модели, что может улучшить качество сигналов.
Эта стратегия в основном опирается на индикатор Элерса Фишера. Когда на рынке происходят резкие изменения, параметры индикатора необходимо оптимизировать для адаптации к новой среде. Если параметры установлены неправильно, это может генерировать неправильные сигналы или отстающие сигналы.
Кроме того, существует некоторая степень риска корректировки кривой, присущая самой стратегии. Если рыночная среда в бэкстестинге и живой торговле сильно меняется, эффективность стратегии может значительно отклоняться. В этом случае параметры стратегии должны быть скорректированы, а правила торговли требуют оптимизации для адаптации к новым рыночным условиям.
Эта стратегия может быть дополнительно оптимизирована в следующих аспектах:
Оптимизировать параметры индикатора Ehlers Fisher для повышения чувствительности или фильтрации шума.
Моделируйте индикатор с помощью алгоритмов машинного обучения, таких как LSTM, чтобы генерировать более надежные торговые сигналы.
Включить индикаторы волатильности рынка, такие как ATR, для динамической корректировки расстояния стоп-лосса.
Добавить поддержку многофакторных моделей, объединяющих другие технические и фундаментальные показатели для улучшения качества сигнала.
Оптимизировать логику открытых/закрытых позиций с динамическими критериями входа/выхода.
Эта стратегия использует индикатор Ehlers Fisher Stochastic RVI для определения тенденции и силы рынка и устанавливает разумные механизмы стоп-лосса для контроля рисков. По сравнению с одиночными индикаторами, эта стратегия органично сочетает в себе несколько индикаторов и моделей, которые могут фильтровать шум и предоставлять высококачественные сигналы.
/*backtest start: 2022-12-15 00:00:00 end: 2023-12-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Ehlers Fisher Stochastic Relative Vigor Index 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) p = input(10, title = "Length") FisherStoch(src, len) => val1 = stoch(src, src, src, len) / 100 val2 = (4 * val1 + 3 * val1[1] + 2 * val1[2] + val1[3]) / 10 FisherStoch = 0.5 * log((1 + 1.98 * (val2 - 0.5)) / (1 - 1.98 * (val2 - 0.5))) / 2.64 CO = close - open HL = high - low value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6 value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6 num = sum(value1, p) denom = sum(value2, p) RVI = denom != 0 ? num / denom : 0 signal = FisherStoch(RVI, p) trigger = signal[1] oppositeTrade = input(true) barsSinceEntry = 0 barsSinceEntry := nz(barsSinceEntry[1]) + 1 if strategy.position_size == 0 barsSinceEntry := 0 if ((crossover(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossunder(signal, trigger))) and abs(signal) > 2 / 2.64 strategy.entry("Long", strategy.long) barsSinceEntry := 0 if ((crossunder(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossover(signal, trigger))) and abs(signal) > 2 / 2.64 strategy.entry("Short", strategy.short) barsSinceEntry := 0 if strategy.openprofit < 0 and barsSinceEntry > 8 strategy.close_all() barsSinceEntry := 0 hline(0, title="ZeroLine", color=gray) signalPlot = plot(signal, title = "Signal", color = blue) triggerPlot = plot(trigger, title = "Trigger", color = green) fill(signalPlot, triggerPlot, color = signal < trigger ? red : lime, transp = 50)