Разработка торговой стратегии: Стратегия следования за трендом на основе Индекса цветочной волатильности
Введение
Финансовые рынки движутся в соответствии с определенными ритмами — паттернами расширения и сжатия, ускорения и замедления, формирования трендов и циклической ротации. Трейдеры уже давно пытаются математически смоделировать этот ритм, создавая индикаторы, помогающие определить возможности для входа, определить направление трендов или сигнализировать, когда цены слишком сильно отклоняются от равновесия. Эти основанные на цене математические модели, широко известные как технические индикаторы, интерпретируются по-разному в зависимости от целей трейдера.
На протяжении многих лет было разработано несколько индикаторов для отображения циклов и трендов или чрезмерного отклонения, включая Индекс товарного канала (CCI), Индекс силы, Индекс силы быков и медведей, Индекс относительной бодрости (RVI), Циклические линии и Временные зоны Фибоначчи. Каждый из них предлагает уникальный взгляд на структуру рынка.
В этой статье мы представляем стратегию следования за трендом, основанную на классической математической функции, известной как роза Гранди. Первоначально изученная итальянским математиком Гвидо Гранди (1671-1742), кривая розы (Rose Curve), также известная как роза Гранди, образует геометрические узоры, похожие на цветы, отсюда и ее название. Переопределив параметры этой функции, мы строим новый осциллятор, названный Индекс цветочной волатильности (FVI), а затем создаем на её основе торговую модель, основанную на тренде.
Математические основы: роза Гранди
Роза Гранди определяется полярным уравнением:

Разложение этой радиальной функции дает декартовы компоненты:

Свойства этой функции делают её исключительно подходящей для создания технического индикатора. Её поведение определяется рациональным отношением n/d, которое задает форму, симметрию и периодичность результирующего графика. Эти компоненты являются основой, на которой создается Индекс цветочной волатильности. Прежде чем применять эту функцию к рыночным данным, полезно изучить ее внутренние свойства.
На рисунках с 1 по 3 ниже показаны примеры радиальных графиков розы Гранди, подчеркивающих ее универсальность:

Рисунок 1: N=20 , d=1

Рисунок 2: N=17, d=1

Рисунок 3: N=20, d=7
К основным наблюдениям, полученным на этих радиальных графиках, относятся:
-
Разнообразие паттернов: Соотношение n/d порождает широкий спектр паттернов. В рациональном виде это приводит к созданию симметричных лепесткообразных структур; соотношение 1/2 дает простой круг, а соотношения более высокого порядка — более сложные многолепестковые узоры.
-
Количество лепестков: Ключевой параметр j = n/(2d) определяет количество лепестков или долек.
-
Если j - целое и нечетное число, то кривая имеет число j лепестков. Если j - целое и четное число, оно даёт число 2j лепестков. Например: n=6, d=3, то j=1 следовательно 1 лепесток. n = 16 , d = 2, то j=4, следовательно 8 лепестков.
-
Если j — рациональное число, но не целое, то возникают более сложные и неполные паттерны в виде лепестков.
-
Особый случай: n = d приводит к образованию кардиоидных форм.
- Симметрия и колебания: Кривые демонстрируют устойчивую вращательную и зеркальную симметрию. Важно отметить, что амплитуда всегда колеблется между -1 и 1, что делает его идеальным кандидатом для ограниченного осциллятора, из которого трейдер может выбирать компоненты (X или Y), наилучшим образом соответствующие его стратегическим потребностям.
Анализ структуры кода для создания розы Гранди
Чтобы приступить к созданию розы Гранди, первым существенным шагом является включение библиотеки Canvas, которая предоставляет все необходимые свойства и функции для отображения графических объектов на графике. Эта библиотека служит основой для рисования, построения графиков и управления визуальными элементами в индикаторе или скрипте.
#include <Canvas\Canvas.mqh> // Create canvas for drawing int width = 800; // Canvas width int height = 600; // Canvas height string canvas_name = "FlowerCurve";
После импорта библиотеки Canvas мы определяем размеры области рисования. В этом примере ширина и высота объекта Canvas установлены на 800 и 600 пикселей соответственно.
Объекту Canvas также присваивается идентифицируемое имя "FlowerCurve", которое позволяет платформе ссылаться на поверхность рисования и управлять ею.
В функции CurvePlotting процесс построения розы Гранди начинается с создания объекта Canvas. Этот объект служит поверхностью для рисования и настраивается с помощью предопределенного имени Canvas, его положения на графике, размера рамки и выбранного цветового формата. Если инициализация объекта Canvas не удаётся, выводится сообщение об ошибке и функция корректно завершает работу.// Create canvas object CCanvas canvas; if(!canvas.CreateBitmapLabel(canvas_name, 200, 50, width, height, COLOR_FORMAT_XRGB_NOALPHA)) { Print("Error creating canvas: ", GetLastError()); return; } // Set up drawing parameters int points = 1000; // Number of points double t_start = -2 * M_PI; // Start angle double t_end = 2 * M_PI; // End angle double step = (t_end - t_start) / (points - 1); // Calculate curve points double x[], y[]; ArrayResize(x, points); ArrayResize(y, points); for(int i = 0; i < points; i++) { double t = t_start + i * step; double rad = MathSin((n*t)/(2*d)); y[i] = MathSin(t) * rad; x[i] = MathCos(t) * rad; }
После успешного создания объекта Canvas функция переходит к установке параметров, необходимых для построения графика. Сюда относится определение общего количества точек для вычислений, а также указание начального и конечного углов кривой. Шаг изменения угла рассчитывается таким образом, чтобы приращения угла равномерно распределялись по заданному интервалу.
После задания этих параметров функция инициализирует массивы для хранения x- и y-координат кривой. Затем она перебирает каждую точку, вычисляя угол t и оценивая математические выражения, определяющие розу Гранди.
После вычисления исходных точек данных x и y для розы Гранди, следующая задача в функции CurvePlotting — правильно масштабировать эти координаты, чтобы вся кривая аккуратно помещалась в области Canvas. Этот процесс включает в себя несколько этапов, начиная с определения минимального и максимального значений для x и y. Эти границы необходимы для определения того, как следует пропорционально изменять размер кривой.// Find coordinate bounds for scaling double x_min = x[ArrayMinimum(x)]; double x_max = x[ArrayMaximum(x)]; double y_min = y[ArrayMinimum(y)]; double y_max = y[ArrayMaximum(y)]; // Scale points to canvas coordinates int x_px[], y_px[]; ArrayResize(x_px, points); ArrayResize(y_px, points); double x_scale = (width - 40) / (x_max - x_min); double y_scale = (height - 40) / (y_max - y_min); double scale = MathMin(x_scale, y_scale); // Maintain aspect ratio for(int i = 0; i < points; i++) { x_px[i] = (int)((x[i] - x_min) * scale) + 30; y_px[i] = height - (int)((y[i] - y_min) * scale) - 20; // Flip Y-axis for canvas coordinates }
После определения экстремумов функция создает целочисленные массивы (x_px и y_px), которые будут содержать преобразованные пиксельные координаты. Затем вычисляются коэффициенты масштабирования для обеих осей на основе доступного пространства для рисования (с оставлением полей, чтобы не касаться краев объекта Canvas). Для сохранения формы кривой без искажений в качестве коэффициента однородного масштабирования выбирается меньшее из двух значений масштабирования.
Наконец, каждая точка преобразуется из математических координат в координаты объекта Canvas. Значения по оси X сдвигаются вправо для создания поля, а значения по оси Y инвертируются — поскольку координаты объекта Canvas увеличиваются в направлении вниз — что обеспечивает корректную ориентацию отображаемой кривой.
На заключительном этапе функции CurvePlotting основное внимание уделяется отображению розы Гранди на объекте Canvas. Начинается это с установки цвета фона, обеспечения чистоты и визуальной привлекательности рабочей поверхности. В данной реализации для создания мягкого контраста с кривой используется фон GhostWhite.
Далее определяется цвет линии. Выбирается полностью непрозрачный оттенок BlueViolet, а его значение ARGB напрямую передается методу отрисовки линий на объекте Canvas. Сама кривая отображается в виде ломаной линии путем проведения последовательных отрезков между каждой парой масштабированных точек данных.
// Draw the curve canvas.Erase(ColorToARGB(clrGhostWhite, 255)); // GhostWhite background // Set line color - we'll pass this directly to Line method uint line_color = ColorToARGB(clrBlueViolet, 255); // Draw the polyline for(int i = 1; i < points; i++) { canvas.Line(x_px[i-1], y_px[i-1], x_px[i], y_px[i], line_color); } // Add title canvas.FontSet("Cambria", 20, FW_BOLD); canvas.TextOut(300, 20, "Flower Curve: n=", ColorToARGB(clrBlack, 255)); canvas.TextOut(445, 20, IntegerToString(n), ColorToARGB(clrBlack, 255)); canvas.TextOut(470, 20, "& d=", ColorToARGB(clrBlack, 255)); canvas.TextOut(520, 20, IntegerToString(d), ColorToARGB(clrBlack, 255)); // Update display canvas.Update();
Для завершения визуального оформления функция задает стиль, размер и толщину шрифта. Для наглядности выбран жирный шрифт Cambria размером 20. Затем заголовок кривой отображается в верхней части объекта Canvas с помощью canvas.TextOut, динамически отображая текущие значения n и d, использованные при формировании розы Гранди.
После отрисовки всех элементов вызывается метод canvas.Update() для обновления отображения. В результате все отрисованные компоненты становятся видимыми на графике.
Автоматизация построения кривой в функции Start
В функции Start процесс построения графика автоматизируется путем помещения функции CurvePlotting внутрь цикла. Эта структура позволяет динамически отображать розу Гранди для различных комбинаций входных параметров n и d. При регулировке этих параметров скрипт может отображать различные формы кривых, каждая из которых отражает уникальные математические характеристики.
int p=1; while (p<=nLimit) { CurvePlotting(p); p++; Sleep(1000);
И n и d задаются как входные параметры пользователя. Это дает трейдеру или аналитику полный контроль над настройкой геометрии розы Гранди без изменения основного кода. Когда программа запускается, она выполняет перебор по заданным значениям, вызывая CurvePlotting для каждой пары. Это позволяет легко визуализировать множество паттернов кривых непосредственно на графике.
От геометрии к рыночному индикатору: Построение Индекса цветочной волатильности
Перед разработкой осциллятора Индекс цветочной волатильности (FVI), полезно изучить декартовы компоненты розы Гранди. Преобразование полярной функции в компоненты X и Y позволяет выявить её колебательный характер в форме, более знакомой трейдерам.
На рисунках 4–7 показаны компоненты X и Y функции розы Гранди во времени для различных значений n и d: Красный график представляет собой X-компоненту, а синий — Y-компоненту розы Гранди, причем каждый график построен в зависимости от угла.

Рисунок 4: Кривая розы: n=5, d=1

Рисунок 5: Кривая розы: n=1, d=1

Рисунок 6: Кривая розы: n=5, d=7

Рисунок 7: Кривая розы: n=20, d=8

Рисунок 8: Кривая розы: n=7, d=4
Анализ этих декартовых графиков выявляет критические характеристики для финансового применения:
- Ограниченное колебание: Оба компонента постоянно колеблются между -1 и 1, образуя естественные границы перекупленности и перепроданности.
- Регулировка частоты: Параметры n и d обеспечивают точное управление частотой колебаний. Более высокие значения n увеличивают частоту, а более высокие значения d уменьшают ее.
- Предсказуемая периодичность: Период колебаний определяется формулой T = 4πd/n. Это позволяет проводить стратегическую настройку: небольшое соотношение n/d создает более длинные и плавные циклы, идеально подходящие для выявления основных трендов, в то время как большое соотношение формирует более короткие и реактивные циклы.
Особые случаи еще раз демонстрируют гибкость:
- Когда n = d , функция упрощается до r(q) = sin(q/2), простая синусоида.
- Когда n = 2d , она становится r(q) = sin(q), стандартная синусоида.
Подготовка к построению декартовых координат
Перед построением декартовой формы кривой необходимо загрузить необходимые графические инструменты. Это достигается за счет включения библиотеки Graphics, которая предоставляет все необходимые функции для построения графиков, рендеринга и управления визуальными элементами в среде графиков. Библиотека служит основой для построения x-y компонентов розы Гранди.
После подключения библиотеки определяется имя графического объекта. В этом случае графическая поверхность идентифицируется как "PetalPlot", что позволяет программе ссылаться на графическую область и управлять ею во время рендеринга.
#include <Graphics/Graphic.mqh> string g_name = "PetalPlot";
Для подготовки графика к построению декартовых компонентов розы Гранди определена специальная функция — SetupChartQX. Эта функция включает в себя все основные этапы настройки, необходимые для создания чистой, удобочитаемой и визуально структурированной среды построения графиков. Благодаря централизации этих настроек график последовательно форматируется при каждом отображении новой кривой.
Функция начинается с установки белого фона, создавая нейтральное «полотно» для графических элементов. Затем она настраивает обе оси:
- Ось X проходит от -2π до 2π и обозначена как q.
- Ось Y находится в диапазоне от -1,2 до 1,2 и обозначена как x.
void SetupChartQX(CGraphic &graphic) { // Set background color graphic.BackgroundColor(clrWhite); // Configure X axis graphic.XAxis().Min(-2*M_PI); graphic.XAxis().Max(2*M_PI); graphic.XAxis().Name("q"); // Configure Y axis graphic.YAxis().Min(-1.2); graphic.YAxis().Max(1.2); graphic.YAxis().Name("x"); // Add grid graphic.XAxis().Color(clrGray); graphic.YAxis().Color(clrGray); // Increase font sizes graphic.XAxis().ValuesSize(14); graphic.YAxis().ValuesSize(14); graphic.XAxis().NameSize(16); graphic.YAxis().NameSize(16); // Add title graphic.CurvePlotAll(); graphic.Update(); }
Эти диапазоны гарантируют, что функция будет отображаться полностью, без обрезания по краям.
Линии сетки добавляются путем установки серого цвета для осей. Это улучшает читаемость и помогает пользователям визуально интерпретировать положение кривой относительно осей. Для дальнейшего повышения наглядности увеличен размер шрифта для значений осей и их названий.
Наконец, функция вызывает CurvePlotAll(), за которой следует Update(), чтобы подготовить график для отображения данных кривой.
Функция PlotQX() предназначена для обработки всех операций по графическому отображению для X-компонента розы Гранди. Эта функция служит центральным механизмом, отвечающим за формирование точек данных, применение необходимых преобразований и отображение окончательного графического изображения на графике.
void PlotQX(CGraphic &graphic) { int points = 1000; double q[], x[], r[]; ArrayResize(q, points); ArrayResize(x, points); ArrayResize(r, points); // Generate data points for(int i = 0; i < points; i++) { q[i] = -2*M_PI + (4*M_PI)*i/(points-1); r[i] = MathSin(n * q[i] / (2*d)); x[i] = r[i] * MathCos(q[i]); } // Get the curve object and set line properties CCurve* curve = graphic.CurveAdd(q, x, CURVE_LINES, "q vs x"); if(curve != NULL) { curve.LinesStyle(STYLE_SOLID); curve.LinesWidth(3); curve.Color(ColorToARGB(clrRed, 255)); } graphic.CurvePlotAll(); }
Внутри функции создаются массивы для хранения вычисленных значений q и x. Используя математическую формулировку розы Гранди, функция выполняет перебор по ряду равномерно распределенных значений q , вычисляет соответствующий радиус и вычисляет X-компонент.
Построение графика Y-компонента: Функции SetupChartQY и PlotQY
Подобно тому, как X-компонент розы Гранди обрабатывается с помощью специальных функций настройки и построения графика, Y-компонент управляется с помощью двух параллельных функций: SetupChartQY и PlotQY. Эти функции отражают структуру и назначение своих аналогов в X-компоненте, обеспечивая согласованность и ясность во всех визуальных представлениях.
Функция SetupChartQY подготавливает среду построения графика специально для отображения Y-компонента. Она настраивает цвет фона, диапазоны осей, метки осей, внешний вид сетки и размеры шрифта. Таким образом, создается чистое и хорошо организованное визуальное пространство, адаптированное для данных по оси Y.
Функция PlotQY затем обрабатывает вычисление и рендеринг Y-компонента.
Рассчитанные значения q и y наносятся на подготовленный график с заданными свойствами линий таким образом, чтобы придать кривой четкий и читаемый вид. После построения графика функция обновляет графический объект, чтобы только что нарисованная кривая стала видимой на графике.
Для визуализации декартовых компонент розы Гранди, для X-компонента и Y-компонента создаются отдельные графические объекты, каждый из которых имеет собственное окно построения. Это гарантирует, что оба аспекта кривой могут отображаться независимо и четко.
// Create first graphic object for q vs x CGraphic graphic_x; // Create graphic window for q vs x if(!graphic_x.Create(0, g_name + "_q_vs_x", 0, 30, 30, 800, 600)) { Print("Error creating graphic for q vs x!"); return; } // Create second graphic object for q vs y CGraphic graphic_y; // Create graphic window for q vs y if(!graphic_y.Create(0, g_name + "_q_vs_y", 0, 750, 30, 1500, 600)) { Print("Error creating graphic for q vs y!"); return; }
Для X-компонента инстанцируется графический объект с именем graphic_x. Соответствующее графическое окно располагается на графике с определенными координатами, шириной и высотой, предоставляя выделенную область для построения графиков q и x. Если создание окна не удаётся, выводится сообщение об ошибке и функция корректно завершает работу.
Аналогично для Y-компонента создается второй графический объект с именем graphic_y. Его окно расположено отдельно на графике, а размеры заданы таким образом, чтобы соответствовать графику зависимости q от y. Такое разделение позволяет отображать оба компонента рядом или друг над другом для лучшего визуального сравнения.
Индикатор: Разработка Индекса цветочной волатильности
Установив математическую основу розы Гранди, теперь мы можем перейти от теории к практическому применению. Следующим шагом является адаптация розы Гранди к рыночному осциллятору, чувствительному к волатильности, - тому, что мы называем Индексом цветочной волатильности (FVI).
Для достижения этой цели мы заменим традиционную угловую переменную θ в розе Гранди переменной q, определяемой рыночными факторами. Это преобразование напрямую связывает геометрические свойства розы Гранди с поведением цены.
Переопределим угол как q, где:

Давайте разберем компоненты этой критической замены:
- Цена закрытия - MA (Скользящая средняя): Этот показатель отражает отклонение цены от ее недавнего среднего значения. Можно использовать простую или экспоненциальную скользящую среднюю, при этом период определяет чувствительность стратегии. Этот показатель измеряет импульс или направление тренда актива. Большие отклонения приводят к большим значениям q.
- ATR (Средний истинный диапазон): деление на ATR стандартизирует отклонение, создавая безразмерную величину. Этот важный шаг учитывает волатильность рынка, обеспечивая адаптацию индикатора к изменчивым рыночным условиям. Значительное изменение цены в условиях низкой волатильности окажет более значительное влияние, чем такое же изменение в условиях высокой волатильности.
- Скалярный коэффициент k: это настроечный коэффициент, позволяющий трейдеру контролировать чувствительность q- осциллятора. Более высокое значение k усиливает отклонения, делая FVI более реактивным.
Подставляя q в кривую розы Гранди, индикатор становится чувствительным как к смещению тренда, так и к условиям волатильности, что позволяет получать более плавные и интерпретируемые колебательные сигналы.
Полная формула индикатора
В результате подстановки рыночного показателя q в определения розы Гранди, полный Индекс цветочной волатильности принимает следующий вид:
X-Компонент FVI:

Y-Компонент FVI:

Хотя оба осциллятора остаются в пределах диапазона [−1,+1], формируя нормализованные и стабильные сигналы при любых рыночных условиях, при рассмотрении различных комбинаций параметров n и d выявляется важный нюанс. Как показано на рисунках 4–8, определенные конфигурации приводят к асимметрии либо x-компонента, либо y-компонента Индекса цветочной волатильности. В таких случаях осциллятор может проводить больше времени в положительной области, чем в отрицательной (или наоборот), создавая структурное смещение в форме волны.
Эта асимметрия обусловлена геометрическими свойствами розы Гранди и становится более выраженной, когда n/d приводит к образованию неполных лепестков или неравномерной вращательной симметрии. Когда такие комбинации параметров сочетаются с рыночной переменной q, результирующий осциллятор может стать направленно смещенным, склоняясь к одной из сторон нулевой линии на длительные периоды времени.
Вместо того чтобы быть недостатком, эта характеристика открывает мощные возможности: естественно смещенный осциллятор может помочь выявить доминирующие долгосрочные тренды или устойчивые однонаправленные рыночные фазы. По этой причине индикатор позволяет пользователю выбирать либо X-компонент, либо Y-компонент, что дает трейдерам возможность целенаправленно использовать эту асимметрию в зависимости от целей своей стратегии.
Демонстрация индикатора FVI
Теперь давайте рассмотрим, как ведет себя Индекс цветочной волатильности на практике.
FVI очень чувствителен к входным параметрам и изменение любого из этих значений — будь то период MA, период ATR, константа чувствительности k или выбор между X- и Y-компонентами — напрямую влияет на форму и чувствительность осциллятора. Такая гибкость позволяет трейдерам настраивать индикатор таким образом, чтобы он «синхронизировался» с ритмом конкретного рынка или инструмента, которым они торгуют.
Истинное стратегическое преимущество FVI заключается в возможности регулирования его сложности. Тщательно регулируя параметры розы Гранди n, d и параметр масштабирования k, трейдер может создать осциллятор, который будет вести себя совершенно по-разному:
-
Определение тренда: Устойчивые значения FVI выше нуля можно интерпретировать как бычий импульс, а значения ниже нуля — как медвежий импульс.
-
Формирование сигналов: Пересечение линии FVI выше или ниже ее нулевой центральной линии, либо колебания между ее крайними значениями могут формировать сигналы на покупку и продажу для системы следования за трендом.
-
Адаптивный к волатильности: Включение ATR делает FVI динамичным индикатором. В периоды высокой волатильности он становится менее чувствительным, предотвращая резкие колебания. В периоды низкой волатильности он становится более чувствительным, что позволяет раньше входить в новые тренды.

Рисунок 9: Индикатор FVI
При всех этих изменениях FVI остается полностью нормализованным по волатильности благодаря своей зависимости от ATR. Это гарантирует, что осциллятор автоматически адаптируется к меняющимся рыночным режимам — расширяясь на спокойных рынках и сокращаясь на волатильных, — сохраняя при этом последовательную интерпретируемость во всех классах активов и таймфреймов.
Советник: Стратегия следования тренду FVI
Этот советник использует FVI для формирования сигналов и Awesome Oscillator (AO) в качестве фильтра тренда. Сделки открываются только тогда, когда импульс, обусловленный волатильностью (FVI), совпадает с преобладающим трендом (AO).
Процесс принятия решений советником регулируется следующими конкретными правилами:
1. Условие сделки на продажу:2. Условие сделки на покупку:Сделка на продажу открывается, когда:
- AO < 0 (нисходящий тренд) и
- Индекс FVI пересекает выше +0,7 (сильное восходящее истощение в рамках нисходящего тренда).
3. Условие выхода:Сделка на покупку открывается, когда:
- AO > 0 (восходящий тренд) и
- FVI пересекает уровень −0,7 сверху вниз (сильное нисходящее истощение в рамках восходящего тренда)
-
Сделки закрываются с использованием уровней Тейк-профит и Стоп-лосс.
- Одна позиция на сторону: Советник откроет только одну позицию для заданного направления сделки. Например, если позиция на покупку уже открыта, то до закрытия первой позиции на покупку новая позиция не откроется. Однако если выполняются условия, советник может открыть позицию на продажу, что позволяет стратегии использовать развороты тренда.
- Период ожидания перед входом: Чтобы предотвратить чрезмерную торговлю и «эхо-сигналы», советник реализует период ожидания. После исполнения сигнала на вход советник будет ждать заданное количество баров (например, 10 баров), прежде чем проверять наличие нового сигнала на вход и реагировать на него в любом направлении. Это позволяет регулировать частоту совершения сделок и обеспечивает своевременное формирование торговых сигналов.
Изучение структуры кода советника FVI
В основе советника FVI лежит функция CalculateFVI(), отвечающая за вычисление значений FVI, используемых в торговой логике. Эта функция обрабатывает ключевые входные параметры, а именно MA, ATR и параметры кривой n, d и k — для формирования выходных данных индикатора.
void CalculateFVI() { prevFVI = curFVI; // Get indicator values double ma[1], atr[1], ao[1]; double close = iClose(_Symbol, _Period, 1); // Copy indicator values if(CopyBuffer(maHandle, 0, 1, 1, ma) < 1 || CopyBuffer(atrHandle, 0, 1, 1, atr) < 1) { Print("Error copying indicator buffers"); return; } // Calculate q double q = k * (close - ma[0]) / (atr[0] > 0 ? atr[0] : 1); // Calculate r(q) double r = MathSin(n * q / (2 * d)); // Calculate FVI based on selected component if(Use_X_Component) curFVI = r * MathCos(q); // X component else curFVI = r * MathSin(q); // Y component }
Расчет начинается с сохранения предыдущего значения FVI, что позволяет советнику сравнивать прошлые и текущие значения при оценке условий сделки. Затем он извлекает самую последнюю цену закрытия и копирует значения MA и ATR из соответствующих буферов индикаторов. Надлежащая обработка ошибок гарантирует, что функция корректно завершает работу в случае невозможности доступа к данным индикатора.
Функция CheckForEntry() служит механизмом принятия решений в советнике FVI. Её основная роль заключается в обеспечении выполнения всех условий входа до совершения любой сделки, тем самым поддерживая дисциплину и предотвращая преждевременное или недействительное исполнение ордеров.
Функция начинается с проверки того, что с момента последней сделки прошло достаточное количество баров. Этот механизм интервалов помогает избежать быстрых последовательных входов, особенно во время нестабильных рыночных условий. Как только требование к минимальному бару выполнено, функция оценивает предопределенные правила входа на основе FVI - удовлетворяют ли текущие и предыдущие значения FVI критериям бычьего или медвежьего сетапа.
void CheckForEntry() { // Check minimum bars between entries if(barsSinceLastTrade < MinBarsBtwEntries) return; // Get Awesome Oscillator value double ao[1]; if(CopyBuffer(aoHandle, 0, 1, 1, ao) < 1) { Print("Error copying AO buffer"); return; } // Check for buy conditions if(ao[0] > 0 && prevFVI > -0.7 && curFVI < -0.7) { if(CountPositions(POSITION_TYPE_BUY) == 0) { OpenBuyOrder(); barsSinceLastTrade = 0; } } // Check for sell conditions if(ao[0] < 0 && prevFVI < 0.7 && curFVI > 0.7) { if(CountPositions(POSITION_TYPE_SELL) == 0) { OpenSellOrder(); barsSinceLastTrade = 0; } } }
При обнаружении действительного сигнала на покупку советник запускает функцию OpenBuyOrder() для отправки ордера на покупку в терминал брокера. Аналогично, если сигнал на продажу подтверждается, выполняется функция OpenSellOrder() для открытия позиции на продажу.
После успешного открытия сделки счетчик barsSinceLastTrade сбрасывается на ноль, гарантируя, что советник снова соблюдает требуемый интервал перед инициированием следующей сделки.
Благодаря этой структуре функция CheckForEntry() обеспечивает надежную и эффективную основу для управления исполнением сделок, гарантируя, что позиции открываются только при четко определенных и контролируемых условиях.
Демонстрация советника FVI
Советник включает в себя полный набор входных параметров, охватывающих как торговые настройки, так и параметры FVI, что позволяет трейдерам точно настраивать его работу. Эти входные данные полностью доступны для оптимизации, позволяя пользователям настраивать такие переменные, как параметры риска, параметры чувствительности и расчетные значения FVI. Как показано на рисунке 10, интерфейс оптимизации предоставляет структурированный способ экспериментировать с различными комбинациями параметров, помогая трейдерам определить наиболее эффективную конфигурацию для различных рыночных условий.

Рисунок 10: Входные значения советника
На рисунке 11 показано, как советник открывает сделки на основе определенной торговой логики. Как только рыночные условия совпадают с указанными правилами входа, советник автоматически запускает позиции на покупку или продажу, управляя каждым открытием в соответствии с настроенными параметрами риска и сигналами на основе FVI. Это наглядное представление помогает продемонстрировать процесс от формирования сигналов до исполнения ордеров, демонстрируя способность советника систематически реагировать на движения рынка.

Рисунок 11: Демонстрация советника FVI
Заключение
В данной статье представлен Индекс цветочной волатильности (FVI) — новый подход, превращающий математическую элегантность кривых розы (Rose Curves), также известных как розы Гранди, в функциональный торговый инструмент. Сопоставив волатильность рынка и смещение цен с помощью X- и Y-компонентов розы Гранди, мы продемонстрировали, как FVI можно использовать для определения смещения направления, силы тренда и потенциальных точек разворота.
В статье также описана полная структура советника FVI — от построения кривой и графического рендеринга до формирования сигналов и автоматического открытия сделок. Благодаря этой работе мы показали, как математические модели могут быть адаптированы к практическим торговым механизмам, способным поддерживать как анализ, так и принятие решений в реальных рыночных условиях.
В целом, исследование выделяет потенциал геометрических и тригонометрических функций как альтернативных систем для понимания поведения рынка.
В следующей работе мы протестируем стратегию как отдельно, так и с другими индикаторами, чтобы найти подходящие пары для различных финансовых инструментов. До встречи и удачной торговли!
| Файлы | Описание |
|---|---|
| PetalCurve.mq5 | Этот скриптовый файл графически отображает розы Гранди. График можно удалить при обновлении или замене шаблона. |
| PetalWaves.mq5 | В скриптовом файле отображаются компоненты X и Y кривых в виде волнообразного паттерна. Обновите шаблон, удалив построенные графики. |
| FlowerVolatilityIndex.mq5 | В этом файле индикаторов Индекс цветочной волатильности отображается в отдельном окне. |
| FVI_EA.mq5 | Этот файл содержит советник, который автоматически совершает сделки. |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/20309
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Автоматизация греков Блэка-Шоулза: Расширенный скальпинг и микроструктурная торговля
Синхронизация графиков для удобного технического анализа
Разработка инструментария для анализа Price Action (Часть 37): Индикатор смещения настроений
Основы байесовского вывода в дискретном и непрерывном случаях: от теории к практической реализации моделей
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования