Экспертная система "Комментатор". Практическое использование встроенных индикаторов в MQL4-программе

Andrey Opeyda | 15 июня, 2006


Опытный трейдер никогда не откроет позицию, если ни один из технических индикаторов не подтвердит его решения. Например, в результате технического анализа трейдер пришёл к выводу, что возможно открытие длинной  позиции по некоторому валютному инструменту, пусть это будет EURUSD. Для того, чтобы войти в рынок по текущей цене (смотрите рисунок), опытный трейдер смотрит на показания индикатора, например Stochastic Oscillator, и ждёт от него сигнала-подтверждения. Описание индикатора и его сигналов можно прочесть здесь (https://www.metatrader5.com/ru/terminal/help/indicators/oscillators/so).  Для примера возьмем такой сигнал, который описан по вышеизложенному адресу.

"...Покупайте, если линия %K поднимается выше линии %D. Продавайте, если линия %K опускается ниже линии %D."


Рис. 1. Цены по EURUSD


%K – главная линия, а %D – пунктирная (сигнальная). Язык MQL4 разрешает использовать встроенные функции расчёта индикаторов, полный список которых приведён в конце статьи и в документации  MQL4. Индикатор Stochastic Oscillator не является исключением. Для расчёта значений главной и сигнальной линий используется функция

double iStochastic( string symbol, int timeframe, int %Kperiod, 
                    int %Dperiod, int slowing, int method, 
                    int price_field, int mode, int shift)

Более подробное описание функции смотрите в документации MQL4.

Расчет значения главной линии индикатора Stochastic Oscillator в MQL4 будет выглядеть так:

iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, i)

Здесь  параметры 3,5,5 – значения периодов средних индикатора, MODE_SMA – метод расчета скользящей средней, i – номер свечи, для которой вычисляется значение, а параметр MODE_MAIN указывает, что необходимо рассчитать главную линию (%K). Соответственно расчет сигнальной линии:

iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL, i)

При использовании встроенных функций расчёта индикаторов обязательным является указание периода ценового графика (timeframe) и  инструмента. В нашем случае  рассматривается текущий инструмент и текущий период ценового графика (параметры NULL и 0 ). Необходимо помнить, что расчёты можно проводить по любым инструментам и с различными таймфреймами. На графике индикатора Stochastic Oscillator видно, что значение главной линии равно 54,4444 и сигнальной 46,1238, т.е.

iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, i) > 
iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL, i)

Теперь нам не составит труда автоматизировать процесс расчёта индикатора. Было бы удобно, если бы индикатор не занимал место на  ценовом графике. Лучшее решение избавится от индикатора – отказаться от графика индикатора вообще, а на ценовом графике отображать только сигнал, который был только что рассчитан. Самыми популярными методами отображения сигналов есть, нанесение на ценовой график символов шрифта Wingdings. Оставим этот метод на потом, и воспользуется ещё одной возможностью языка MQL4. Возможность эта - оператор Comment().

void Comment( ...)

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

//STOCH
 
      double valSTOCH=0; 
      string commentSTOCH = "Stoch:         ";
      string commentSTOCHAdd = "   Нет данных ";
      if(iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)
>iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0))
        commentSTOCHAdd =  "    Возможна покупка";
               
      if(iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)
<iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0))
        commentSTOCHAdd =  "    Возможна продажа";   
        
      commentSTOCH =  commentSTOCH + commentSTOCHAdd;

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

Comment(commentSTOCH + "\n");

Процедура Comment удобна тем, что пользователь может использовать символ «перенос строки», для визуализации комментариев построчно. Используя приведенный выше код, трейдер может избавится от графика Stochastic Oscillator. Вместо него он получит сигнальную систему, которая будет отображать текущую ситуацию на рынке в текстовой форме.

Возьмем, к примеру, технический индикатор Индекс Товарного Канала (Commodity Channel Index, CCI)

"...Измеряет отклонение цены инструмента от его среднестатистической цены. Высокие значения индекса указывают на то, что цена необычно высока по сравнению со средней, а низкие - что она слишком занижена. Несмотря на название, Commodity Channel Index применим к любому финансовому инструменту, а не только к товарам."

Автоматизировав расчёт сигналов индикатора CCI, мы получим дополнительный комментарий типа «Предположительно цена завышена». А используя например технический индикатор Ускорения/Замедления (Acceleration/Deceleration, AC) который измеряет ускорение и замедление текущей движущей cилы, появляется возможность увеличить информирование трейдера ещё на один фактор. "...Понимание того, что АС является более ранним предупреждающим сигналом, дает очевидные преимущества."

Вот так может выглядеть код, отображающий сигналы с нескольких индикаторов.

//   Demarker
      double valDem=iDeMarker(NULL, 0, 13, 0);
      string commentDem = "DeMarker:    ";
      string commentDemAdd = "   Нет данных";
     
      if (valDem < 0.30)
         commentDemAdd =  "   Ожидается разворот цен Вверх";
      
      if (valDem > 0.70)
         commentDemAdd =   "   Ожидается разворот цен Вниз";
      commentDem = commentDem + commentDemAdd;
 
//ATR
      double valATR=iATR(NULL, 0, 12, 0);
      string commentATR = "ATR:           ";
      commentATR=commentATR + "   Вероятность смены тренда " + valATR;
            
//CCI
      double valCCI=iCCI(NULL,0,12,PRICE_MEDIAN,0);
      string commentCCI = "CCI:            ";
      string commentCCIAdd = "   Нет данных ";
      if (valCCI > 100)
        commentCCIAdd =  "   Cостояние перекупленности " + 
                         "(вероятность корректирующего спада) ";
 
      if (valCCI < -100)
        commentCCIAdd =  "   Cостояние перепроданности " + 
                         "(вероятность корректирующего подъема) ";
        
      commentCCI =  commentCCI + commentCCIAdd + valCCI;
 
 
 
//MFI
      double valMFI=iMFI(NULL,0,14,0);
      string commentMFI = "MFI:            ";
      string commentMFIAdd = "   Нет данных ";
      if (valMFI > 80)
        commentMFIAdd =  "    потенциальноая вершина рынка ";
 
      if (valMFI < 20)
        commentMFIAdd =  "    потенциальноае основание рынка ";
        
        commentMFI =  commentMFI + commentMFIAdd + valMFI;

Можно также проводить расчёты над массивами. Для этого используются функции, заканчивающиеся на OnArray, например, функция iMAOnArray, которая рассчитывает скользящее среднее на массиве данных. Интересным моментом является то, что некоторые индикаторы иногда склонны давать противоположные  сигналы. Но для трейдера, даже отсутствие сигнала это сигнал. Ведь торговля на рынке - это не только принятие решения, в какую сторону открыть позицию, но и время открытия. Экспертная система «Комментатор» вычисляет сигналы только для текущего таймфрейма, но ничто не мешает трейдеру добавить в программный код вычисление индикаторов для больших и меньших таймфреймов. Так же следует помнить, что использование языка MQL4 никак не стесняет трейдера, а только расширяет широту взгляда и практические возможности.

Ниже приведён список доступных функций вычисления встроенных индикаторов языка MQL4:

iAC 
iAD 
iAlligator 
iADX 
iATR 
iAO 
iBearsPower 
iBands 
iBandsOnArray 
iBullsPower 
iCCI 
iCCIOnArray 
iCustom 
iDeMarker 
iEnvelopes 
iEnvelopesOnArray 
iForce 
iFractals 
iGator 
iIchimoku 
iBWMFI 
iMomentum 
iMomentumOnArray 
iMFI 
iMA 
iMAOnArray 
iOsMA 
iMACD 
iOBV 
iSAR 
iRSI 
iRSIOnArray 
iRVI 
iStdDev 
iStdDevOnArray 
iStochastic 
iWPR