
Одновременное отображение сигналов нескольких индикаторов с четырех таймфреймов
Введение
При ручной торговле, в отличие от механической, необходимо постоянно следить за значениями нескольких индикаторов. Если индикаторов, к примеру, два или три, а для торговли выбран один таймфрейм, то это совсем несложная задача. А как быть, если индикаторов - пять или шесть, а торговая стратегия обязывает учитывать сигналы на нескольких таймфреймах? Более того, если торговля ведется по нескольким парам валют одновременно? Подобная задача становится достаточно сложной, а в большинстве случаев это чревато ошибками и, как следствие, убытками.
Специально для решения подобных задач создан индикатор 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 четырех таймфреймов. Однако подобный метод может
быть применен для решения широкого спектра задач. С помощью
описанных программ можно подобрать необходимые параметры используемых
индикаторов при тестировании на истории котировок. Описанный
индикатор предназначен для использования при ручной торговле.





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования