Обсуждение статьи "Переосмысливаем классические стратегии (Часть II): Пробои индикатора Bollinger Bands"

 

Опубликована статья Переосмысливаем классические стратегии (Часть II): Пробои индикатора Bollinger Bands:

В статье рассматривается торговая стратегия, объединяющая линейный дискриминантный анализ (Linear Discriminant Analysis, LDA) с полосами Боллинджера с использованием прогнозов категориальных зон для стратегических сигналов входа в рынок.

Термин «искусственный интеллект» (ИИ) небезосновательно считают одним из самых дезориентирующих в истории с точки зрения выбора названия. После прочтения этой статьи вы, вероятно, согласитесь, что «ИИ» — неправильное название. Как для автора, для меня проблема — в слове «интеллект». ИИ-модели не обладают интеллектом в человеческом смысле слова. Вместо этого они представляют собой интеллектуальные приложения алгоритмов оптимизации.

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

Как интеллектуальные специалисты по ИИ, мы должны обеспечивать тщательно спланированные ограничения для моделей. В рамках этой статьи будем управлять ИИ-моделями с помощью полос Боллинджера. Выделим четыре возможные зоны, в которых в любой момент времени может оказаться цена. Обратите внимание, что в конкретный момент цена может находиться только в одной из этих четырёх зон:

  • Зона 1. Цена полностью находится над полосами Боллинджера
  • Зона 2. Цена находится между средней и верхней полосами
  • Зона 3. Цена находится между нижней и средней полосами
  • Зона 4. Цена находится ниже нижней полосы

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

Индикатор Bollinger Bands можно использовать в самых разных торговых стратегиях: от следования за трендом до определения точек поворота или разворота. Технически этот индикатор состоит из экспоненциальной скользящей средней (EMA), которая обычно сглаживает цену закрытия ценной бумаги. Она окружена двумя дополнительными полосами: одна расположена выше, а другая — ниже EMA, и каждая из них обычно устанавливается на уровне 2 стандартных отклонений.

Автор: Gamuchirai Zororo Ndawana

 

Привет, Ндавана

Прежде всего, спасибо за статью и упрощение мифа об ИИ :) Я пытаюсь использовать сигнал, сгенерированный из этой статьи, в своем коде с некоторыми изменениями.

Не могли бы вы объяснить причину (причины), по которой вы использовали векторы, а не простые массивы в своем коде?

 
Anil Varma #:

Привет, Ндавана

Прежде всего, спасибо за статью и упрощение мифа об ИИ :) Я пытаюсь использовать сигнал, сгенерированный из этой статьи, в своем коде с некоторыми изменениями.

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

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

Мое предпочтение векторам исходит из специализированных функций, которые доступны только векторам, помимо этих специальных функций векторы также позволяют нам выполнять вычисления над всеми элементами сразу. Вот простой пример.
//+------------------------------------------------------------------+
//|                                                         Anil.mq5 |
//|                                        Gamuchirai Zororo Ndawana |
//|                          https://www.mql5.com/en/gamuchiraindawa |
//+------------------------------------------------------------------+
#property copyright "Gamuchirai Zororo Ndawana"
#property link      "https://www.mql5.com/en/gamuchiraindawa"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Here is my problem with arrays
double anil_array[3];
ArrayFill(anil_array,0,3,0);
ArrayPrint(anil_array);
//--- We have to iterate over all the elements to perform calculations
for(int i = 0; i < 3; i++)
   {
      anil_array[i] += 1;
   }
ArrayPrint(anil_array);
//--- And the same operation with vector
vector anil_vector = vector::Zeros(3); //Simillar to an array full of Zeros   
Print(anil_vector);   
//--- Vectors allow us to perform calculations on all the elements at once
anil_vector = anil_vector + 1;
Print(anil_vector);
  }
//+------------------------------------------------------------------+

Векторы VS массивы.

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