0ll Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 htp87 у Вас в коде нет перебора ордеров. из-за ошибки здесь: for(int i = 0; ii--). измените на ++Согласен с dermitay - его ответ более развёрнутый и правильный. Изменено 19 декабря, 2015 пользователем 0ll 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Pioner_rus Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 Попробовал тут пару Явовских операторов - работают под MQL4, могут иногда облегчить жизнь :)1) Х = (условие) ? выражение1 : выражение2; условный оператор присваивания, хорошая замена оператору IF, когда надо только присвоить значение переменной, экономит запись и меньше фигурных скобок, которые здорово путают.2) Цикл с проверкой в концеdo{ ... .... какие то операторы}while(условие);полезно, когда цикл должен выполниться по крайней мере 1 раз, не зависимо от условия.Буду рад, если кому-то пригодится 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 думаю лучше пользоваться официальной документацией...?: и do-while 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 да-да помню этот чит-код на Яве, иногда без него код становится гораздо тяжелее.не знал что на mql4 тоже так можно)) спасибо! Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 я может задам такой глупый вопрос...а у тебя компилятор не ругается что ты вызываешь процедуру PriceCloseLastPos() без перечисления входных параметров?если нет - то у тебя при исполнении первой итерации используются значения, которые ты указал в явном виде при описании процедуры в самом заголовке double PriceCloseLastPos(string sy="", int op=-1, int mn=-1), и цикл у тебя не проходит даже первую итерацию, t у тебя вобще не инициализировано. разве нет?а вобще поюзай вот эту статейку, работает и на нашем mql4. я лично особо не вижу критической какой-то ошибки в коде. вроде всё корректно.http://www.metatrader5.com/ru/metaeditor/help/development/debug Изменено 19 декабря, 2015 пользователем dermitay Ссылка на сообщение Поделиться на другие сайты More sharing options...
forextime Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 Не ругается))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)) Изменено 20 декабря, 2015 пользователем forextime Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 юзай отладчик, в каждой строчке понакидай точек останова и увидишь где у тебя вылет и по какому условию, делов-то на одну минуту :d Ссылка на сообщение Поделиться на другие сайты More sharing options...
forextime Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 юзай отладчик, в каждой строчке понакидай точек останова и увидишь где у тебя вылет и по какому условию, делов-то на одну минуту :d Круто, а это как?? стесняюсь спросить)) Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 я же ссылку выше кинулhttp://www.metatrader5.com/ru/metaeditor/help/development/debugа вобще если у тебя в условии сравнения работает толкьо при >= а при Ссылка на сообщение Поделиться на другие сайты More sharing options...
forextime Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 я же ссылку выше кинул Спасибо, поюзаю. Добавлено: 20-12-2015 16:19:16Хм, точка остановки на нужном месте, процесс запускаю, окно графика запускается и далее ни чего не происходит, график не движется. Изменено 20 декабря, 2015 пользователем forextime Ссылка на сообщение Поделиться на другие сайты More sharing options...
Qj Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 Может мне тут кто-нибудь объяснить когда тернарный оператор стал явовским как и циклы с постусловием? 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Konstebl Опубликовано 20 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 декабря, 2015 Добрый вечер! В пятом уроке простой трейлинг не тестируется. Вроде все правильно прописываю, ошибок не выдает при компилировании. Посмотрите код, плиз.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); Ссылка на сообщение Поделиться на другие сайты More sharing options...
Pioner_rus Опубликовано 20 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 декабря, 2015 Ну я на Яве программировал и там встречал, а так бог его знает откуда он первоначально пришёл :) Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 20 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 декабря, 2015 такая же фигня(я про тернарный 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 в примерах используется перегрузка метода, что новичку не сразу станет понятно почему так оно работает. Изменено 20 декабря, 2015 пользователем dermitay 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
htp87 Опубликовано 20 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 декабря, 2015 Всем большое спасибо за помощь, буду искать ошибку в трейлинге, он не срабатывает.Подскажите пожалуйста, функция времени, которая в 5-ом уроке описывается, при компилировании выдает предупреждение:if(timeprev == Time[0]) return(0);timeprev = Time[0];Что здесь можно изменить?? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Antoha88 Опубликовано 20 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 декабря, 2015 Приветствую, товарищи! Помогите разобраться с проблемой (для меня:)) - на графике не отображается Comment. В этом уголке должно чтото писатся - а там нет ничего, если заменять Comment на Print то в журнале идут записи по тикам. Я даже отдельный советник просто создал под комент (с одной командой лишь) и советник из книжки скачал comment.mq4 - перетаскиваю на график и НичегО. В чем может быть проблема? Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 20 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 декабря, 2015 Приветствую, товарищи! Помогите разобраться с проблемой (для меня:)) - на графике не отображается Comment. В этом уголке должно чтото писатся - а там нет ничего, если заменять Comment на Print то в журнале идут записи по тикам. Я даже отдельный советник просто создал под комент (с одной командой лишь) и советник из книжки скачал comment.mq4 - перетаскиваю на график и НичегО. В чем может быть проблема? ты сам ответил на свой вопрос. пока рынок закрыт OnTick() не производит ни единую итерацию.Либо если ты хочешь проверить тупо эту функцию - юзай ее в OnCalculate индикатора или в OnInit() совы или вобще в скрипте(не помню какой там блок выполняется всегда.)гугли связку EventSetSecondTimer и OnTimer() чтобы вобще зыбыть о тиках и не зависеть то рынка.Comment("я на графике");Print("я в логах "); Изменено 20 декабря, 2015 пользователем dermitay Ссылка на сообщение Поделиться на другие сайты More sharing options...
Antoha88 Опубликовано 20 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 декабря, 2015 Спасибо за ответ, понял из него что дело в рынке которого на сей момент нет. С остальным ща буду гуглить Ссылка на сообщение Поделиться на другие сайты More sharing options...
forextime Опубликовано 20 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 декабря, 2015 Это в тестере или на демке? Про что выходной помните? :) 1-ый раз с этим столкнулся, отладка в выходные не работает что ли?Что значит "Это в тестере или на демке?"Работает MT4, MetaEditor там отладка, точки расставлены процесс запущен. Как по другому? Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 20 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 декабря, 2015 если у тебя точки останова в OnTick'e то конечно же дебагер даже не дойдет до них - рынок-то закрыт. модификации ордеров конечно же тоже не будет.дело не в выходных а в понимании того как работает фундаментально код. можно писать так, чтобы вобще никакой зависимости от тиков брокера не было.кстати, дебагер работает и на истории котировок, типа эмулируя тестер стратегий. Изменено 20 декабря, 2015 пользователем dermitay 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
forextime Опубликовано 22 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 декабря, 2015 ВОПРОС РЕШЁНТЕМА ЗАКРЫТАВ АРХИВ или КОРЗИНУ Ссылка на сообщение Поделиться на другие сайты More sharing options...
Старик Опубликовано 22 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 декабря, 2015 forextime, так в чем была ошибка/некорректность?Народ же сходу не понял и, видимо, было бы полезно понять что было не так и как было выявлено что. Ссылка на сообщение Поделиться на другие сайты More sharing options...
forextime Опубликовано 22 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 декабря, 2015 forextime, так в чем была ошибка/некорректность?Народ же сходу не понял и, видимо, было бы полезно понять что было не так и как было выявлено что. Действительно. Ok))Посмотрел в сети разного типа коды и пришёл к выводу что в условие кода Игоря Кима почему то нет ==trueif (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 Изменено 22 декабря, 2015 пользователем forextime 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 22 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 22 декабря, 2015 Теперь заметил, что при переходе на новые сутки цена закрытия последнего ордера теряется и идёт закрытие серии ордеров без учёта дистанции от прошлой цены закрытия последнего ордера, заметил это только для ордеров бай.Наглядно можно посмотреть (это не реклама, надеюсь ругаться не будут)_youtu.be/TC9HSRsjMTA OrderSelect() в режиме MODE_HISTORY "видит" только те ордера, которые ему показывает терминал. Если ты в терминале выставил историю только на "сегодня", то вчерашний ордер у тебя просто тупо не будет показываться и соответственно не будет видеться совой.если моя догадка верна, выстави в истории ордеров "вся история" ну или там последняя неделя или три дня и тогда избавишься от этой ошибки. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
forextime Опубликовано 23 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 декабря, 2015 Если моя догадка верна, выстави в истории ордеров "вся история" ну или там последняя неделя или три дня и тогда избавишься от этой ошибки. В терминале настройки я могу поставить значения только на максимальные бары в истории или максимальные бары в окне. Или есть ещё какой то способ указать всю историю? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти