
Эта стратегия использует идею Гауссского распределения, рассчитывает Z-значение на основе 10-циклического скользящего среднего показателя по Геккли, затем устанавливает порог для 20-циклического скользящего среднего показателя по этому Z-значению, и определяет позиции, которые должны быть открыты или закрыты, в зависимости от того, как пересекается кривая.
Вычислить 10-циклический индекс скользящих средних цен на хеккли.
На основе данных перемещающейся средней вычислить значение Z за 25 циклов. Значение Z отражает стандартное отклонение данных от среднего значения, и можно определить, являются ли данные нормальными или аномальными.
20-циклическая скользящая средняя Z-значений рассчитывается заново, получая кривую emaScore. Эта кривая отражает долгосрочные тенденции Z-значений.
В зависимости от распределения данных emaScore, устанавливается верхний или нижний порог. Учитывая, что кривая может иметь некоторое колебание, здесь выбираются 90% и 10% данных распределения в качестве порога.
При прохождении средней или нижней границы на emaScore, сделайте больше; при прохождении нижней границы, нижней границы или максимума за 100 циклов на emaScore, сделайте пустоту.
Применение распределения Гаусса, для определения нормальности по Z-значению, может отфильтровывать ложные прорывы.
Двойная фильтрация, вычисление кривой exeScore и определение долгосрочных тенденций EXTENSIVE511.
Установление разумного порога снижает вероятность ошибочных сделок.
В сочетании с самыми высокими и самыми низкими точками столетнего цикла, можно воспользоваться возможностью поворота.
Z-значения используются в комбинации с скользящими средними, чувствительны к параметрам и требуют оптимизации.
Настройка порогового значения имеет отношение к тому, является ли оно разумным или большим, и будет ли оно слишком широким или слишком узким.
Высокие и низкие точки сотни циклов могут привести к ошибочным сигналам, а также к соответствующему расслаблению условий запуска.
Сам по себе “Хейклик” отстает, и его целесообразность должна быть оценена.
Тестирование скользящих средних за различные периоды, параметры Z-значений.
Автоматическая оптимизация параметров с использованием метода walk forward analysis.
Попробуйте различные методы определения порога, например, умножение стандартной разницы.
Улучшение логики определения наивысшей и низшей точек, предотвращение ошибочных сигналов.
Попробуйте другие типы керамики или альтернативы, такие как керамика Хайкли.
Эта стратегия основана на идее распределения Гаусса, с помощью двойного индекса для установления движущихся средних и динамических порогов, эффективное определение ценных аномалий и создание торговых сигналов. Основным преимуществом является возможность фильтрации ложных прорывов и захвата обратных поворотов. Однако параметры и комбинации, используемые для их использования, оказывают огромное влияние на результаты, поэтому необходимо продолжать тестирование и оптимизацию, чтобы найти оптимальный параметр и комбинацию.
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © jensenvilhelm
// Here is an attempt to create a robust strategy for BTCUSD on a 5 minute chart
// I can't seem to get this code to work the way i want.... if you want to give it a try, please let me know -
// how it goes in comment section.
//@version=5
// Define the strategy settings
strategy("The Z-score", shorttitle="TZS", overlay=true)
// User can set the start date for the strategy
startDate = timestamp("2023 06 01")
// Heikin-Ashi Open, Close, High and Low calculation
haClose = ohlc4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2
haHigh = math.max(nz(haOpen, high), nz(haClose, high), high)
haLow = math.min(nz(haOpen, low), nz(haClose, low), low)
// Function to calculate the Z-Score
z_score(_series, _length) =>
_mean = ta.sma(_series, _length)
_stddev = ta.stdev(_series, _length)
(_series - _mean) / _stddev
// Compute the score and its EMA
score = z_score(ta.ema(haClose, 10), 25)
emaScore = ta.ema(score, 20)
// Calculate lower and upper thresholds using percentiles of EMA
lowerBlue = ta.percentile_linear_interpolation(emaScore, 50, 10)
upperBlue = ta.percentile_linear_interpolation(emaScore, 50, 90)
// Calculate the middle line as 50th percentile
middleLine = ta.percentile_linear_interpolation(emaScore, 50, 50)
// Plot the EMA of the score and the thresholds
plot(emaScore,"The White Line", color=color.white, linewidth=2)
plot(lowerBlue,"Lower Blue Line", linewidth=2)
plot(upperBlue, "Upper Blue Line", linewidth=2)
plot(middleLine, "Middle Yellow Line", linewidth=2, color=color.yellow)
plot(score,"The Z-Score Mixed With EMA 10", color=color.green)
// Calculate highest and lowest EMA score over 100 bars period
highest = ta.highest(emaScore, 100)
lowest = ta.lowest(emaScore, 100)
// Plot highest and lowest EMA score lines
plot(highest, "Highest of emaScore", color=color.red, linewidth=2)
plot(lowest, "Lowest of emaScore", color=color.red, linewidth=2)
// Define entry and exit conditions for long and short positions
longCon = ta.crossover(score, lowerBlue) or ta.crossover(emaScore, middleLine)
addOn = ta.crossover(score, highest)
shortCon = ta.crossunder(emaScore, upperBlue) or ta.crossunder(emaScore, lowerBlue) or ta.crossunder(emaScore, highest)
// Execute trading logic based on conditions and after the start date
if (time >= startDate)
if longCon
strategy.entry("Long", strategy.long)
if shortCon
strategy.close("Long")
if addOn
strategy.entry("LongNR2", strategy.long)
if shortCon
strategy.close("LongNR2")
if shortCon
strategy.entry("Short", strategy.short)
if longCon
strategy.close("Short")