| / | Статьи |
Cтатьи
Возможности
Одновременное отображение сигналов нескольких индикаторов с четырех таймфреймов
Авторизуйтесь или зарегистрируйтесь , чтобы добавить новую статью
|
Одновременное отображение сигналов нескольких индикаторов с четырех таймфреймов [ en ]ВведениеПри ручной торговле, в отличие от механической, необходимо постоянно следить за значениями нескольких индикаторов. Если индикаторов, к примеру, два или три, а для торговли выбран один таймфрейм, то это совсем несложная задача. А как быть, если индикаторов - пять или шесть, а торговая стратегия обязывает учитывать сигналы на нескольких таймфреймах? Более того, если торговля ведется по нескольким парам валют одновременно? Подобная задача становится достаточно сложной, а в большинстве случаев это чревато ошибками и, как следствие, убытками. Специально для решения подобных задач создан индикатор Real_Time_MultiIndicator_v1. Этот индикатор вычисляет сигналы выбранных индикаторов на четырех таймфреймах одновременно и выводит их в одну таблицу в подокне основного графика. В скобках после сигнала индикатора выводится количество последних баров указанного таймфрейма, на которых демонстрируется этот сигнал. Вы можете изменять параметры используемых индикаторов, а также добавлять свои индикаторы. Теперь для принятия решения достаточно одного взгляда на таблицу, где собраны сигналы индикаторов с четырех таймфреймов. Индикатор Real_Time_MultiIndicator_v1Все данные индикатор выводит в отдельное подокно графика. Внешний вид индикатора: ![]()
Обратите внимание на то, что во всех индикаторах используется средняя цена (High+Low)/2, которая может отличаться от значений по умолчанию. При присоединении индикатора к графику или при изменении масштаба основного графика таблица с данными может растягиваться или сжиматься. Не пугайтесь! Таблица примет привычный вид при поступлении нового тика. Если же ваш терминал не подключен к Интернету, то после смены масштаба графика сделайте следующее: смените таймфрейм, например, Н1 на Н4 и обратно, и таблица примет привычный вид. Для использования индикатора необходимо загрузить файл Real_Time_MultiIndicator_v1. mq4 в \папка с терминал\experts\indicators\ и перезапустить терминал. Для присоединения индикатора выбираем в 'Навигаторе' раздел 'Пользовательские индикаторы', затем выбираем Real_Time_MultiIndicator_v1. Далее в меню
вы можете выбрать цвет таблицы (TColor) и цвет текста (TxtColor), а также параметры используемых индикаторов. Если вы хотите изменить параметры индикаторов, необходимо сделать следующее: щелкнуть правой кнопкой мыши по основному графику и выбрать команду 'Список индикаторов' или же использовать клавиши Ctrl+I,
Добавление нового индикатора в таблицуЯ специально не заполнял три последние строки таблицы индикатора, чтобы вы могли добавить используемые или написанные вами индикаторы. Я постарался максимально упростить алгоритм расчета и вывода данных в таблицу. Более того, я оставил закомментированные куски кода в исходной программе, чтобы любой, кто обладает начальными знаниями 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";
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 четырех таймфреймов. Однако подобный метод может
быть применен для решения широкого спектра задач. С помощью
описанных программ можно подобрать необходимые параметры используемых
индикаторов при тестировании на истории котировок. Описанный
индикатор предназначен для использования при ручной торговле.
Прикрепленные файлы:
Предупреждение:
все права на данные материалы
принадлежат MetaQuotes Software Corp. Полная или частичная перепечатка запрещена.
|