GoertzelBrain: Адаптивное спектральное обнаружение циклов с помощью ансамбля нейронных сетей в MQL5
Введение
Анализ циклов имеет давнюю историю на финансовых рынках. Трейдеры всегда стремились выявлять повторяющиеся паттерны — периодические ценовые структуры, которые при достоверном обнаружении могут дать преимущество при выборе момента входа в рынок и выхода из него. Сложность заключается в том, что финансовые циклы носят нестационарный характер: они возникают, смещаются, усиливаются, ослабевают и исчезают так, что статические инструменты измерения оказываются бессильны.
Алгоритм Гертцеля, впервые предложенный Джеральдом Гертцелем в 1958 году, представляет собой эффективный метод вычисления отдельных частотных компонент дискретного преобразования Фурье. Возможности его применения на финансовых рынках были рассмотрены в предыдущей статье на MQL5, написанной Francis Dube под названием «Анализ циклов с использованием алгоритма Гертцеля», в которой были представлены классы CGoertzel и CGoertzelCycle для MQL5. В этой работе было продемонстрировано, как алгоритм позволяет выявлять доминирующие циклы в ценовых данных с большей вычислительной эффективностью, чем полный расчет БПФ, и с более высокой устойчивостью к шуму по сравнению с методом MESA Элерса.
Однако знание того, какой цикл доминирует в данный момент, — это лишь половина дела. На самом деле вопрос заключается в следующем: что этот цикл говорит нам о том, что произойдет дальше? 40-барный цикл с пиковой амплитудой может означать, что разворот не за горами, — а может означать и то, что цикл вот-вот полностью разрушится. Контекст имеет значение, и именно его простой спектральный анализ сам по себе обеспечить не может.
В данной статье представлен индикатор GoertzelBrain, который сочетает спектральный анализ по Гертцелю с ансамблем самообучающихся нейронных сетей для формирования адаптивного, учитывающего контекст сигнала цикла. Вместо того чтобы просто сообщать, какой цикл присутствует, GoertzelBrain учится интерпретировать спектральные признаки в контексте недавнего поведения цены и генерирует сигнал подтверждения направления, который адаптируется к изменениям рыночных условий.
Мы рассмотрим математические основы, полную реализацию на языке MQL5, архитектуру ансамбля нейронных сетей, а также практические способы применения индикатора в качестве направленного фильтра.
Проблема статического обнаружения циклов
Традиционные методы обнаружения циклов имеют одно фундаментальное ограничение: они показывают, что происходит в частотной области, но не дают представления о том, что это означает для следующего бара. Рассмотрим результаты работы стандартного спектрального анализатора Гертцеля. На любом отдельно взятом баре он может сообщать, что доминирует 34-барный цикл с большой амплитудой. Однако одной только этой информации недостаточно, чтобы ответить на вопрос трейдера: занимать длинную или короткую позицию?
Эта сложность обусловлена несколькими факторами:
- Неоднозначность фазы. Алгоритм Гертцеля вычисляет амплитуду и фазу для каждого частотного бина, однако значение фазы, как известно, крайне нестабильно на границе окна анализа. Незначительные изменения цены могут приводить к значительным фазовым сдвигам, из-за чего фазу нельзя надежно использовать в качестве прямого торгового сигнала.
- Переходы между циклическими режимами. Финансовые циклы не переходят от одного периода к другому четко и резко. Существуют переходные зоны, в которых несколько циклов накладываются друг на друга, конкурируют и создают взаимные помехи. Статический спектральный срез не позволяет отличить стабильный доминирующий цикл от цикла, который начинает распадаться.
- Нестационарность. Статистические характеристики ценовых данных постоянно меняются. Цикл, который имел большое значение в условиях тренда, может утратить всякое значение в период бокового движения. Любой полезный индикатор цикла должен каким-то образом учитывать этот фактор.
GoertzelBrain решает эти проблемы, извлекая многомерный вектор признаков из выходных данных алгоритма Гертцеля и подавая его в ансамбль нейронных сетей, которые со временем обучаются интерпретировать спектральный контекст.

Рисунок 1. GoertzelBrain на USDCAD M15: зеленая гистограмма подтверждает смещение в сторону длинных позиций во время декабрьско-январского восходящего тренда; красные бары появляются при смене циклического режима на медвежий
Обзор архитектуры
Индикатор состоит из трёх уровней:
- Уровень 1 — извлечение спектральных признаков. Для каждого бара выделяется скользящее окно размером 3 × MaxPeriod баров и пропускается через ДПФ Гертцеля. Рассчитываются период доминирующего цикла, его амплитуда, спектральная уверенность и скорости их изменения. В сочетании с простым показателем наклона цены и мерой волатильности это даёт 7-мерный вектор признаков.
- Уровень 2 — ансамбль нейронных сетей. Десять небольших многослойных перцептронов (7 входов, 12 скрытых нейронов, 1 выход) независимо обрабатывают вектор признаков. Каждая MLP-сеть имеет случайно инициализированные веса и дообучается онлайн каждые RetrainEvery баров с использованием стохастического градиентного спуска на одном примере. Разнообразие случайной инициализации приводит к тому, что каждая MLP-сеть формирует немного отличающуюся интерпретацию спектральных признаков.
- Уровень 3 — выход ансамбля и логика подтверждения. Выходы всех десяти MLP усредняются для получения единого значения ансамбля. Затем формируется сигнал подтверждения: когда значение ансамбля выше нуля и растет, подтверждается бычье направление. Когда значение ансамбля ниже нуля и снижается, подтверждается медвежье направление.

Рисунок 2. Архитектура GoertzelBrain: от ценовых данных до сигнала подтверждения
Реализация
Структура файлов
Индикатор зависит от двух подключаемых файлов из оригинальной статьи о Гертцеле:
- Goertzel.mqh — класс CGoertzel, реализующий базовый алгоритм ДПФ Гертцеля
- GoertzelCycle.mqh — класс CGoertzelCycle, выполняющий обнаружение пиков циклов и спектральный анализ
Сам индикатор представляет собой один файл: GoertzelBrain.mq5.
Свойства и входные параметры индикатора
Индикатор отображается в отдельном окне с тремя видимыми графическими построениями и одним скрытым расчётным буфером:
#property strict #property indicator_separate_window #property indicator_buffers 4 #property indicator_plots 3 #property indicator_label1 "Ensemble" #property indicator_type1 DRAW_LINE #property indicator_color1 clrDodgerBlue #property indicator_style1 STYLE_SOLID #property indicator_width1 2 #property indicator_label2 "LongConfirm" #property indicator_type2 DRAW_HISTOGRAM #property indicator_color2 clrLime #property indicator_style2 STYLE_SOLID #property indicator_width2 3 #property indicator_label3 "ShortConfirm" #property indicator_type3 DRAW_HISTOGRAM #property indicator_color3 clrRed #property indicator_style3 STYLE_SOLID #property indicator_width3 3
Первое графическое построение — синяя линия ансамбля, то есть необработанный усреднённый выход всех MLP. Второе и третье графические построения — это зелёные и красные бары гистограммы, которые отображаются только при выполнении условий подтверждения. Такая визуальная схема позволяет трейдеру сразу увидеть как базовый спектральный сигнал, так и конкретные бары, на которых активно подтверждение направления.
Входные параметры определяют диапазон спектрального анализа и особенности обучения ансамбля нейронных сетей:
input uint MinPeriod = 10; // Minimum cycle period to analyze input uint MaxPeriod = 80; // Maximum cycle period to analyze input uint RetrainEvery = 200; // Bars between MLP retraining steps input double LearnRate = 0.001; // SGD learning rate input int VolWindow = 20; // Lookback for volatility feature
Параметры MinPeriod и MaxPeriod определяют полосу частот, анализируемую алгоритмом Гертцеля. Эти параметры следует устанавливать с учётом таймфрейма и инструмента. Например, на графиках M5 диапазон от 10 до 80 охватывает циклы продолжительностью от 50 минут до примерно 6,5 часов. Параметр RetrainEvery определяет, как часто MLP обновляют свои веса. Более низкие значения обеспечивают более быструю адаптацию, но создают риск переобучения на шум. LearnRate регулирует величину шага градиентного спуска: слишком большое значение приводит к нестабильности, а слишком малое замедляет адаптацию.
Объявлены четыре буфера:
double EnsembleBuffer[]; // Plot 0: raw ensemble output double LongConfirmBuffer[]; // Plot 1: green histogram when long confirmed double ShortConfirmBuffer[]; // Plot 2: red histogram when short confirmed double ConfirmBuffer[]; // Buffer 3: hidden, +1/-1/0 for EA access via iCustom
Четвёртый буфер (ConfirmBuffer) не отображается на графике, но доступен через функцию iCustom() по индексу буфера 3, что упрощает интеграцию сигнала подтверждения в советник.
Класс TinyMLP
Компонент нейронной сети реализован в виде автономного класса без внешних зависимостей. Каждая MLP-сеть имеет простую двухслойную архитектуру: 7 входов → 12 скрытых нейронов (активация tanh) → 1 линейный выход.
class TinyMLP { public: int input_dim; int hidden_dim; double W1[H_DIM][IN_DIM]; // input-to-hidden weights double b1[H_DIM]; // hidden biases double W2[H_DIM]; // hidden-to-output weights double b2; // output bias
После вызова MathSrand() в OnInit() веса инициализируются небольшими случайными значениями. Метод Init() намеренно вынесен за пределы конструктора — MQL5 создаёт глобальные объекты до запуска OnInit(), поэтому к моменту выполнения конструкторов MathSrand() ещё не вызвана. Если бы веса рандомизировались в конструкторе, все MLP-сети использовали бы одно и то же псевдослучайное зерно.
void Init()
{
for(int j = 0; j < hidden_dim; j++)
{
b1[j] = (MathRand() / 32767.0 - 0.5) * 0.2;
for(int i = 0; i < input_dim; i++)
W1[j][i] = (MathRand() / 32767.0 - 0.5) * 0.2;
}
b2 = (MathRand() / 32767.0 - 0.5) * 0.2;
for(int j = 0; j < hidden_dim; j++)
W2[j] = (MathRand() / 32767.0 - 0.5) * 0.2;
} Масштаб инициализации весов ±0,1 выбран так, чтобы начальные выходы оставались близкими к нулю, но при этом была достаточная вариативность для расхождения MLP-сетей в процессе обучения. Это расхождение важно — ансамбль идентичных сетей не даёт никакой пользы.
Функция активации tanh включает ограничение при переполнении, чтобы предотвратить численные проблемы при прохождении по сети больших значений признаков:
static double Tanh(double x)
{
if(x > 20.0) return 1.0;
if(x < -20.0) return -1.0;
return 2.0 / (1.0 + MathExp(-2.0 * x)) - 1.0;
} Прямой проход вычисляет активации скрытого слоя и выдаёт один скалярный выход:
double Forward(double &x[]) { double hidden[]; ArrayResize(hidden, hidden_dim); for(int j = 0; j < hidden_dim; j++) { double s = b1[j]; for(int i = 0; i < input_dim; i++) s += W1[j][i] * x[i]; hidden[j] = Tanh(s); } double out = b2; for(int j = 0; j < hidden_dim; j++) out += W2[j] * hidden[j]; return out; }
При обучении используется стандартное обратное распространение ошибки с функцией потерь на основе среднеквадратичной ошибки. Каждый шаг обучения обрабатывает один пример — накопление батча не используется. Это сделано намеренно: индикатор обрабатывает бары последовательно, а SGD по одному образцу обеспечивает наиболее быструю адаптацию к меняющимся условиям:
void TrainStep(double &x[], double target, double lr) { // ... forward pass identical to Forward() ... double d_out = out - target; // MSE gradient at output // Output layer weight update for(int j = 0; j < hidden_dim; j++) W2[j] -= lr * d_out * hidden[j]; b2 -= lr * d_out; // Hidden layer backpropagation for(int j = 0; j < hidden_dim; j++) { double d_h = d_out * W2[j] * (1.0 - hidden[j] * hidden[j]); // tanh derivative b1[j] -= lr * d_h; for(int i = 0; i < input_dim; i++) W1[j][i] -= lr * d_h * x[i]; } }
Производная tanh (1 - tanh²(x)) вычисляется непосредственно по кэшированным значениям скрытых активаций, что позволяет избежать избыточных вычислений.
Выделение CGoertzelCycle в куче
Важнейшая деталь реализации касается объекта CGoertzelCycle. В своём конструкторе класс внутри себя выделяет объект CGoertzel через указатель с помощью оператора new. Если объект объявлен глобально, а затем ему присваивается новое значение в OnInit(), деструктор временного объекта удаляет внутренний указатель, в результате чего глобальный объект остаётся с «висящим» указателем. Это приводит к скрытым сбоям при вызове GetSpectrum() или GetDominantCycles().
Решение — выделять объект в куче:
CGoertzelCycle *goertzel = NULL; int OnInit() { if(goertzel != NULL) delete goertzel; goertzel = new CGoertzelCycle(true, false, false, MinPeriod, MaxPeriod); // ... } void OnDeinit(const int reason) { if(goertzel != NULL) { delete goertzel; goertzel = NULL; } }
Такой шаблон обеспечивает правильное управление временем жизни объекта и предотвращает проблему «висящего» указателя.
Извлечение признаков
Функция BuildFeatures() формирует 7-мерный входной вектор для нейронных сетей. Для каждого бара извлекается подокно размером 3 × MaxPeriod баров, которое пропускается через стек Гертцеля:
bool BuildFeatures( const double &price[], int barIdx, double &X[], double in_prev_amp, double in_prev_period ) { int winLen = (int)(MaxPeriod * 3); int winStart = barIdx - winLen + 1; if(winStart < 0) { ArrayInitialize(X, 0.0); return false; } // Extract chronological sub-window for this specific bar double window[]; ArrayResize(window, winLen); ArrayCopy(window, price, 0, winStart, winLen); // Goertzel spectrum double amplitude[]; goertzel.GetSpectrum(window, amplitude); // Dominant cycle detection double cycles[]; uint ncycles = goertzel.GetDominantCycles(true, window, cycles); double dominant_period = (ncycles > 0 ? cycles[0] : 0.0);
Извлечение подокна для каждого бара имеет решающее значение. Без этого алгоритм Гертцеля всегда анализирует одно и то же глобальное окно, независимо от того, какой бар обрабатывается, в результате чего для каждого бара получаются одинаковые признаки.
Эти семь признаков:
| Индекс | Признак | Описание |
|---|---|---|
| 0 | Доминирующий период | Длина цикла с наибольшим спектральным пиком |
| 1 | Доминирующая амплитуда | Сила доминирующего цикла |
| 2 | Прокси фазы | Спектральная уверенность, умноженная на знак наклона цены |
| 3 | Нормализованная уверенность | Доминирующая амплитуда как доля общей энергии полосы частот |
| 4 | Наклон амплитуды | Изменение силы доминирующего цикла от бара к бару |
| 5 | Наклон периода | Изменение длины доминирующего цикла от бара к бару |
| 6 | Волатильность | Стандартное отклонение цены за VolWindow баров |
Признаки 0–3 описывают текущее спектральное состояние. Признаки 4–5 отражают динамику спектрального состояния — усиливается ли или ослабевает доминирующий цикл, а также смещается ли он в сторону более длинного или более короткого периода. Признак 6 обеспечивает ценовой контекст, который невозможно отразить с помощью одних только спектральных признаков.
Особого упоминания заслуживает прокси фазы (признак 2). Класс CGoertzelCycle вычисляет значения фазы внутренне, но сохраняет их в закрытых членах, к которым нет прямого доступа. Вместо того чтобы вносить изменения в библиотеку, мы создаём прокси, умножая нормализованную уверенность на знак направления недавнего движения цены. Это позволяет зафиксировать ключевую информацию: согласуется ли текущий циклический режим с бычьим или медвежьим движением цены.
Цикл OnCalculate
Основной цикл вычислений обрабатывает бары в хронологическом порядке (индекс 0 = самый старый, что соответствует направлению несерийного массива по умолчанию в сигнатуре OnCalculate с одним ценовым массивом):
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { int minBars = (int)(MaxPeriod * 3); if(rates_total < minBars) return 0; int start = (prev_calculated == 0) ? minBars : prev_calculated - 1; if(start < minBars) start = minBars; for(int i = start; i < rates_total; i++) { double X[IN_DIM]; if(!BuildFeatures(price, i, X)) { /* set all buffers to 0.0, continue */ } // Target: next-bar direction double target = 0.0; if(i + 1 < rates_total) { double diff = price[i + 1] - price[i]; target = (diff >= 0.0 ? 1.0 : -1.0); } // Retrain periodically if(bars_since_train >= (int)RetrainEvery) { for(int m = 0; m < NUM_MLPS; m++) mlp[m].TrainStep(X, target, LearnRate); bars_since_train = 0; } // Ensemble inference double sum = 0.0; for(int m = 0; m < NUM_MLPS; m++) sum += mlp[m].Forward(X); double ensemble = sum / (double)NUM_MLPS; EnsembleBuffer[i] = ensemble;
Обратите внимание на намеренное разделение частоты обучения и частоты инференса. Обучение выполняется только каждые RetrainEvery баров, но инференс выполняется на каждом баре. Это не даёт весам «гоняться» за каждым тиком, при этом обеспечивая непрерывный выходной сигнал.
Логика подтверждения
Сигнал подтверждения реализует фильтр с двумя условиями:
double prevEnsemble = (i > minBars) ? EnsembleBuffer[i - 1] : 0.0; double delta = ensemble - prevEnsemble; if(ensemble > 0.0 && delta > 0.0) { LongConfirmBuffer[i] = ensemble; // green histogram ConfirmBuffer[i] = 1.0; // +1 for EA } else if(ensemble < 0.0 && delta < 0.0) { ShortConfirmBuffer[i] = ensemble; // red histogram ConfirmBuffer[i] = -1.0; // -1 for EA }
Для подтверждения длинной позиции необходимо, чтобы значение ансамбля было выше нуля и увеличивалось. Это означает, что спектральный режим благоприятствует росту, а уверенность усиливается. Подтверждение короткой позиции — зеркальный вариант: значение ниже нуля и снижается. Все остальные состояния дают ноль — подтверждения ни в одном из направлений нет.
Такая конструкция гарантирует, что сигнал отражает не только положение (выше или ниже нуля), но и динамику (направление изменения). Снижающееся положительное значение ансамбля означает, что бычий цикл затухает — сейчас не лучшее время для открытия лонгов, даже несмотря на то, что исходный сигнал по-прежнему остается положительным.
Практическое применение
В качестве направленного фильтра
GoertzelBrain предназначен для использования в качестве фильтра подтверждения, а не самостоятельного сигнала входа. Предполагаемый рабочий процесс выглядит следующим образом:
- Ваша основная система генерирует торговый сигнал (например, на основе ценового движения, потока ордеров или другого индикатора)
- Перед исполнением сделки проверьте буфер подтверждения GoertzelBrain
- Открывайте позицию только в том случае, если подтверждение совпадает с направлением вашего сигнала
Чтобы считывать сигнал подтверждения в советнике:
int hGBrain = iCustom(_Symbol, _Period, "GoertzelBrain", MinPeriod, MaxPeriod, RetrainEvery, LearnRate, VolWindow); double confirm[]; CopyBuffer(hGBrain, 3, 0, 1, confirm); // buffer 3 = confirmation if(confirm[0] > 0.5) // long confirmed // ... proceed with buy logic if(confirm[0] < -0.5) // short confirmed // ... proceed with sell logic
Чтение линии ансамбля
Синяя линия ансамбля предоставляет дополнительную информацию, выходящую за рамки двоичного сигнала подтверждения:
- Модуль значения показывает степень уверенности. Значение ±0,03 считается слабым; ±0,15 — сильным.
- Пересечения нуля отмечают смену режима. Когда ансамбль пересекает нулевую отметку, направленное влияние доминирующего цикла меняется на противоположное.
- Ровная линия вблизи нуля указывает на отсутствие доминирующего цикла либо на то, что MLP-сети не могут извлечь надежный сигнал из текущих спектральных признаков. Это ценная информация — она показывает, что на рынке в данный момент отсутствует циклическая структура.
Оптимизация параметров
Пять входных параметров можно оптимизировать в Тестере стратегий:
- MinPeriod / MaxPeriod — определяет, какие частоты циклов отображаются. Более узкие полосы фокусируются на конкретных циклических режимах; более широкие охватывают больше, но размывают сигнал.
- RetrainEvery — регулирует скорость адаптации. Значения в диапазоне 50–200 хорошо подходят для большинства инструментов на таймфреймах M5–H1.
- LearnRate — практический диапазон значений составляет от 0,0001 до 0,005. Более высокие значения чреваты взрывом весов; более низкие значения приводят к слишком медленной адаптации.
- VolWindow — должен примерно соответствовать типичной продолжительности колебаний на вашем таймфрейме.
Чем этот подход отличается от других
GoertzelBrain отличается от существующих индикаторов циклов по нескольким аспектам:
- Адаптивная интерпретация. Традиционные индикаторы циклов выдают необработанные спектральные данные — период, амплитуду, фазу — и полностью оставляют интерпретацию трейдеру или фиксированному набору правил. GoertzelBrain использует нейронные сети, которые обучаются интерпретировать спектральные признаки в контексте, адаптируя свою интерпретацию по мере изменения поведения рынка.
- Самообучение. MLP-сети дообучаются онлайн во время расчёта индикатора. Здесь нет этапа офлайн-обучения, нет внешнего конвейера данных и нет файла модели, которым нужно управлять. Индикатор является автономным и автоматически адаптируется при применении к любому инструменту или таймфрейму.
- Устойчивость ансамбля. Одна нейронная сеть может сойтись к локальному оптимуму, который даёт плохие прогнозы. Используя десять независимо инициализированных сетей и усредняя их выходные данные, ансамбль сглаживает отдельные ошибки и формирует более стабильный сигнал.
- Подтверждение, а не прогнозирование. Данный индикатор не предназначен для прогнозирования конкретных ценовых целей или точек разворота. Вместо этого он отвечает на более простой и надежный вопрос: подтверждает ли текущий спектральный режим наличие направленного смещения? Благодаря этому он становится естественным дополнением к любой существующей торговой системе, а не её заменой.
- Спектральная динамика как признаки. Большинство индикаторов циклов отображают моментальный срез спектра на каждом баре. GoertzelBrain учитывает скорость изменения спектральных признаков (наклон амплитуды и наклон периода), что позволяет определить, усиливается ли, ослабевает ли или находится в переходном состоянии циклический режим. Этот временной контекст недоступен статическому спектральному анализу.
Ограничения и важные соображения
- Перерисовка. Как и все индикаторы, основанные на алгоритме Гертцеля, спектральный анализ пересчитывается при поступлении новых данных. Выход ансамбля на текущем баре может изменяться по мере формирования новых баров. Для целей бэктестинга используйте только значения из полностью сформированных баров.
- Случайная инициализация. Поскольку веса MLP-сети инициализируются случайным образом, индикатор будет выдавать слегка различающиеся результаты при каждом применении к графику. Этот эффект смягчается благодаря использованию ансамбля, однако пользователи должны иметь в виду, что два экземпляра индикатора на одном и том же графике не дадут одинаковых результатов.
- Вычислительные затраты. ДПФ по методу Гертцеля выполняется для каждого бара в диапазоне расчёта, и, поскольку десять MLP-сетей выполняют прямые проходы, этот индикатор требует больших вычислительных ресурсов, чем простые осцилляторы. На современном оборудовании это не имеет существенного значения для реальной торговли, однако при проведении масштабных бэктестов на данных M1 скорость работы может заметно снизиться.
- Гарантированного преимущества нет. Индикатор выявляет спектральную структуру и учится её интерпретировать, однако наличие доминирующего цикла не гарантирует, что он будет продолжаться. Все методы обнаружения циклов сталкиваются с этой фундаментальной неопределённостью. GoertzelBrain следует рассматривать как один из многих факторов, влияющих на принятие торгового решения, а не как «хрустальный шар».
Заключение
GoertzelBrain сочетает точность алгоритма Гертцеля с адаптивными возможностями ансамблей нейронных сетей, формируя для MetaTrader 5 направленный фильтр, учитывающий циклы. Благодаря извлечению многомерных спектральных признаков и обучению их интерпретации в режиме онлайн система устраняет разрыв между исходным частотным анализом и практически применимыми торговыми сигналами.
Данный индикатор разработан как инструмент подтверждения — фильтр допуска для сделок, сгенерированных другими системами. Благодаря архитектуре самообучения система не требует никакой внешней настройки, кроме пяти входных параметров, и автоматически адаптируется к любому инструменту и любому таймфрейму.
Весь исходный код, упомянутый в данной статье, доступен в приложенных файлах. Данный индикатор основан на классах CGoertzel и CGoertzelCycle из статьи «Анализ циклов с использованием алгоритма Гертцеля», которые для компиляции должны находиться в каталоге Include.
Прикреплённые файлы
| Файл | Описание |
|---|---|
| GoertzelBrain.mq5 | Полный исходный код индикатора |
| Goertzel.mqh | Класс основного алгоритма ДПФ по Гертцелю |
| GoertzelCycle.mqh | Класс анализа циклов и обнаружения пиков |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/21376
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Особенности написания Пользовательских Индикаторов
За пределами GARCH (Часть II): Оценка фрактальной размерности рынков
Нейронная сеть на практике: Стохастический градиентный спуск
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования