Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Ребят, подскажите как реализовать смещение по GMT, которое в дальнейшем во внешних параметрах задаётся.

Вводите внешнюю переменную: GMT_offset = 2; (например)
Затем получаем время брокера: Brok_time = TimeCurrent();
Теперь вычисляем текущее время GMT: GMT_now = Brok_time - GMT_offset * 3600; (3600 - кол-во сек. в часе)
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Oll, то есть вот так должно выглядеть для начала?


double Mi0, Mi1, M[ 100 ] , StartBar = 0, StopBar = 100;
int m =0;
void OnTick()
{
double YstDay0 = iTime(NULL, PERIOD_D1, 1);
double YstDay1 = iTime(NULL, PERIOD_D1, 0);

for (int i = StartBar; i {
Мi0 = iCustom(..., i, ... , 0);
Мi1 = iCustom(..., i, ... , 1);
if (Мi0 > 0 && i>YstDay0 && i if (Мi1 > 0 && i>YstDay0 && i }

}

и в iCustom(..., i, ... , 0); i - это таймфрейм?

теперь как я понимаю, получили массив со значениями буферов индикатора?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Oll, то есть вот так должно выглядеть для начала?

и в iCustom(..., i, ... , 0); i - это таймфрейм?

теперь как я понимаю, получили массив со значениями буферов индикатора?

Ну, почти...
Главное! вместо: double YstDay0 = iTime(NULL, PERIOD_D1, 1);
надо: int YstDay0 = iBarShift(_Symbol, _Period, iTime(NULL, PERIOD_D1, 1));
Поясню: в первом случае у Вас время начала вчерашнего дня, во втором номер бара рабочего ТФ (очень существенно). Для YstDay1 - тоже.
i - это номер бара в текущем ТФ.
Получили массив с непустыми значениями буферов индикатора (уточняю).
Ну и вызов iCustom надо оформить...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Цитата

Главное! вместо: double YstDay0 = iTime(NULL, PERIOD_D1, 1);
надо: int YstDay0 = iBarShift(_Symbol, _Period, iTime(NULL, PERIOD_D1, 1));
Поясню: в первом случае у Вас время начала вчерашнего дня, во втором номер бара рабочего ТФ (очень существенно)


Но у меня рабочий тф - м15, это значит, что в (_Symbol, _Period, iTime(NULL, PERIOD_D1, 1) Period нужно поставить 15?

Цитата

вызов iCustom надо оформить



То есть, после этого цикла нужно задать еще одну переменную, которая будет брать уже непустые значения?
double a = iCustom(..., M[ m ], ... , 0);
double b = iCustom(..., M[ m ], ... , 1);
или я что-то путаю?
И как проверять в основном условии наличие уровня? проверкой переменных a и b ?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

В Вашем случае _Period = 15 (Вы справку читаете?)
оформить вызов iCustom - это вместо (...) поставить всё, что написано в справке.

Цитата

И как проверять в основном условии наличие уровня? проверкой переменных a и b ?


Дык писалось: if (Мi0 > 0 && i>YstDay0 && i
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

А.. так как iCustom заполнять - понятно, просто я подумал, что еще раз вызвать надо будет

Я возможно немного про другое... я имею ввиду, вот работает советник, у него есть ряд условий, допустим там,

if (МА1>MA2 && Bid > level1) // условия на продажу
{
алгоритм советника
}

и как в данном случае проверить, находится ли цена на уровне фрактала?
не так?

Спойлер


double Mi0, Mi1, M[ 100 ] , StartBar = 0, StopBar = 100;
int m =0;
void OnTick()
{
int YstDay0 = iBarShift(_Symbol, 15, iTime(NULL, PERIOD_D1, 1));
int YstDay1 = iBarShift(_Symbol, 15, iTime(NULL, PERIOD_D1, 1));

for (int i = StartBar; i {
Мi0 = iCustom(..., i, ... , 0);
Мi1 = iCustom(..., i, ... , 1);
if (Мi0 > 0 && i>YstDay0 && i if (Мi1 > 0 && i>YstDay0 && i }
//--------условия открытия ордера на продажу--------

if (МА1>MA2 && Bid > level1 && (Мi0 > 0 || Мi1 > 0))

{
OrderSend(.............)
}
}



И кстати, момент один упустил: эти значения в массиве будут являться точками хай/лоу у фрактальных свечей? Изменено пользователем oleguitar
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


и как в данном случае проверить, находится ли цена на уровне фрактала?
не так?
И кстати, момент один упустил: эти значения в массиве будут являться точками хай/лоу у фрактальных свечей?

Именно "хай/лоу у фрактальных свечей", поэтому проверка нахождения цены в зоне фрактального уровня будет типа: если (Бид > фрактал - дистанция ИИ Бид
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Хм... такого еще не было

Спойлер



Самое интересное, что последняя запись вроде как говорит о том, что уровень найден, и это вероятно, так

Спойлер



Только почему он индикатор удаляет постоянно, и неужели так на каждом тике...
Спойлер


extern string BlockSettings1 = " Настройка индикатора";
extern int Equals = 10;
extern int nLeftUp = 10;
extern int nRightUp = 10;
extern int nLeftDown = 10;
extern int nRightDown = 10;

extern string BlockSettings2 = " Area ";
extern int Area = 2;


double Mi0, Mi1, M[100] , StartBar = 0, StopBar = 100;
int m =0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
Area *=10;

}
return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int YstDay0 = iBarShift(Symbol(), 15, iTime(NULL, PERIOD_D1, 1));
int YstDay1 = iBarShift(Symbol(), 15, iTime(NULL, PERIOD_D1, 0));

for (int i = StartBar; i {
Mi0 = iCustom(Symbol(),i,"wlxFractals",Equals,nLeftUp,nRightUp,nLeftDown,nRightDown,0,0);
Mi1 = iCustom(Symbol(),i,"wlxFractals",Equals,nLeftUp,nRightUp,nLeftDown,nRightDown,0,1);
if (Mi0 > 0 && i>YstDay0 && i if (Mi1 > 0 && i>YstDay0 && i }


if ((Ask > Mi0-Area && Ask Mi1-Area && Ask
{
Print("Fractal level is found");
}

}

Изменено пользователем oleguitar
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Хм... такого еще не было

Спойлер


Сова не видит самого индюка, проверьте название и его наличие в нужной папке.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Вызов индюка не корректен:
Mi0 = iCustom(Symbol(),i,"wlxFr...
Вы вместо периода индюка поставили счётчик i - поэтому в логах то М99, то М100.
Счётчик i должен стоять предпоследним параметром.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Теперь таких записей не выдает

Но условие срабатывает даже тогда, когда фрактала нет вовсе

Спойлер



Спойлер


extern string BlockSettings1 = " Настройка индикатора";
extern int Equals = 10;
extern int nLeftUp = 10;
extern int nRightUp = 10;
extern int nLeftDown = 10;
extern int nRightDown = 10;

extern string BlockSettings2 = " Area ";
extern int Area = 2;


double Mi0, Mi1, M[100] , StartBar = 0, StopBar = 100;
int m =0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
Area *=10;

}
return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int YstDay0 = iBarShift(Symbol(), 15, iTime(NULL, PERIOD_D1, 1));
int YstDay1 = iBarShift(Symbol(), 15, iTime(NULL, PERIOD_D1, 0));

for (int i = StartBar; i {
Mi0 = iCustom(Symbol(),0,"wlxFractals",Equals,nLeftUp,nRightUp,nLeftDown,nRightDown,i,0);
Mi1 = iCustom(Symbol(),0,"wlxFractals",Equals,nLeftUp,nRightUp,nLeftDown,nRightDown,i,1);
if (Mi0 > 0 && i>YstDay0 && i if (Mi1 > 0 && i>YstDay0 && i }


if ((Ask > Mi0-Area && Ask Mi1-Area && Ask
{
Print("Fractal level is found");
}
else Print ("Fractal level is not found");

}


Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Но условие срабатывает даже тогда, когда фрактала нет вовсе

Нужно более критически относится к своей работе. У меня заняло минуту найти ошибку.
if ((Ask > Mi0-Area && Ask Mi1-Area && Ask подставьте значения и узнаете:
Ask > 1,6599-20 && Ask Нужно Area * _Point
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Сделал так:

if ((Ask > (Mi0-Area*Point) && Ask (Mi1-Area*Point) && Ask
{
Print("Fractal level is found");
}

Но в журнале теперь вот что:

2014.09.22 16:47:20.175 TestGenerator: unmatched data error (volume limit 1274 at 2014.09.18 13:45 exceeded)
2014.09.22 16:47:20.175 TestGenerator: unmatched data error (high value 1.63399 at 2014.09.18 13:58 and price 1.63404 mismatched)


Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Добрый день.
Только начал изучать MQL. Пробую сделать советник на основе данных с индикатора Bheurekso_pattern. Это индикатор свечных моделей.
Пытаюсь обратиться к данным через буфер, но на выходе всегда 0.0.
Вот так не работает:
upper=iCustom(Symbol(),Period(),"Bheurekso Pattern",lines,step,Dell,0,1);
lower=iCustom(Symbol(),Period(),"Bheurekso Pattern",lines,step,Dell,1,1);

Что не правильно делаю? Куда гуглить?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Я не знаю причину ошибки, но вижу ещё недоделки:
1. Цикл поиска значений фракталов нужно делать 1 раз в начале дня.
2. В переменных Mi0 и Mi1 скорее всего нули, т.к. там значения индюка для последнего бара
остальные значения в массиве М

SergeyNT Вы обращаетесь к 1 буферу индикатора. Т.к. нам неизвестно сколько буферов у индюка и какие у него входные параметры, то подсказать более детально не сможем...

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Там я так понял 2 буфера

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Lime
//---- input parameters
extern bool lines=true;
extern int step=500;
extern bool Dell=true;

//----buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,108);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,108);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
//----
ObjectsDeleteAll(0,OBJ_TEXT);
ObjectsDeleteAll(0,OBJ_ARROW);
ObjectsDeleteAll(0,OBJ_TREND);
//DelArrow(0,0);
return(0);

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Там я так понял 2 буфера

Сделайте так:
buf0=iCustom(Symbol(),Period(),"Bheurekso Pattern",lines,step,Dell,1,0);
buf1=iCustom(Symbol(),Period(),"Bheurekso Pattern",lines,step,Dell,1,1);
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Не работает. Возвращает 0.0.
По крайне мере в тесторе стратегий. Может в тесторе особенность есть?

Если и есть то только в Вашем. А что индюк выводит на экран (скрин дайте)?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
SergeyNT да-уж... хз что находится в буферах данного индюка. Буферов - 2 для зелёных и красных сигналов, а вот какие именно сигналы и как индюк их прописывает без кода сказать не возьмусь... имхо в буферах ценовые уровни сигналов должны быть. Вы в своей сове 0.0 получили на каком баре?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
SergeyNT Вы бы выложили свой вариант индикатора, тогда будет проще, а так, по части кода, что Вы предоставили, есть стрелки в буферах, а так же "стрелки" как объекты.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Посмотрел код индюка - в буферах ценовые уровни для точек, возникающие на следующей после сигнальной свече. Т.к. в качестве подтверждающей свечи берется 0-бар, то сигнал будет то появляться, то пропадать, пока 0-бар не закроется. Следовательно можно входить только на 2 баре от сигнального. Сейчас на фунте наблюдаю этот мерцающий сигнал на бай (М15 и на М30). При этом на М5 и H1 сигнала вообще нет.
Короче: запаздывание сигнала есть, но должно работать, т.е. сова этот сигнал должна получать...

Прикольно в индюке то, что в создателях индюка числится "Кривошеин Е.В.", а комменты кода - на индонезийском :d

Попробовал индюк на фунте - взял 50 пипс.

Изменено пользователем 0ll
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Прикрепил индюка.
Сигналы действительны только после закрытия свечи. Хотя например сигнал харами нужно ждать следующую свечу подтверждение, нужно знать особенности каждого сигнала.
Ещё пробовал перенести код индюка в советник, но у меня не получилось, хотя это возможно.

4X_Bheurekso_Pattern_indikatorforeks.ru.zip

Изменено пользователем SergeyNT
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...