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


Дата создания: 2024-03-28 18:08:18 Последнее изменение: 2024-03-28 18:08:18
Копировать: 0 Количество просмотров: 1117
1
Подписаться
1617
Подписчики

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

Обзор

Стратегия Gaussian-Channel Adaptive Equilibrium - это количественная торговая стратегия, использующая технологию Gaussian-Wave и адаптивные параметры. Основанная на теории Gaussian-Wave, разработанной Джоном Элерсом, стратегия создает гладкий и адаптивный торговый сигнал путем вычисления многократных индексных движущихся средних по ценовым данным.

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

Принципы адаптации Гаусского канала к равнолинейной стратегии следующие:

  1. Вычислить коэффициенты коэффициентов коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента коэффициента
  2. Вычислить величину истинной колебательности по Готсену. Провести такую же обработку истинной колебательности цены, получив гладкую последовательность колебательности.
  3. Построение Гаустского канала. Средняя полоса после Гаустской волны, верхняя полоса составляет среднюю полосу плюс произведение реальной амплитуды колебаний на множитель, установленный пользователем, нижняя полоса вычитает это значение, образуя динамический канал.
  4. генерирует торговый сигнал. Когда цена вверх пробивает канал вверх, генерирует сигнал купить; когда цена вниз пробивает канал вниз, генерирует сигнал продать.
  5. Введение параметров интервала времени. Пользователь может настроить время начала и окончания действия стратегии, в течение которого стратегия будет действовать в соответствии с торговым сигналом.

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

Стратегия адаптации Гаосского канала имеет следующие преимущества:

  1. Сильная адаптивность. Стратегия использует динамически корректируемые параметры, которые могут адаптироваться к различным состояниям рынка и торговым видам, без необходимости частого ручного дебютирования.
  2. Отслеживание тенденций. Построение ценового канала позволяет стратегии лучше улавливать и отслеживать рыночные тенденции и эффективно избегать ложных сигналов на рынке.
  3. Хорошая плавность. Используется высокочастотная технология для многократной плавной обработки данных о ценах, устраняя большую часть рыночного шума, что делает торговые сигналы более надежными.
  4. Высокая гибкость. Пользователь может корректировать параметры стратегии, такие как цикл отбора, количество полюсов, волатильность, чтобы оптимизировать эффективность стратегии.
  5. Высокая практичность: введены параметры временного интервала, позволяющие стратегии работать в заданном временном диапазоне, что облегчает их применение в реальном мире и обратную связь.

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

Несмотря на все преимущества адаптивной линейной стратегии, существуют определенные риски:

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

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

Оптимизирующие направления в стратегии адаптации Гаосского канала к равномерной линии включают:

  1. Оптимизация динамических параметров. Повышение адаптивности путем внедрения технологий, таких как машинное обучение, для автоматической оптимизации и динамической корректировки параметров стратегии.
  2. Многофакторное слияние: объединение других эффективных технических показателей или факторов с каналом Гауста в более стабильный торговый сигнал.
  3. Оптимизация управления позициями. Включение разумных правил управления позициями и управления капиталом на основе стратегии, контроль вывода и риска.
  4. Многовидовое взаимодействие. Расширяет стратегию на несколько различных видов торговли, распределяет риск с помощью распределения активов и анализа релевантности.

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

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

Исходный код стратегии
/*backtest
start: 2023-03-22 00:00:00
end: 2024-03-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Gaussian Channel Strategy v1.0", overlay=true, calc_on_every_tick=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)

// Date condition inputs
startDate = input(title="Date Start", type=input.time, defval=timestamp("1 Jan 2018 00:00 +0000"), group="Dates")
endDate = input(title="Date End", type=input.time, defval=timestamp("31 Dec 2060 23:59 +0000"), group="Dates")
timeCondition = true

// This study is an experiment utilizing the Ehlers Gaussian Filter technique combined with lag reduction techniques and true range to analyze trend activity.
// Gaussian filters, as Ehlers explains it, are simply exponential moving averages applied multiple times.
// First, beta and alpha are calculated based on the sampling period and number of poles specified. The maximum number of poles available in this script is 9.
// Next, the data being analyzed is given a truncation option for reduced lag, which can be enabled with "Reduced Lag Mode".
// Then the alpha and source values are used to calculate the filter and filtered true range of the dataset.
// Filtered true range with a specified multiplier is then added to and subtracted from the filter, generating a channel.
// Lastly, a one pole filter with a N pole alpha is averaged with the filter to generate a faster filter, which can be enabled with "Fast Response Mode". 

//Custom bar colors are included.

//Note: Both the sampling period and number of poles directly affect how much lag the indicator has, and how smooth the output is.
//      Larger inputs will result in smoother outputs with increased lag, and smaller inputs will have noisier outputs with reduced lag.
//      For the best results, I recommend not setting the sampling period any lower than the number of poles + 1. Going lower truncates the equation.

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Updates:
// Huge shoutout to @e2e4mfck for taking the time to improve the calculation method!
// -> migrated to v4
// -> pi is now calculated using trig identities rather than being explicitly defined.
// -> The filter calculations are now organized into functions rather than being individually defined.
// -> Revamped color scheme.

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions - courtesy of @e2e4mfck
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
 
//Filter function 
f_filt9x (_a, _s, _i) => 
    int _m2 = 0, int _m3 = 0, int _m4 = 0, int _m5 = 0, int _m6 = 0, 
    int _m7 = 0, int _m8 = 0, int _m9 = 0, float _f = .0, _x = (1 - _a)
    // Weights. 
    // Initial weight _m1 is a pole number and equal to _i
    _m2 := _i == 9 ? 36  : _i == 8 ? 28 : _i == 7 ? 21 : _i == 6 ? 15 : _i == 5 ? 10 : _i == 4 ? 6 : _i == 3 ? 3 : _i == 2 ? 1 : 0
    _m3 := _i == 9 ? 84  : _i == 8 ? 56 : _i == 7 ? 35 : _i == 6 ? 20 : _i == 5 ? 10 : _i == 4 ? 4 : _i == 3 ? 1 : 0
    _m4 := _i == 9 ? 126 : _i == 8 ? 70 : _i == 7 ? 35 : _i == 6 ? 15 : _i == 5 ? 5  : _i == 4 ? 1 : 0
    _m5 := _i == 9 ? 126 : _i == 8 ? 56 : _i == 7 ? 21 : _i == 6 ? 6  : _i == 5 ? 1  : 0 
    _m6 := _i == 9 ? 84  : _i == 8 ? 28 : _i == 7 ? 7  : _i == 6 ? 1  : 0 
    _m7 := _i == 9 ? 36  : _i == 8 ? 8  : _i == 7 ? 1  : 0 
    _m8 := _i == 9 ? 9   : _i == 8 ? 1  : 0 
    _m9 := _i == 9 ? 1   : 0
    // filter
    _f :=   pow(_a, _i) * nz(_s) + 
      _i  *     _x      * nz(_f[1])      - (_i >= 2 ? 
      _m2 * pow(_x, 2)  * nz(_f[2]) : 0) + (_i >= 3 ? 
      _m3 * pow(_x, 3)  * nz(_f[3]) : 0) - (_i >= 4 ? 
      _m4 * pow(_x, 4)  * nz(_f[4]) : 0) + (_i >= 5 ? 
      _m5 * pow(_x, 5)  * nz(_f[5]) : 0) - (_i >= 6 ? 
      _m6 * pow(_x, 6)  * nz(_f[6]) : 0) + (_i >= 7 ? 
      _m7 * pow(_x, 7)  * nz(_f[7]) : 0) - (_i >= 8 ? 
      _m8 * pow(_x, 8)  * nz(_f[8]) : 0) + (_i == 9 ? 
      _m9 * pow(_x, 9)  * nz(_f[9]) : 0)

//9 var declaration fun
f_pole (_a, _s, _i) =>
    _f1 =            f_filt9x(_a, _s, 1),      _f2 = (_i >= 2 ? f_filt9x(_a, _s, 2) : 0), _f3 = (_i >= 3 ? f_filt9x(_a, _s, 3) : 0)
    _f4 = (_i >= 4 ? f_filt9x(_a, _s, 4) : 0), _f5 = (_i >= 5 ? f_filt9x(_a, _s, 5) : 0), _f6 = (_i >= 6 ? f_filt9x(_a, _s, 6) : 0)
    _f7 = (_i >= 2 ? f_filt9x(_a, _s, 7) : 0), _f8 = (_i >= 8 ? f_filt9x(_a, _s, 8) : 0), _f9 = (_i == 9 ? f_filt9x(_a, _s, 9) : 0)
    _fn = _i == 1 ? _f1 : _i == 2 ? _f2 : _i == 3 ? _f3 :
      _i == 4     ? _f4 : _i == 5 ? _f5 : _i == 6 ? _f6 :
      _i == 7     ? _f7 : _i == 8 ? _f8 : _i == 9 ? _f9 : na
    [_fn, _f1]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Source
src = input(defval=hlc3, title="Source")

//Poles
int N = input(defval=4, title="Poles", minval=1, maxval=9)

//Period
int per = input(defval=144, title="Sampling Period", minval=2)

//True Range Multiplier
float mult = input(defval=1.414, title="Filtered True Range Multiplier", minval=0)

//Lag Reduction
bool modeLag  = input(defval=false, title="Reduced Lag Mode")
bool modeFast = input(defval=false, title="Fast Response Mode")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Beta and Alpha Components
beta  = (1 - cos(4*asin(1)/per)) / (pow(1.414, 2/N) - 1)
alpha = - beta + sqrt(pow(beta, 2) + 2*beta)

//Lag
lag = (per - 1)/(2*N)

//Data
srcdata = modeLag ? src + (src - src[lag]) : src
trdata  = modeLag ? tr(true) + (tr(true) - tr(true)[lag]) : tr(true)

//Filtered Values
[filtn, filt1]     = f_pole(alpha, srcdata, N)
[filtntr, filt1tr] = f_pole(alpha, trdata,  N)

//Lag Reduction
filt   = modeFast ? (filtn + filt1)/2 : filtn
filttr = modeFast ? (filtntr + filt1tr)/2 : filtntr

//Bands
hband = filt + filttr*mult
lband = filt - filttr*mult

// Colors
color1   = #0aff68
color2   = #00752d
color3   = #ff0a5a
color4   = #990032
fcolor   = filt > filt[1] ? #0aff68 : filt < filt[1] ? #ff0a5a : #cccccc
barcolor = (src > src[1]) and (src > filt) and (src < hband) ? #0aff68 : (src > src[1]) and (src >= hband) ? #0aff1b : (src <= src[1]) and (src > filt) ? #00752d : 
           (src < src[1]) and (src < filt) and (src > lband) ? #ff0a5a : (src < src[1]) and (src <= lband) ? #ff0a11 : (src >= src[1]) and (src < filt) ? #990032 : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filtplot = plot(filt, title="Filter", color=fcolor, linewidth=3)

//Band Plots
hbandplot = plot(hband, title="Filtered True Range High Band", color=fcolor)
lbandplot = plot(lband, title="Filtered True Range Low Band", color=fcolor)

//Channel Fill
fill(hbandplot, lbandplot, title="Channel Fill", color=fcolor, transp=80)

//Bar Color
barcolor(barcolor)


longCondition = crossover(close, hband) and timeCondition
closeAllCondition = crossunder(close, hband) and timeCondition

if longCondition
    strategy.entry("long", strategy.long)

if closeAllCondition
    strategy.close("long")