Ограничения и преимущества индикаторов

Все специализированные функции, рассмотренные в данной главе, доступны только в исходных кодах индикаторов. Использовать их в других типах MQL-программ не имеет смысла: они вернут ошибку.

С другой стороны существует целый ряд функций, запрещенных в индикаторах.

Часть из них (с префиксом Order-) относится к торговым расчетам и разрешена только в экспертах и скриптах, часть предназначена для выполнения запросов в сети, которые блокируют выполнение потока до возвращения результата, а это недопустимо для индикаторов, потому что они выполняются в интерфейсном потоке терминала. По аналогичной причине запрещены функции Sleep и MessageBox.

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

Эффект длительного расчета демонстрируется индикатором IndBarIndex.mq5, который в штатном режиме предназначен для отображения в элементах своего буфера порядковых номеров баров. Однако с помощью входного параметра SimulateCalculation, который следует установить в true, можно по таймеру запустить бесконечный цикл.

// установка в true заморозит рисование индикаторов
// на чартах того же рабочего символа
// осторожно! не забудьте удалить индикатор после эксперимента!
input bool SimulateCalculation = false;
 
void OnInit()
{
   ...
   if(SimulateCalculation)
   {
      EventSetTimer(1);
   }
}
...  
void OnTimer()
{
   Comment("Calculation started at "TimeLocal());
   while(!IsStopped())
   {
      // бесконечный цикл для эмуляции расчетов
   }
   Comment("");
}

В таком режиме индикатор ожидаемо начинает целиком занимать 1 ядро процессора, однако проявляется и другой побочный эффект. Любые индикаторы на том же символе, на котором размещен IndBarIndex, перестают обновляться. Вы можете, например, применить IndBarIndex на EURUSD (любого таймфрейма), а потом на любом другом графике EURUSD попробовать применить обычную скользящую среднюю: она не отобразится, пока вы не удалите индикатор IndBarIndex с первого графика.

В связи с этим все длительные расчеты следует выносить в отдельные потоки, то есть скрипты или неторгующие эксперты, а в индикаторах только пользоваться их результатами. MQL5 API позволяет создавать новые графики или объекты с графиками, в которых можно применять tpl-шаблоны с требуемым экспертом или скриптом.