Ваши вопросы по языку MQL4

Ugar

Гуру форума
Да, кстати я так и не понял почему вместо <= надо= ? есть какая-та практическая разница ?
1. Не вместо <= надо=, а вместо <= надо <
2. Да, есть принципиальная разница между "больше или равно" и "больше".
Еще вопрос если можно: как реализовать мультиТФ, чтобы допустим по Хай и Лоу выставились ордера на D1 , H4 , H1 ?? подскажи, что нужно сделать, я сам попробую.
У iLow и iHigh второй аргумент это тайм фрейм. Посмотри в справочнике как правильно указать.
 

gzh

Интересующийся
Я всегда пишу <=OrdersTotal(). А в каких случаях нужно писать <OrdersTotal() ? или на этот вопрос нет точного ответа?

Я пробовал вот так сделать. не получается!
extern int work_TF = 60;
extern int work_TF2 = 240;
extern int work_TF3 = 1440

if (iClose (Symbol(), Work_TF, 1) > iOpen (Symbol(), Work_TF, 1))
{
OrderSend (Symbol(), 0, lot, Ask, slippage, Ask-sl*Point, Ask+tp*Point, 0, magic);
}
if (iClose (Symbol(), Work_TF2, 1) > iOpen (Symbol(), Work_TF2, 1))
{
OrderSend (Symbol(), 0, lot, Ask, slippage, Ask-sl*Point, Ask+tp*Point, 0, magic);
}
if (iClose (Symbol(), Work_TF3, 1) > iOpen (Symbol(), Work_TF3, 1))
{
OrderSend (Symbol(), 0, lot, Ask, slippage, Ask-sl*Point, Ask+tp*Point, 0, magic);
}
как еще можно попробовать ?
 

Aghasim

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

Алекc1234

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

Ugar

Гуру форума
Я всегда пишу <=OrdersTotal(). А в каких случаях нужно писать <OrdersTotal() ? или на этот вопрос нет точного ответа?
Есть точный ответ. Во всех случаях когда перебор идёт от первого к последнему.
К примеру открыто 2 ордера. OrdersTotal() возвращает 2. Ордера считаются от №0 до №1. Ордера №2 нет. То есть, когда <=OrdersTotal() будут выбираться 3 ордера №0, №1, №2, при том последний не существует. Зачем выбирать несуществующий ордер?
Когда <OrdersTotal() выбираются только 2 ордера №0, №1.
 

Алекc1234

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

Выяснил, что когда зависает сов, то во вкладке эксперты пишется ошибка 128. Что это означает? Что истёк срок ожидания? Как это понять? И как можно от этого избавиться?
 

Ugar

Гуру форума
Выяснил, что когда зависает сов, то во вкладке эксперты пишется ошибка 128. Что это означает? Что истёк срок ожидания? Как это понять? И как можно от этого избавиться?
Когда советник спит Sleep() свойства эксперта не открываются.
128 обычно при плохой связи бывает. После этой ошибки рекомендуется выдержать паузу 1 минуту. Проще всего паузу реализовать усыпив советник.
 

Алекc1234

Местный житель
Когда советник спит Sleep() свойства эксперта не открываются.
128 обычно при плохой связи бывает. После этой ошибки рекомендуется выдержать паузу 1 минуту. Проще всего паузу реализовать усыпив советник.

В том-то и дело, что связь у меня отличная! На других терминалах немного по другому устроенные совы работают. А как сов усыпить? Можно отдельный код, я его вставлю в свой сов...
 

Ugar

Гуру форума
В том-то и дело, что связь у меня отличная! На других терминалах немного по другому устроенные совы работают. А как сов усыпить? Можно отдельный код, я его вставлю в свой сов...
Приказ на сервер ДЦ ушёл, ответ от сервера не пришёл - ошибка 128.
Связь отличная где? Терминал с сервером связан через кучу разных серверов и маршрутизаторов. Кроме того, возможно сознительное игнорирование сервером приказов с терминала, например по причине бана.

Функция сна есть в справочнике
void Sleep( int milliseconds)
Функция задерживает выполнение текущего эксперта или скрипта на определенный интервал.
Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются help://runtime_start в интерфейсном потоке и не должны его тормозить.
В функцию встроена проверка help://check_IsStopped состояния флага остановки эксперта каждую 0.1 секунды. Параметры:
milliseconds - Интервал задержки в миллисекундах. Пример:
//---- wait for 10 seconds
Sleep(10000);
 
Последнее редактирование модератором:

Leonup

Новичок форума
Вывод стрелок из индикатора

Здравствуйте!
На основе индикатора FX5 MACD_Divergence V1.1 пытаюсь написать советник. Мне нужно получить признак появления красной и зеленой стрелок.

Стрелка вверх (зеленая):

double up_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", fastEMA, slowEMA, signalSMA, 0, 0, 1);

где предпоследний параметр – 0 – номер буфера с кодом стрелки 233.

Стрелка вниз (красная):

double dn_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", fastEMA, slowEMA, signalSMA, 0, 1, 1);

где предпоследний параметр – 1 – номер буфера с кодом стрелки 234.

Вроде бы все верно, но советник не хочет работать, в журнале (с помощью команды Print) выводятся сообщения: Стрелка вверх 2147483647, Стрелка вниз 2147483647.

Что я делаю не так?
Спасибо.
 

Вложения

Ugar

Гуру форума
Здравствуйте!
На основе индикатора FX5 MACD_Divergence V1.1 пытаюсь написать советник. Мне нужно получить признак появления красной и зеленой стрелок.

Стрелка вверх (зеленая):

double up_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", fastEMA, slowEMA, signalSMA, 0, 0, 1);

где предпоследний параметр – 0 – номер буфера с кодом стрелки 233.

Стрелка вниз (красная):

double dn_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", fastEMA, slowEMA, signalSMA, 0, 1, 1);

где предпоследний параметр – 1 – номер буфера с кодом стрелки 234.

Вроде бы все верно, но советник не хочет работать, в журнале (с помощью команды Print) выводятся сообщения: Стрелка вверх 2147483647, Стрелка вниз 2147483647.

Что я делаю не так?
Спасибо.
Всё правильно. Это пустое значение EMPTY_VALUE. Означает что там нет стрелки.
 

Leonup

Новичок форума
Всё правильно. Это пустое значение EMPTY_VALUE. Означает что там нет стрелки.

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

AlexeyVik

Программист mql4 mql5
То, что это означает, что в данном месте нет стрелки, это мне было понятно. Но в тестере стратегий эти сообщения выводятся в течение всего периода (год). И поэтому советник не может открывать сделки.
В чем может быть причина?
Проверь на каком баре появляется стрелка. На втором или третьем, но не на первом.
 

Leonup

Новичок форума
Проверь на каком баре появляется стрелка. На втором или третьем, но не на первом.

Где и как это проверить? Исходя из строки кода, стрелки должны появляться на втором баре (но их нет!):

double up_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", fastEMA, slowEMA, signalSMA, 0, 0, 1);

последний параметр – 1.

Может, я что-то не понял...
 

AlexeyVik

Программист mql4 mql5
Где и как это проверить? Исходя из строки кода, стрелки должны появляться на втором баре (но их нет!):

double up_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", fastEMA, slowEMA, signalSMA, 0, 0, 1);

последний параметр – 1.

Может, я что-то не понял...
А ты ищешь на первом.
Я тоже не понял...
В индикаторе 8 входящих параметров, а у тебя только 4.
 

Leonup

Новичок форума
А ты ищешь на первом.
Я тоже не понял...
В индикаторе 8 входящих параметров, а у тебя только 4.

В индикаторе входящих параметров, относящихся к MACD, всего 3:
extern int fastEMA = 12;
extern int slowEMA = 26;
extern int signalSMA = 9;

А я еще ЗАЧЕМ-ТО добавил еще 4-й: applied_price – 0.
Теперь я вижу, что неправильно.

И нужно добавить 3 оставшихся:
extern bool drawIndicatorTrendLines = true;
extern bool drawPriceTrendLines = true;
extern bool displayAlert = true;

А еще 2 входящих:
extern string separator1 = "*** MACD Settings ***";
extern string separator2 = "*** Indicator Settings ***";

их, наверно, включать не надо. Они описательные.

Теперь это выглядит так:

double up_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", fastEMA, slowEMA, signalSMA, drawIndicatorTrendLines, drawPriceTrendLines, displayAlert, 0, 1);

double dn_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", fastEMA, slowEMA, signalSMA, drawIndicatorTrendLines, drawPriceTrendLines, displayAlert, 1, 1);

Но ситуация абсолютно не изменилась. Все также в журнале (с помощью команды Print) выводятся сообщения: Стрелка вверх 2147483647, Стрелка вниз 2147483647.

Теперь о барах. Почему вы считаете, что я ищу на первом? Ведь 1 – последний параметр кода – означает предпоследний бар. У первого, текущего, бара индекс равен 0. Разве не так?
 

AlexeyVik

Программист mql4 mql5
их, наверно, включать не надо. Они описательные.
Не смотря на это их надо вписывать, хотя-бы как пустую строку "". Правильно будет так:
double up_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", "", fastEMA, slowEMA, signalSMA, "", drawIndicatorTrendLines, drawPriceTrendLines, displayAlert, 0, 1);
Теперь о барах. Почему вы считаете, что я ищу на первом? Ведь 1 – последний параметр кода – означает предпоследний бар. У первого, текущего, бара индекс равен 0. Разве не так?
Так, только текущий бар это не первый. А стрелка может появляться на втором или даже третьем баре. Проверять мне лениво, да и не запускаю я тестер на этом компе.
 

Leonup

Новичок форума
Не смотря на это их надо вписывать, хотя-бы как пустую строку "". Правильно будет так:
double up_sig = iCustom(Symbol(), 0, "FX5 MACD_Divergence V1.1", "", fastEMA, slowEMA, signalSMA, "", drawIndicatorTrendLines, drawPriceTrendLines, displayAlert, 0, 1);

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

Теперь сделал все, как положено, спасибо вам.
Но в журнале (с помощью команды Print) все также выводятся сообщения: Стрелка вверх 2147483647, Стрелка вниз 2147483647.

А как проверить, на каком баре появляется стрелка? Включить в тестере визуализацию, затем подключить индикатор и визуально отслеживать? Или как-то по-другому, через журнал? А как тогда это сделать?
 

AlexeyVik

Программист mql4 mql5
Теперь сделал все, как положено, спасибо вам.
Но в журнале (с помощью команды Print) все также выводятся сообщения: Стрелка вверх 2147483647, Стрелка вниз 2147483647.

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

Алекc1234

Местный житель
Подскажите, пожалуйста, как написать в коде: "если ордер не модифицировался, то..." Есть код с модификацией отложенных ордеров OrderModify(OrderTicket().......
Хочется, чтоб было дальше, что если не произошла модификация, то.....
 
Верх