English Deutsch 日本語
preview
Разработка торговой стратегии: Стратегия следования за трендом на основе Индекса цветочной волатильности

Разработка торговой стратегии: Стратегия следования за трендом на основе Индекса цветочной волатильности

MetaTrader 5Трейдинг |
224 0
Daniel Opoku
Daniel Opoku

Введение

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

На протяжении многих лет было разработано несколько индикаторов для отображения циклов и трендов или чрезмерного отклонения, включая Индекс товарного канала (CCI), Индекс силы, Индекс силы быков и медведей, Индекс относительной бодрости (RVI), Циклические линии и Временные зоны Фибоначчи. Каждый из них предлагает уникальный взгляд на структуру рынка.

В этой статье мы представляем стратегию следования за трендом, основанную на классической математической функции, известной как роза Гранди. Первоначально изученная итальянским математиком Гвидо Гранди (1671-1742), кривая розы (Rose Curve), также известная как роза Гранди, образует геометрические узоры, похожие на цветы, отсюда и ее название. Переопределив параметры этой функции, мы строим новый осциллятор, названный Индекс цветочной волатильности (FVI), а затем создаем на её основе торговую модель, основанную на тренде.


Математические основы: роза Гранди

Роза Гранди определяется полярным уравнением:

RoseEqn

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

x_y comp

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

На рисунках с 1 по 3 ниже показаны примеры радиальных графиков розы Гранди, подчеркивающих ее универсальность:

rose_n20_d1

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

rose_n17_d3

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

rose_n20_d7

Рисунок 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-компоненту розы Гранди, причем каждый график построен в зависимости от угла.

n5d1_x n5d1_y

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

n1d1_x n1d1_y

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

n5d7_x n5d7_y

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

n20d8_x n20d8_y

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

n7d4_x n7d4_y

Рисунок 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, где: 

q_input

Давайте разберем компоненты этой критической замены:

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

Подставляя q в кривую розы Гранди, индикатор становится чувствительным как к смещению тренда, так и к условиям волатильности, что позволяет получать более плавные и интерпретируемые колебательные сигналы.

Полная формула индикатора

В результате подстановки рыночного показателя q в определения розы Гранди, полный Индекс цветочной волатильности принимает следующий вид:

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

FVIx

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

FVIy

Хотя оба осциллятора остаются в пределах диапазона [−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 динамичным индикатором. В периоды высокой волатильности он становится менее чувствительным, предотвращая резкие колебания. В периоды низкой волатильности он становится более чувствительным, что позволяет раньше входить в новые тренды.

FVI_Indicator

Рисунок 9: Индикатор FVI 

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



Советник: Стратегия следования тренду FVI

Этот советник использует FVI для формирования сигналов и Awesome Oscillator (AO) в качестве фильтра тренда. Сделки открываются только тогда, когда импульс, обусловленный волатильностью (FVI), совпадает с преобладающим трендом (AO).

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

1. Условие сделки на продажу: 

Сделка на продажу открывается, когда:

  • AO < 0 (нисходящий тренд) и
  • Индекс FVI пересекает выше +0,7 (сильное восходящее истощение в рамках нисходящего тренда).

2. Условие сделки на покупку:

Сделка на покупку открывается, когда:

  • AO > 0 (восходящий тренд) и
  • FVI пересекает уровень −0,7 сверху вниз (сильное нисходящее истощение в рамках восходящего тренда)
3. Условие выхода:
  • Сделки закрываются с использованием уровней Тейк-профит и Стоп-лосс.

4. Правило множественных входов:
  • Одна позиция на сторону: Советник откроет только одну позицию для заданного направления сделки. Например, если позиция на покупку уже открыта, то до закрытия первой позиции на покупку новая позиция не откроется. Однако если выполняются условия, советник может открыть позицию на продажу, что позволяет стратегии использовать развороты тренда.
  • Период ожидания перед входом: Чтобы предотвратить чрезмерную торговлю и «эхо-сигналы», советник реализует период ожидания. После исполнения сигнала на вход советник будет ждать заданное количество баров (например, 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, интерфейс оптимизации предоставляет структурированный способ экспериментировать с различными комбинациями параметров, помогая трейдерам определить наиболее эффективную конфигурацию для различных рыночных условий.

EA inputs

Рисунок 10: Входные значения советника

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

FVI_EA_demo

Рисунок 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

Прикрепленные файлы |
PetalCurve.mq5 (6.6 KB)
PetalWaves.mq5 (10.46 KB)
FVI_EA.mq5 (8.09 KB)
Автоматизация греков Блэка-Шоулза: Расширенный скальпинг и микроструктурная торговля Автоматизация греков Блэка-Шоулза: Расширенный скальпинг и микроструктурная торговля
Гамма и Дельта изначально разрабатывались как инструменты управления рисками для хеджирования опционной экспозиции, но со временем они превратились в мощные инструменты для продвинутого скальпинга, моделирования потока ордеров и торговли на основе рыночной микроструктуры. Сегодня они служат индикаторами ценовой чувствительности и поведения ликвидности в режиме реального времени, позволяя трейдерам с удивительной точностью прогнозировать краткосрочную волатильность.
Синхронизация графиков для удобного технического анализа Синхронизация графиков для удобного технического анализа
Синхронизация графиков для упрощения технического анализа обеспечивает единообразное отображение графических объектов, таких как линии тренда, прямоугольники или индикаторы, на всех временных интервалах для одного и того же символа. Такие действия, как прокрутка, масштабирование или смена инструмента, отражаются на всех синхронизированных графиках, что позволяет легко просматривать и сравнивать один и тот же контекст ценового движения на разных временных интервалах.
Разработка инструментария для анализа Price Action (Часть 37): Индикатор смещения настроений Разработка инструментария для анализа Price Action (Часть 37): Индикатор смещения настроений
Рыночные настроения – одна из самых недооцененных, но при этом мощных сил, влияющих на движение цены. В то время как большинство трейдеров полагаются на запаздывающие индикаторы или догадки, советник Sentiment Tilt Meter (STM) преобразует рыночные данные в наглядный визуальный ориентир и в реальном времени показывает, склоняется ли рынок к бычьему или медвежьему сценарию либо остается нейтральным. Это упрощает подтверждение сделок, помогает избегать ложных входов и эффективнее выбирать момент входа в рынок.
Основы байесовского вывода в дискретном и непрерывном случаях: от теории к практической реализации моделей Основы байесовского вывода в дискретном и непрерывном случаях: от теории к практической реализации моделей
В статье рассматриваются основы байесовской статистики в дискретном и непрерывном случаях. Мы пройдём путь от классической теоремы Байеса и простых примеров с подбрасыванием монеты до сопряжённых распределений и динамического байесовского обновления, позволяющего проводить анализ котировок в режиме реального времени. На примере бета-биномиальной модели реализован простой индикатор разладки (change point detection), помогающий определять смену рыночного режима.