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

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


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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
htp87 у Вас в коде нет перебора ордеров. из-за ошибки здесь: for(int i = 0; ii--). измените на ++

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Попробовал тут пару Явовских операторов - работают под MQL4, могут иногда облегчить жизнь :)

1) Х = (условие) ? выражение1 : выражение2; условный оператор присваивания, хорошая замена оператору IF, когда надо только присвоить значение переменной, экономит запись и меньше фигурных скобок, которые здорово путают.

2) Цикл с проверкой в конце
do{
...
.... какие то операторы
}while(условие);
полезно, когда цикл должен выполниться по крайней мере 1 раз, не зависимо от условия.



Буду рад, если кому-то пригодится

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

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

да-да помню этот чит-код на Яве, иногда без него код становится гораздо тяжелее.
не знал что на mql4 тоже так можно)) спасибо!

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

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

я может задам такой глупый вопрос...
а у тебя компилятор не ругается что ты вызываешь процедуру PriceCloseLastPos() без перечисления входных параметров?
если нет - то у тебя при исполнении первой итерации используются значения, которые ты указал в явном виде при описании процедуры в самом заголовке double PriceCloseLastPos(string sy="", int op=-1, int mn=-1), и цикл у тебя не проходит даже первую итерацию, t у тебя вобще не инициализировано.

разве нет?

а вобще поюзай вот эту статейку, работает и на нашем mql4. я лично особо не вижу критической какой-то ошибки в коде. вроде всё корректно.
http://www.metatrader5.com/ru/metaeditor/help/development/debug

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

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

Не ругается))
datetime t;
int i;
я вынес,
а вот PriceCloseLastPos(string sy="", int op=-1, int mn=-1) оставил без изменений,
только добавил: if (mn==-1) mn=magic;
Это чистый код Игоря Кима.
Попробовал написать по хитрому для закрытия серии и работает только если больше-равно, а мне надо MathAbs((PriceCloseLastPos()-distPp*Point)>=(Bid+distPp*Point))

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

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

юзай отладчик, в каждой строчке понакидай точек останова и увидишь где у тебя вылет и по какому условию, делов-то на одну минуту :d

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

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


юзай отладчик, в каждой строчке понакидай точек останова и увидишь где у тебя вылет и по какому условию, делов-то на одну минуту :d



Круто, а это как?? стесняюсь спросить))
Ссылка на сообщение
Поделиться на другие сайты

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

я же ссылку выше кинул
http://www.metatrader5.com/ru/metaeditor/help/development/debug

а вобще если у тебя в условии сравнения работает толкьо при >= а при

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

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


я же ссылку выше кинул


Спасибо, поюзаю.


Добавлено: 20-12-2015 16:19:16

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

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

Может мне тут кто-нибудь объяснить когда тернарный оператор стал явовским как и циклы с постусловием?

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

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


Добрый вечер! В пятом уроке простой трейлинг не тестируется. Вроде все правильно прописываю, ошибок не выдает при компилировании. Посмотрите код, плиз.
void OnTick()
{
Trailing ();

maprice = iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);

if(CountBuy() + CountSell() == 0 && Ask > maprice)
{
int ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
if(ticket Print("Не удалось открыть ордер на покупку!");
}
if(CountBuy() + CountSell() == 0 && Bid {
int ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red);
if(ticket Print("Не удалось открыть ордер на продажу!");
}

}
//+------------------------------------------------------------------+
void Trailing()
{
for(int i = 0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
if(Bid - OrderOpenPrice() > TrailingStop*Point)
{
if(OrderStopLoss() {
SL = NormalizeDouble(Bid - TrailingStop*Point,Digits);
if(OrderStopLoss() != SL)
int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
Print ("Ордер успешно изменился!");
}
}
}
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
{
if(OrderOpenPrice()- Ask > TrailingStop*Point)
{
if(OrderStopLoss() {
SL = NormalizeDouble(Ask + TrailingStop*Point,Digits);
if(OrderStopLoss() != SL)
int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
Print ("Ордер успешно изменился!");
}
}
}
}
}

}



OrderModify() возвращает значение типа bool.
Т.е
bool ticket = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);
Ссылка на сообщение
Поделиться на другие сайты

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

такая же фигня(я про тернарный return), я о нем впервые услышал на Яве, не спорю, он мог придти из того же С или С++.

Пример решения. который когда-то разорвал мне мозг своей простотой:
поиск максимального числа из двух чисел

int max(int a,int b)
{
return (a>b)?a:b;
}

а теперь поехали дальше(из трех и четырех используя ф-цию выше)
int Max3(int a,int b, int c)
{
return max(max(a,b),max(b,c)) ;
}

int Max4(int a,int b, int c, int d)
{
return max(max(a,b),max(c,d));
}

гениально, не правда ли?)) и не надо тебе никаких кучи ифов и т.д.

ЗЫ: в официальной документации mql4 в примерах используется перегрузка метода, что новичку не сразу станет понятно почему так оно работает.

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

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

Всем большое спасибо за помощь, буду искать ошибку в трейлинге, он не срабатывает.
Подскажите пожалуйста, функция времени, которая в 5-ом уроке описывается, при компилировании выдает предупреждение:
if(timeprev == Time[0]) return(0);
timeprev = Time[0];

Что здесь можно изменить??

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

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

Приветствую, товарищи! Помогите разобраться с проблемой (для меня:)) - на графике не отображается Comment. В этом уголке должно чтото писатся - а там нет ничего, если заменять Comment на Print то в журнале идут записи по тикам. Я даже отдельный советник просто создал под комент (с одной командой лишь) и советник из книжки скачал comment.mq4 - перетаскиваю на график и НичегО. В чем может быть проблема?

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

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


Приветствую, товарищи! Помогите разобраться с проблемой (для меня:)) - на графике не отображается Comment. В этом уголке должно чтото писатся - а там нет ничего, если заменять Comment на Print то в журнале идут записи по тикам. Я даже отдельный советник просто создал под комент (с одной командой лишь) и советник из книжки скачал comment.mq4 - перетаскиваю на график и НичегО. В чем может быть проблема?



ты сам ответил на свой вопрос. пока рынок закрыт OnTick() не производит ни единую итерацию.
Либо если ты хочешь проверить тупо эту функцию - юзай ее в OnCalculate индикатора или в OnInit() совы или вобще в скрипте(не помню какой там блок выполняется всегда.)
гугли связку EventSetSecondTimer и OnTimer() чтобы вобще зыбыть о тиках и не зависеть то рынка.

Comment("я на графике");
Print("я в логах "); Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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


Это в тестере или на демке? Про что выходной помните? :)



1-ый раз с этим столкнулся, отладка в выходные не работает что ли?
Что значит "Это в тестере или на демке?"
Работает MT4, MetaEditor там отладка, точки расставлены процесс запущен. Как по другому?
Ссылка на сообщение
Поделиться на другие сайты

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

если у тебя точки останова в OnTick'e то конечно же дебагер даже не дойдет до них - рынок-то закрыт. модификации ордеров конечно же тоже не будет.

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

кстати, дебагер работает и на истории котировок, типа эмулируя тестер стратегий.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
forextime, так в чем была ошибка/некорректность?
Народ же сходу не понял и, видимо, было бы полезно понять что было не так и как было выявлено что.
Ссылка на сообщение
Поделиться на другие сайты

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


forextime, так в чем была ошибка/некорректность?
Народ же сходу не понял и, видимо, было бы полезно понять что было не так и как было выявлено что.



Действительно. Ok))
Посмотрел в сети разного типа коды и пришёл к выводу что в условие кода Игоря Кима почему то нет ==true
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) ==true) {
Добавил и вроде цена закрытия стала определяться корректно.
Логику дистанции я додумал с помощью листочка, ручки и линейки: на листочке отметил точку закрытия, на линейке отметил текущую цену + дистанция, ну и пришёл к выводу что PriceClose - dist для селл и PriceClose + dist для бай, а Ask и Bid в свободном полёте. Без помощи воображения так бы и не понял, что больше чего должно быть))
Добавил эти условия и всё стало в порядке:
MathAbs(PriceCloseLastPos(Symbol(),-1,magic)-distPpS*PointBid) // для селл ордеров (серия закрывается до значения дистанции, если превышает значение, то закрытия нет)
MathAbs(PriceCloseLastPos(Symbol(),-1,magic)+distPpB*Point>=Ask) // для бай ордеров (серия закрывается до значения дистанции, если превышает значение, то закрытия нет)
Теперь заметил, что при переходе на новые сутки цена закрытия последнего ордера теряется и идёт закрытие серии ордеров без учёта дистанции от прошлой цены закрытия последнего ордера, заметил это только для ордеров бай.
Наглядно можно посмотреть (это не реклама, надеюсь ругаться не будут)_youtu.be/TC9HSRsjMTA
Изменено пользователем forextime
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


Теперь заметил, что при переходе на новые сутки цена закрытия последнего ордера теряется и идёт закрытие серии ордеров без учёта дистанции от прошлой цены закрытия последнего ордера, заметил это только для ордеров бай.
Наглядно можно посмотреть (это не реклама, надеюсь ругаться не будут)_youtu.be/TC9HSRsjMTA



OrderSelect() в режиме MODE_HISTORY "видит" только те ордера, которые ему показывает терминал. Если ты в терминале выставил историю только на "сегодня", то вчерашний ордер у тебя просто тупо не будет показываться и соответственно не будет видеться совой.

если моя догадка верна, выстави в истории ордеров "вся история" ну или там последняя неделя или три дня и тогда избавишься от этой ошибки.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


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


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

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

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

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

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

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

Войти

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

Войти

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


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

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