Меню

Как изменить цвет индикатора mql4



Урок №11: Пишем индикатор

На этом уроке мы напишем простой индикатор, который в дальнейшем будем использовать при разработке советника.

А использовать для получения сигнала мы будем уже существующие — Moving Average и MACD. Алгоритм следующий:

Определять направление сделки (покупка или продажа) мы будем по индикатору Moving Average с периодом 100 на дневном графике(Daily), т.е. если текущая цена выше MA(100), то покупаем, а если ниже — продаём.

А для поиска удачных точек входа воспользуемся индикатором MACD.

вход в покупки– индикатор MACD ниже нуля, идет снизу вверх, а его сверху вниз пересекает сигнальная линия.

вход в продажи – индикатор MACD выше нуля, идет cверху вниз, а его снизу вверх пересекает сигнальная линия.

Запускаем MetaEditor и вызываем мастер создания программ.

Отмечаем в списке выбора «Пользовательский индикатор»:

Заполняем пока только поле «Имя», остальное без изменений и нажимаем кнопку «Далее»:

На следующей форме мастера оставляем как есть и нажимаем кнопку «Далее»:

Тут также ничего не меняем и нажимаем «Готово»:

Итак, шаблон нашего будущего индикатора готов:

В основе пользовательских индикаторов, является передача значений индикаторных массивов клиентскому терминалу (для построения индикаторных линий) через буферы обмена.

Буфер — область памяти, содержащая численные значения индикаторного массива.

Стандартом языка MQL4 предусмотрена возможность построения с помощью одного пользовательского индикатора до восьми индикаторных линий. Каждой из индикаторных линий ставится в соответствие один индикаторный массив и один буфер. Каждый из буферов имеет свой индекс. Индекс первого буфера — 0, второго — 1, и т.д., а последнего — 7.

Нам необходимо два буфера для хранения и отображения на графике сигналов для покупок и для продаж, поэтому определим их:

а кроме того, давайте определим два имени «BUY» и «SELL», присвоив им значения «0» и «1» соответственно.

В дальнейшем это облегчит нам восприятие исходного текста индикатора:

Далее в функции OnInit():

С помощью функции SetIndexBuffer() необходимый буфер (рассмотрим случай с индексом 0) ставится в соответствие массиву (в нашем случае «Buy»). Это значит, что для построения первой стрелки клиентский терминал будет принимать данные, заключённые в массиве «Buy», используя для этого нулевой буфер и соответственно для буфера «Sell» — первый буфер.

Функция SetIndexEmptyValue() устанавливает значения «по умолчанию», т.е. те, при которых индикатор не будет ничего показывать на графике, в нашем случае это ноль.

Функция SetIndexStyle() у станавливает новый тип, стиль, ширину и цвет для указанной линии индикатора. Для нашего же случае это стрелки (DRAW_ARROW).

Функция SetIndexArrow() — у станавливает значок для линии индикаторов, имеющей стиль DRAW_ARROW. В качестве параметров в функцию передаётся номер буфера и код символа из шрифта Wingdings.

Функция IndicatorDigits — определяет формат точности (количество знаков после десятичной точки) для визуализации значений индикатора.

Функция IndicatorShortName — устанавливает «короткое» имя пользовательского индикатора для отображения в подокне индикатора.

Функция SetIndexLabel — устанавливает текст описания линии индикатора для отображения информации в окне.

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

При получении показаний с индикатора в качестве параметров я намеренно указал переменные (fast_ema_period, slow_ema_period, signal_period и т.д.), а не вписал жёсткие значения. Это позволит нам гибко подбирать параметры при тестировании будущего советника. Следовательно эти параметры необходимо определить и сделать их внешними:

Читайте также:  Пепельно коричневый цвет волос какая краска лучше

Дополнительно в этом блоке определена переменная MACDOpenLevel. Она нам понадобится для фильтрации от ложных сигналов.

Собственно, остаётся написать небольшой код в функции OnCalculate():

Функция IndicatorCounted() -возвращает количество баров, не измененных после последнего вызова индикатора.

Если раньше индикатор не был присоединён к окну финансового инструмента, то при первом исполнении функции OnCalculate значение переменной counted_bars будет равно нулю:

Это означает, что индикаторный массив не содержит ни одного элемента с ранее определённым значением, поэтому есть необходимость пересчитать весь индикаторный массив от начала до конца. Расчёт массива производится в направлении от самого старого бара к нулевому. Индекс самого старого бара, начиная с которого необходимо производить вычисления, рассчитывается так:

Предположим, что в момент запуска в окне финансового инструмента имеется 200 баров. Эта величина является значением предопределённой переменной Bars. Ранее определённое значение counted_bars равно 0. В результате получится, что индекс i первого не посчитанного бара (самого старого бара, начиная с которого необходимо начать расчёт) равен 199.

Далее в цикле мы проверяем значения индикатора через функцию Signal() и при наличии сигнала записываем в буфер индикатора значение цены текущего пересчитанного бара:

Именно так и получаются сигнальные стрелки на графике самого индикатора:

И полный текст индикатора:

На этом, пожалуй, все. На одном из следующих уроков мы рассмотрим советник на нашем индикаторе.

Исходный текст нашего индикатора доступен для скачивания.

Источник

Как поменять отображение линий и их цвета в коде индикатора

Школа MQL FX Review

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

Мы уже рассматривали систему 120 Cloud System, в которой применяются индикаторы с нестандартными настройками. Например, индикатор Ишимоку в ней выглядит так:

Добиться подобного эффекта можно, изменив настройки индикатора:

Как видим, все ненужные линии отключены – сделаны невидимыми при помощи атрибута None. Толщина основной линии установлена в 2 пункта и задана цветом Blue (синий).

Теперь эти настройки закреплены в текущей версии терминала за этим индикатором. Но что делать, если нужно этот индикатор перенести в другой терминал или отправить товарищу?

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

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

Какой же есть выход в данной ситуации? Достаточно простой и универсальный! Если ваш индикатор в формате .mql4 – исходный код, то модификации вы можете произвести непосредственно в нем.

Давайте рассмотрим пошагово, как это делается. Для начала посмотрим, как вообще выглядит индикатор Ишимоку в терминале МетаТрейдер 4.

Нажмем клавишу F4 или выберем в меню «Сервис» пункт «Редактор MetaQuotes Language» для того, чтобы запустить редактор кода MetaEditor.

Читайте также:  От чего зеленого цвета темного понос

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

Вот, что мы увидим в основном окне редактора:

Вспоминайте наши уроки программирования. Цвет линий задается данным параметром:

И, как видите, в примере выше таких цветов задано всего 7 наименований – для всех линий индикатора.

Именно из них нам нужно оставить только одну линию, отключив остальные 6, задать ей синий цвет и толщину в 2 пункта.

Но как же узнать, цвет какой линии нужно изменить, и какая вообще линия нам нужна — ведь их 7 штук! Кто-то может воспользоваться перебором и по очереди отключать все линии последовательно – это тоже вариант, когда мы не видели настройки того индикатора, который хотим получить.

Но в нашем случае эти настройки мы видели, помните:

У 5-ой линии стоит синий цвет, в то время как другие отключены.

Теперь возвращаемся в MetaEditor. Тут есть некоторая путаница, которая часто смущает начинающих программистов. Несмотря на то, что буферы на MQL4 нумеруются от 0, в настройках цвета этот отсчет идет с единицы. Таким образом, нужная нам линия оказывается под номером 6:

Отключаем остальные линии, просто исправляя параметр цвета на clrNONE.

А у нужной нам линии пишем нужный нам цвет – clrBlue.

Вот, что получается в итоге:

Нажимаем F7 или кнопку «Компилировать»:

И смотрим на внешний вид индикатора после модификации:

Осталась одна линия, но это еще не совсем то, что нужно – линия индикатора прерывистая и не очень хорошо заметна. Сделаем ее сплошной и увеличим толщину.

Для этого мы должны прокрутить окно с кодом индикатора на процедуру void OnInit(void). Это инициализирующий код индикатора – именно в нем задаются настройки буферов и внешний вид линий.

Вспоминаем, что буферы нумеруются от 0, поэтому здесь нас будет интересовать буфер №5 (выделен желтым):

STYLE_DOT – задает внешний вид линии, состоящий из точек. Нам нужно исправить его на STYLE_SOLID – сплошная линия.

Также сразу за новым параметром поставим запятую и зададим толщину линии – 2.

Нажимаем «Компиляция» и видим результат на экране:

Источник

MQL для тебя

MQL для чайников, программирование на MQL4, MQL5

Язык MQL — Урок 10 «Работа с внешними индикаторами»

Сегодня разберемся, как работать в языке MQL4 с внешними индикаторами . Невозможно встроить все индикаторы форекс в терминал Metatrader. Постоянно появляются новые индикаторы Forex и усовершенствуються старые индикаторы. Поэтому разработчики терминала Metatrader4 позаботились о работе с внешними индикаторами в языке MQL.

Рассмотрим например индикатор форекс «ZigZag» :

Он не встроен в терминал MT4, хотя и поставляется вместе с ним. Если взглянуть на график валютной пары, то прекрасно видно преимущества данного индикатора Forex.

Было бы здорово, если бы трейдер покупал внизу и продавать вверху точек излома индикатора ZigZagа . Стратегию я такую не нашел. Поэтому просто проверю — действительно это так или нет. Но для начала необходимо сформулировать условия торговли: — покупаем когда ZigZag рисует линию вниз. — продаем когда ZigZag рисует линию вверх. — окончание линии ZigZagа анализируем при открытии следующей свечи — стоп-лосс ставим на 5 пунктов вниз или вверх от экстремума ZigZagа — тейк-профит ставим в 5 раз больше величины стоп-лосса — при образовании нового фрактала, стоп-лосс переносим вслед за ценой

Читайте также:  Что означает цвет кактуса

Правила сформулировали, теперь можно заняться созданием советника форекс для Metatrader 4 на языке MQL4 .

Создаем новый советник — назовем его «expert3» .

Переносить наши функции теперь не надо, достаточно подключить нашу библиотеку «MyLib» .

Добавим новые параметры для индикатора форекс ZigZag :
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;

С помощью функции iCustom () можно получить значение из внешнего индикатора. Хорошо скажите Вы. А откуда мы знаем, какие параметры и сколько буферов у индикатора, если он скомпилирован? Ведь нам их надо указать функции iCustom ().

Установите индикатор на график в терминале и посмотрите его параметры:

Вот мы и увидели параметры индикатора и порядок их следования.
А здесь мы видим что буфер для рисования всего один:

Продолжим. Нам необходимо знать количество уже открытых ордеров что бы не открывать ордера повторно. Это мы можем глянуть в наших предыдущих советниках. Предлагаю сразу же в цикле подсчета ордеров реализовать перенос стоп-лосса по фракталам:

С помощью функции iFractals () мы получаем значение индикатора. Для ордеров типа Buy — берем нижние фракталы, а для ордеров типа Sell — верхние. Фракталы ищем на 3 свече от текущей. Дело в том что фрактал считается сформировавшимся если после свечи со стрелочкой идет 2 подряд свечи вверх или вниз соответственно.

Еще я использовал округление: NormalizeDouble (. Digits ). Дело в том, что некоторые Брокеры форекс с 4 значными котировками (типа Forex4you) не имеют истории своих котировок. При подгрузке котировок в этом случае будет использоваться сервер MetaQuotes , а там хранятся 5 значные котировки — в итоге при тестировании будут ошибки при открытии или модификации ордеров.

Осталось самое основное: открытие ордеров .
if (lZZ>0 && oBuy+oSell==0)
while ( iCustom ( NULL ,0, «ZigZag» ,ExtDepth,ExtDeviation,ExtBackstep,0,i)==0) i++;
double fZZ= iCustom ( NULL ,0, «ZigZag» ,ExtDepth,ExtDeviation,ExtBackstep,0,i);
double Lot=GetLot(MaxRisk);
if (Lot==0) < Alert ( "Недостаточно средств!" ); return (0);>
double tp=0;
double sl=0;
if (lZZ>fZZ)
if (TakeProfit>0) tp= NormalizeDouble ( Bid — (sl- Bid )*TakeProfit, Digits );
NewOrder( OP_SELL ,Lot,0,tp,sl);>
if (lZZ NormalizeDouble (lZZ-StopLoss* Point , Digits );
if (TakeProfit>0) tp= NormalizeDouble ( Ask +( Ask -sl)*TakeProfit, Digits );
NewOrder( OP_BUY ,Lot,0,tp,sl);>>

Здесь мы проверяем что нет открытых ордеров и что окончание линии индикатора ZigZagа на предыдущей свече. Определяем направлении линии ZigZagа (для этого сравниваем точки между которыми проведена последняя линия) и открываем ордера. Осталось проверить как это все работает.

Для этого запустим тестер стратегий MT4 в визуальном режиме:

Обратите внимание на галочку «Визуализация» . Нажимаем старт и после этого кнопочку:
Откроется график, но тестирование дальше не пойдет. Нам это и нужно. Устанавливаем на открывшийся график индикаторы ZigZag и Фракталы . После этого нажимаем кнопочку:

Начинается тестирование и мы видим все действия эксперта:

За декабрь месяц у меня, созданный нами эксперт «expert3» получил прибыль:

Признаться, я такого результата даже и не ожидал. При тестировании же эксперта «expert3» на большем промежутке времени, получили полный слив депозита.

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

Источник