Стратегия торговли на основе скользящей средней Гаусса


Дата создания: 2024-01-03 16:06:45 Последнее изменение: 2024-01-03 16:06:45
Копировать: 0 Количество просмотров: 1104
1
Подписаться
1621
Подписчики

Стратегия торговли на основе скользящей средней Гаусса

Обзор

Эта стратегия использует идею Гауссского распределения, рассчитывает Z-значение на основе 10-циклического скользящего среднего показателя по Геккли, затем устанавливает порог для 20-циклического скользящего среднего показателя по этому Z-значению, и определяет позиции, которые должны быть открыты или закрыты, в зависимости от того, как пересекается кривая.

Стратегический принцип

  1. Вычислить 10-циклический индекс скользящих средних цен на хеккли.

  2. На основе данных перемещающейся средней вычислить значение Z за 25 циклов. Значение Z отражает стандартное отклонение данных от среднего значения, и можно определить, являются ли данные нормальными или аномальными.

  3. 20-циклическая скользящая средняя Z-значений рассчитывается заново, получая кривую emaScore. Эта кривая отражает долгосрочные тенденции Z-значений.

  4. В зависимости от распределения данных emaScore, устанавливается верхний или нижний порог. Учитывая, что кривая может иметь некоторое колебание, здесь выбираются 90% и 10% данных распределения в качестве порога.

  5. При прохождении средней или нижней границы на emaScore, сделайте больше; при прохождении нижней границы, нижней границы или максимума за 100 циклов на emaScore, сделайте пустоту.

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

  1. Применение распределения Гаусса, для определения нормальности по Z-значению, может отфильтровывать ложные прорывы.

  2. Двойная фильтрация, вычисление кривой exeScore и определение долгосрочных тенденций EXTENSIVE511.

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

  4. В сочетании с самыми высокими и самыми низкими точками столетнего цикла, можно воспользоваться возможностью поворота.

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

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

  2. Настройка порогового значения имеет отношение к тому, является ли оно разумным или большим, и будет ли оно слишком широким или слишком узким.

  3. Высокие и низкие точки сотни циклов могут привести к ошибочным сигналам, а также к соответствующему расслаблению условий запуска.

  4. Сам по себе “Хейклик” отстает, и его целесообразность должна быть оценена.

Направление оптимизации

  1. Тестирование скользящих средних за различные периоды, параметры Z-значений.

  2. Автоматическая оптимизация параметров с использованием метода walk forward analysis.

  3. Попробуйте различные методы определения порога, например, умножение стандартной разницы.

  4. Улучшение логики определения наивысшей и низшей точек, предотвращение ошибочных сигналов.

  5. Попробуйте другие типы керамики или альтернативы, такие как керамика Хайкли.

Подвести итог

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

Исходный код стратегии
/*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")