English 中文 Español Deutsch 日本語 Português
Одновременное отображение сигналов нескольких индикаторов с четырех таймфреймов

Одновременное отображение сигналов нескольких индикаторов с четырех таймфреймов

MetaTrader 4Примеры | 22 марта 2007, 14:11
5 370 0
Pavel Chigirev
Pavel Chigirev

Введение

При ручной торговле, в отличие от механической, необходимо постоянно следить за значениями нескольких индикаторов. Если индикаторов, к примеру, два или три, а для торговли выбран один таймфрейм, то это совсем несложная задача. А как быть, если индикаторов - пять или шесть, а торговая стратегия обязывает учитывать сигналы на нескольких таймфреймах? Более того, если торговля ведется по нескольким парам валют одновременно? Подобная задача становится достаточно сложной, а в большинстве случаев это чревато ошибками и, как следствие, убытками.

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

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


Индикатор Real_Time_MultiIndicator_v1

Все данные индикатор выводит в отдельное подокно графика. Внешний вид индикатора:



В столбце INDICATOR выводятся названия используемых индикаторов, а в скобках указываются их параметры. В столбцах M15, M30, H1, H4 выводятся сигналы индикатора на соответствующих таймфреймах с указанием количества баров, на которых демонстрируется этот сигнал. Если исторические данные загружаются либо отсутствуют, тогда для соответствующего таймфрейма выводится сообщение Waiting data. Если терминал подключен к интернету, необходимые данные загрузятся в течение нескольких секунд.

Обратите внимание на то, что во всех индикаторах используется средняя цена (High+Low)/2, которая может отличаться от значений по умолчанию. При присоединении индикатора к графику или при изменении масштаба основного графика таблица с данными может растягиваться или сжиматься. Не пугайтесь! Таблица примет привычный вид при поступлении нового тика. Если же ваш терминал не подключен к Интернету, то после смены масштаба графика сделайте следующее: смените таймфрейм, например, Н1 на Н4 и обратно, и таблица примет привычный вид.

Для использования индикатора необходимо загрузить файл Real_Time_MultiIndicator_v1. mq4 в \папка с терминал\experts\indicators\ и перезапустить терминал. Для присоединения индикатора выбираем в 'Навигаторе' раздел 'Пользовательские индикаторы', затем выбираем Real_Time_MultiIndicator_v1. Далее в меню



вы можете выбрать цвет таблицы (TColor) и цвет текста (TxtColor), а также параметры используемых индикаторов. Если вы хотите изменить параметры индикаторов, необходимо сделать следующее: щелкнуть правой кнопкой мыши по основному графику и выбрать команду 'Список индикаторов' или же использовать клавиши Ctrl+I,


далее выбрать Real_Time_MultiIndicator_v1 и нажать на кнопку 'Свойства'. Если изменение параметров индикаторов не составит особого труда, то добавление нового индикатора потребует некоторых усилий, а также знания MQL4 на начальном уровне.


Добавление нового индикатора в таблицу

Я специально не заполнял три последние строки таблицы индикатора, чтобы вы могли добавить используемые или написанные вами индикаторы. Я постарался максимально упростить алгоритм расчета и вывода данных в таблицу. Более того, я оставил закомментированные куски кода в исходной программе, чтобы любой, кто обладает начальными знаниями MQL4, смог добавить индикаторы в таблицу, не вникая в подробности работы алгоритма.

Ниже на примере индикатора Commodity Channel Index я продемонстрирую алгоритм добавления нового индикатора в таблицу. Обратите внимание, что сигналы этого индикатора я буду интерпретировать следующим образом: значение индикатора 0 – сигнал на продажу, и наоборот. Такая интерпретация несколько отличается от классической, но я специально делаю это, чтобы упростить объяснение алгоритма. Впоследствии вы можете интерпретировать сигналы по своему усмотрению.

Выбираем в 'Навигаторе' раздел 'Пользовательские индикаторы', затем - Real_Time_MultiIndicator_v1 и нажимаем на кнопку 'Изменить'.



Далее будем вносить изменения в исходный код:

//----Параметры используемых индикаторов
extern string p1 = "Параметры SAR";
extern double SAR_Step = 0.01;
extern double SAR_Max = 0.1;
extern string p2 = "Параметры MACD";
extern int Fast_EMA = 12;
extern int Slow_EMA = 26;
extern int MACD_SMA = 9;
extern string p3 = "Параметры Moving Average";
extern int Fast_MA = 5;
extern int Slow_MA = 10;
extern string p4 = "Параметры ADX";
extern int ADX_Period = 14;
//extern string p5 = "Параметры индикатора 1";
//extern string p6 = "Параметры индикатора 2";
//extern string p7 = "Параметры индикатора 3";

В этом куске необходимо снять комментарии со строки с текстом "Параметры индикатора 1" и добавить название CCI. В результате получим:

extern string p5 = "Параметры CCI";

Теперь добавляем параметр индикатора CCI – период:

extern string p5 = "Параметры CCI";
extern int Period_CCI = 14;

Далее в строку

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","","",""};

вносим имя индикатора для отображения в таблице:

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","CCI","",""};

Далее в блоке инициализации индикатора

  int init()

    {
     string sn = "Real_Time_MultiIndicator_v1";
     IndicatorShortName(sn);
     SetIndexLabel(0, sn);
     name[0] = name[0] + "(" + DoubleToStr(SAR_Step, 2) + ", " +
               DoubleToStr(SAR_Max, 2) + ")";
     name[1] = name[1] + "(" + DoubleToStr(Fast_EMA, 0) + ", " +
               DoubleToStr(Slow_EMA, 0) + ", " + 
               DoubleToStr(MACD_SMA, 0) + ")";
     name[2] = name[2] + "(" + DoubleToStr(Fast_MA, 0) + ", " +
               DoubleToStr(Slow_MA, 0) + ")";
     name[3] = name[3] + "(" + DoubleToStr(ADX_Period, 0) + ")";
     //name[4] = name[4] + "(" + 
     //          DoubleToStr(1-й параметр индикатора 1, 0) +
     //          ", " + DoubleToStr(2-й параметр индикатора 1, 0) + ")";
     //name[5] = name[5] + "(" + 
     //          DoubleToStr(1-й параметр индикатора 2, 0) +
     //          ", " + DoubleToStr(2-й параметр индикатора 2, 0) + ")";
     //name[6] = name[6] + "(" + 
     //          DoubleToStr(1-й параметр индикатора 3, 0) +
     //          ", " + DoubleToStr(2-й параметр индикатора 3, 0) + ")";
     return(0);
    }

снимаем комментарии со строки

//name[4] = name[4] + "(" + 
//          DoubleToStr(1-й параметр индикатора 1, 0) +
//          ", " + DoubleToStr(2-й параметр индикатора 1, 0) + ")";

и вносим следующие изменения:

name[4] = name[4] + "(" + DoubleToStr(Period_CCI, 0) + ")";
Затем снимаем комментарии с этого блока:

/*
//+------------------------------------------------------------------+
//| Функция 1                                                        |
//+------------------------------------------------------------------+
string Функция(int p)
  {
  int ii  = 1;
  if (Условие для индикатора - true - sell, false - buy)
    {
      while (Условие для sell)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while (Условие для buy)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }*/

Вместо слова 'Функция' записываем название функции, например, CCI:

string CCI(int p)

Теперь записываем вместо строки “Условие для индикатора - true - sell, false - buy” условие для сигнала на продажу для текущего (нулевого) бара:

iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0

Далее, вместо строки “Условие для sell” записываем условие для сигнала на продажу и для подсчета количества сформировавшихся баров, на которых демонстрируется этот сигнал:

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)

здесь ii - сдвиг относительно текущего бара. Аналогично изменяем строку while (Условие для buy) на

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)

В итоге получим:

string CCI(int p)
  {
   int ii = 1;
   if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0)
    {
      while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)
          ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)
          ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }

Если вы хотите отсчитывать сигналы от уровней 100 и -100, а промежуток (-100;100) не интерпретировать как сигнал к покупке или продаже, необходимо изменить 0 на значения -100 и 100 для sell и buy соответственно и добавить следующую строку для отражения факта неопределенности в таблице:

if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) && 
   iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100))
    return("N/A");

В итоге получим:

 string CCI(int p)
   {
    int ii = 1;
    if((iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) && 
       (iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100) )
        return("N/A");
    if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < -100)
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < -100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Sell(" + DoubleToStr(ii, 0) + ")");
      }
    else
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Buy(" + DoubleToStr(ii, 0) + ")");
      }
   }
Теперь результаты вычисления необходимо вывести в таблицу. Для этого сделаем следующее: находим в тексте программы часть кода
/*//----------Пятая строка   
  for (i = 1; i <= 4; i++)
     {
       ObjectDelete("6" + DoubleToStr(i, 0));
       ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT, 
                           WindowFind("Real_Time_MultiIndicator_v1"), textT[i+1], textC[6]);
       ObjectSetText("6" + DoubleToStr(i, 0), Функция(per[i-1]), 13, "Tahoma", TxtColor);
    }*/
и снимаем с нее комментарии. Поскольку координаты для вывода текста рассчитаны отдельно, это делает возможным заполнение таблицы с использованием цикла. Достаточно указать функцию, которая рассчитывает результаты. Затем вместо слова 'Функция' записываем название нашей функции. В результате получим:

 //----------Пятая строка   
 for (i=1;i<=4;i++)
   {
     ObjectDelete("6" + DoubleToStr(i, 0));
     ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT,
                  WindowFind("Real_Time_MultiIndicator_v1"),
                  textT[i+1], textC[5]);
     ObjectSetText("6" + DoubleToStr(i, 0), CCI(per[i-1]), 13, 
                   "Tahoma", TxtColor);
   }

Теперь нажимаем на кнопку 'Компилировать'. Переходим в терминал и присоединяем индикатор к графику. В результате получаем:



Если вы хотите изменить таймфреймы, на которых вычисляются значения индикаторов, то необходимо сделать следующее.

В строке:

int per[] = {15,30,60,240};

нужно ввести количество минут для выбранного таймфрейма, например:

int per[] = {5,30,60,240};
а в строке:
string nameS[] = {"INDICATOR","M15","M30","H1","H4"}
нужно ввести его название:
string nameS[] = {"INDICATOR","M5","M30","H1","H4"};

и скомпилировать. В итоге получим:


Отладка параметров на истории

Описанный здесь индикатор можно использовать только в режиме реального времени. Это связано с тем, что при тестировании в режиме визуализации адекватные значения индикатор будет показывать только на текущем для тестирования таймфрейме. Это - особенности терминала и тестера. Если вы хотите подобрать параметры индикаторов либо проверить собственную стратегию при визуализации тестирования на истории, то я предлагаю использовать Real_Time_MultiExpert_v1. Функции, выполняемые Real_Time_MultiIndicator_v1 и Real_Time_MultiExpert_v1, абсолютно одинаковы. Исходный код этих программ практически идентичен, поэтому внесение изменений в код эксперта происходит по такому же алгоритму, как и внесение изменений в код индикатора. Для использования эксперта необходимо загрузить файл Real_Time_MultiExpert_v1.mq4 в папку терминал\experts\, а Real_Time_MultiIndicator_v2.mq4 в \папка с терминалом\experts\indicators\ и перезапустить терминал.

Для использования Real_Time_MultiExpert_v1 необходимо создать шаблон под именем Real_Time_MultiExpert_v1 с присоединенным к графику индикатором Real_Time_MultiIndicator_v2. Задача индикатора Real_Time_MultiIndicator_v2 заключается в создании подокна под основным графиком с необходимым масштабом. Затем в тестере в поле 'Советник' выбрать Real_Time_MultiExpert_v1, а в поле 'Модель' желательно выбрать пункт 'Все тики', иначе показания советника на текущем (нулевом) баре могут отличаться от действительности, но в целом показания будут справедливыми.


Не забудьте нажать кнопку автоматического сдвига графика:

Далее выбираем пункт “Визуализация” и нажимаем кнопку “Старт”. ‌

В окне Real_Time_MultiIndicator_v2 будет отображаться таблица с сигналами индикаторов. Таймфрейм для тестирования можно выбрать любой, так как значения индикаторов от него не зависят. Принципиальной разницы между описанными здесь экспертом и индикатором нет, поэтому то, что вы будете использовать, - дело вкуса. С моей точки зрения, в режиме реального времени гораздо удобнее применять индикатор.


Заключение

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

Опрос: мобильный терминал глазами трейдеров Опрос: мобильный терминал глазами трейдеров
Четкой картины относительно мобильного трейдинга и его будущего до сих пор не существует. Вокруг мобильного трейдинга ходит немало слухов. Чтобы развеять их и узнать, нравятся ли трейдерам наши мобильные терминалы, мы решили провести опрос. Нам удалось узнать, что думают наши клиенты, и получить целостную картину их пожеланий.
Точки разворота PIVOT POINTS, помогающие определить направление движения рынка Точки разворота PIVOT POINTS, помогающие определить направление движения рынка
Точка разворота (PIVOT POINT) – линия на графике цены, которая показывает дальнейшую тенденцию движения валютной пары. Если цена находится выше этой линии, то цена имеет тенденцию к росту. Если ниже, соответственно, - к падению.
Теоретические основы построения кластерных индикаторов для рынка FOREX Теоретические основы построения кластерных индикаторов для рынка FOREX
Кластерные индикаторы – это набор индикаторов, разделяющих валютные пары на отдельные валюты. Индикаторы позволяют следить за колебаниями валют относительно друг друга, определять потенциал зарождения новых валютных трендов, получать торговые сигналы и сопровождать среднесрочные и долгосрочные позиции.
Как разработать надежный и безопасный торговый робот на языке MQL4 Как разработать надежный и безопасный торговый робот на языке MQL4
В статье рассказывается об основных типах ошибок, которые возникают при создании и эксплуатации советника. Приводится пример создания безопасной автоматической торговой системы.