dermitay Опубликовано 13 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 июля, 2016 Foxonnгипотетически блок "else" будет выполнятся в 99% случаев в рынке. и принты будут засорять лог. это не ошибка открытия оредра, это просто принты.if (CountSell() == 0 && CountBuy() == 0 && oOpen { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red); }else Print("Ошибка открытия ордера на продажу");сам подумай. если открыт хотя бы один ордер, или не будет выполнятся oOpen попробуй принт занести в скобки выше и вставить условие if (ticket if (CountSell() == 0 && CountBuy() == 0 && oOpen { ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red); if (ticket } 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Silentspec Опубликовано 13 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 июля, 2016 или простоif (CountSell() == 0 && CountBuy() == 0 && oOpen { if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red)) Print("Ошибка открытия ордера на продажу"); } 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 13 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 июля, 2016 или простоif (CountSell() == 0 && CountBuy() == 0 && oOpen { if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red)) Print("Ошибка открытия ордера на продажу"); } у меня иногда такой подход глючит, так как ордерсенд возвращает по факту-то интовую величину, а в ифе смотрится булевое значение. без тикета лучше уж тогда вот такif(OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red) 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Foxonn Опубликовано 13 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 13 июля, 2016 Спойлер или простоif (CountSell() == 0 && CountBuy() == 0 && oOpen { if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red)) Print("Ошибка открытия ордера на продажу"); } у меня иногда такой подход глючит, так как ордерсенд возвращает по факту-то интовую величину, а в ифе смотрится булевое значение. без тикета лучше уж тогда вот такif(OrderSend(Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, 5, Magic, 0, Red) Спасибо за помощь dermitay и Silentspec. Теперь такой вопрос, почему не открываются ордера? или для открытие ордера по БО нужен другой подход? в терминале от Альпари ордера открываются, а в терминале от Гранд Капитал нет :-? Изменено 14 июля, 2016 пользователем Foxonn Ссылка на сообщение Поделиться на другие сайты More sharing options...
mischkus Опубликовано 14 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 июля, 2016 Уважаемые форумчане,столкнулся с небольшой проблемой: в учебнике по программированию MQL4 написаны все ценовые константы технического индикатора Moving Average (iMA), кроме Previous Indicator`s Data, которая есть в стандартном наборе к индикатору в МТ4. Это решаемо или надо заказывать? Ссылка на сообщение Поделиться на другие сайты More sharing options...
afert Опубликовано 14 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 июля, 2016 Подскажите пожалуйста, как прописать условие для закрытия ордера при входе отложенного ордера в позицию другого направления. Есть такой модуль закрытия по обратному сигналу. if (M11 = M22) я так понимаю надо здесь поправить { for (i=OrdersTotal()-1;i>=0;i--) { RefreshRates(); if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true) a = 0; if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) { RefreshRates(); if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true) a = 0; c = OrderClose(OrderTicket(), OrderLots(), Bid, Slipp, Yellow); ii = 0; while (c == false && OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true) { ii++; Print("Error =",GetLastError()); Sleep(sec); RefreshRates(); if(OrderSelect (i, SELECT_BY_POS, MODE_TRADES) == true) a = 0; c = OrderClose(OrderTicket(), OrderLots(), Bid, Slipp, Yellow); } } } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Silentspec Опубликовано 14 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 14 июля, 2016 А что такое a = 0?Это зачем?И ii тоже что за счетчик? Ссылка на сообщение Поделиться на другие сайты More sharing options...
afert Опубликовано 15 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 июля, 2016 Я если честно пока в программировании дилетант, но хочется понять механизм программирования путём разбирательства. На ваши вопросы попытаюсь ответить как я понимаю, a и ii это заданные переменные, а=0 не могу разобраться для чего, а ii я так понимаю счётчик ордеров при true ii=0, при false ii++ Добавлено: 15-07-2016 08:36:23нашёл другое решение по закрытию, но если кто даст совет буду благодарен. Изменено 15 июля, 2016 пользователем afert Ссылка на сообщение Поделиться на другие сайты More sharing options...
Silentspec Опубликовано 15 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 июля, 2016 Цитата как прописать условие для закрытия ордера при входе отложенного ордера в позицию другого направления. Не совсем понял ситуацию. То есть у тебя висит рыночный ордер например в селл, но когда зацепляет отложку и появляется рыночный ордер бай, селл надо закрыть. Верно? Ссылка на сообщение Поделиться на другие сайты More sharing options...
mischkus Опубликовано 15 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 июля, 2016 Этот же вопрос и у меня. По встречному сигналу сетка ордеров на селл должна закрыться без усреднения, а все сразу, и открыться встречная сетка на покупку. Ссылка на сообщение Поделиться на другие сайты More sharing options...
afert Опубликовано 15 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 июля, 2016 Silentspec вы всё верно поняли Ссылка на сообщение Поделиться на другие сайты More sharing options...
Svarog_AZh Опубликовано 17 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 июля, 2016 Помогите написать код, реализующий следующее условие: если ордер находиться в рынке (не важно Buy или Sell) больше 3-х торговых дней, то закрыть.Заранее благодарю. Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 17 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 июля, 2016 Помогите написать код, реализующий следующее условие: если ордер находиться в рынке (не важно Buy или Sell) больше 3-х торговых дней, то закрыть.Заранее благодарю. смотришь на цену открытия ордера, если (текущее время - время открытия ордера)/3600 > 24*3 то закрывай ордер. Ссылка на сообщение Поделиться на другие сайты More sharing options...
schurik_1 Опубликовано 19 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 июля, 2016 Какая разница между включаемый файл и библиотека функций? И что лучше использовать для создания своей библиотеки функций? Изменено 19 июля, 2016 пользователем schurik_1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
chebdenis Опубликовано 23 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 23 июля, 2016 Приветствую! А может для MQL5 сделать новую ветку? А то тут все перемешается и будет очень неудобно и тем кто MQL4 изучает и тем кто MQL5. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Danilov Max Опубликовано 24 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 июля, 2016 Добрый день! Подскажите, пожалуйста, как правильно открывать сразу 2-а ордера? Проблема в том, что в тестере все срабатывает, а на реальном счете иногда один открывается иногда два (редко). Счет на альфа-форексе. if (Bid >= PriceHigh && PriceRsi >= 70 && CountBuy1() == 0 && CountSell1() == 0&& CountBuy2() == 0 && CountSell2() == 0) { SL = NormalizeDouble (Bid + StopLoss * Point, Digits); TP = NormalizeDouble (Bid - TakeProfit * Point, Digits); ticet = OrderSend (Symbol(), OP_SELL, Lots1, Bid, 10, 0, 0, NULL, Magic1, 0, Red); ticet = OrderSend (Symbol(), OP_SELL, Lots2, Bid, 10, 0, 0, NULL, Magic2, 0, Red); if (ticet > 0) { if (OrderSelect(ticet, SELECT_BY_TICKET, MODE_TRADES) == true) { bool modify = OrderModify(ticet, OrderOpenPrice(), SL, TP, 0); } } } if (Ask { SL = NormalizeDouble (Ask - StopLoss * Point, Digits); TP = NormalizeDouble (Ask + TakeProfit * Point, Digits); ticet = OrderSend (Symbol(), OP_BUY, Lots1, Ask, 10, 0, 0, NULL, Magic1, 0, Blue); ticet = OrderSend (Symbol(), OP_BUY, Lots2, Ask, 10, 0, 0, NULL, Magic2, 0, Blue); if (ticet > 0) { if (OrderSelect(ticet, SELECT_BY_TICKET, MODE_TRADES) == true) bool modify = OrderModify(ticet, OrderOpenPrice(), SL, TP, 0); } Ссылка на сообщение Поделиться на другие сайты More sharing options...
airseller Опубликовано 24 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 24 июля, 2016 Здравствуйте. Подскажите, возможно такое реализовать средствами MQL4?В сделке всегда один ордер с тейком и стопом (ордера выставляет советник на основе сигналов индикаторов). Если ордер закрывается по стопу, то новый ордер открывается с объемом в два раза больше предыдущего ордера (увеличение объема происходит до тех пор, пока текущий ордер не закроется по тейк профиту) - то есть присутствует классический мартингейл.Например, в настройках указано открывать ордера объемом 0,01 лота. Первый ордер открылся с объемом 0,01 лота. В случае получения стопа следующий ордер открывается объемом 0,02, снова стоп лосс, значит следующий ордер открывается объемом 0,04 лота, потом 0,08 и так далее до бесконечности.Если после череды стоп лоссов удалось закрыться по тейк профиту, то следующий, после профитной сделки ордер открывается снова объемом 0,01 лота (как указано в настройках для ордеров).Как этот алгоритм может выглядеть в виде кода? Возможно мой вопрос не корректен, так как я не силен в написании советников, просто я описал то, что нужно реализовать и прошу подсказать, как это можно сделать, если такое вообще возможно. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Svarog_AZh Опубликовано 26 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 26 июля, 2016 Здравствуйте. Подскажите, возможно такое реализовать средствами MQL4?В сделке всегда один ордер с тейком и стопом (ордера выставляет советник на основе сигналов индикаторов). Если ордер закрывается по стопу, то новый ордер открывается с объемом в два раза больше предыдущего ордера (увеличение объема происходит до тех пор, пока текущий ордер не закроется по тейк профиту) - то есть присутствует классический мартингейл.Например, в настройках указано открывать ордера объемом 0,01 лота. Первый ордер открылся с объемом 0,01 лота. В случае получения стопа следующий ордер открывается объемом 0,02, снова стоп лосс, значит следующий ордер открывается объемом 0,04 лота, потом 0,08 и так далее до бесконечности.Если после череды стоп лоссов удалось закрыться по тейк профиту, то следующий, после профитной сделки ордер открывается снова объемом 0,01 лота (как указано в настройках для ордеров).Как этот алгоритм может выглядеть в виде кода? Возможно мой вопрос не корректен, так как я не силен в написании советников, просто я описал то, что нужно реализовать и прошу подсказать, как это можно сделать, если такое вообще возможно. На сайте, в разделе "Обучение" есть видео курс по программированию MQL4. Один из уроков как раз связан с написанием советника по мартину. Там ты найдёшь ответ на свой вопрос.Добавлено: 26-07-2016 19:51:07 Помогите написать код, реализующий следующее условие: если ордер находиться в рынке (не важно Buy или Sell) больше 3-х торговых дней, то закрыть.Заранее благодарю. смотришь на цену открытия ордера, если (текущее время - время открытия ордера)/3600 > 24*3 то закрывай ордер. Вот фрагмент кода:extern int StopDay = 3; // Кол-во дней, по истечение которых ордер закроется. for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if(OrderType() == OP_BUY && (TimeCurrent()-OrderOpenTime())/3600 > 24*StopDay) { if(OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red) == true) Print("Закрылся успешно!"); } } } }Так вот, код работает, но в расчёт идут календарные дни, а не торговые. При открытии в 01:00 понедельника ордер закрывается в 01:00 четверга, т.е. прошло 3 полных, торговых дня - всё нормально. Однако при открытии ордера в 01:00 четверга, закрытие происходит в 01:00 понедельника, т.е. проходит лишь 2 полных, торговых дня (или 4 календарных).Как сделать так, чтобы при открытии в 01:00 четверга закрытие произошло в 01:00 вторника, а не понедельника? Изменено 26 июля, 2016 пользователем Svarog_AZh 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
boovood Опубликовано 27 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 июля, 2016 Уважаемые программисты требуется помощь в том что б правильно написать советник, сам написал но он не работает так как надо.описание правильной работы:1 открываются ордера в противоположные стороны с тейкпрофитом и стоплосом2 ордера закрываются по тейку и или лосю3 тот ордер которые закрылся по лосю увеличивается в multipler разпосле того как убыточный ордер закрылся в плюс объём ордера возвращается к первоначальномупосле того как убыточный ордер закрылся по лосю объём ордера опять увеличивается в multipler разпомогите правильно написать, если напишите код пожалуста поясните в комментариях, желаю не просто получить советник а понять как его написать правильно.работа советника внезапно прекращается не могу понять почему помогите и исправьте кто умеетне сильно обижайтесь на меня всего 2 месяца программирую. Добавлено: 27-07-2016 08:45:55Огромное спасибо xNorDx помог довести советник до ума!opposittrans.mq4 Изменено 27 июля, 2016 пользователем boovood Ссылка на сообщение Поделиться на другие сайты More sharing options...
Скобарь Опубликовано 27 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 июля, 2016 Уважаемые специалисты вынесите пожалуйста в настройки индикатора "Стиль" линий.Заранее благодарен!!! Trendlines_Original__LA_.mq4 Изменено 27 июля, 2016 пользователем Скобарь 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
kaetosh Опубликовано 27 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 июля, 2016 Добрый день!Заинтересовала тема автоматической оптимизации советника во время его торговли в этой статье _https://www.mql5.com/ru/articles/1467 , однако воплотить в жизнь на своем советнике не получается. Предлагаю этот вопрос разобрать в одном из уроков по MQL. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Гость Sany2912 Опубликовано 27 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 июля, 2016 Доброго времени суток, пишу свой первый советник, подскажите пожалуйста как задать datetime expiration=0, // срок истечения ордера в функции OrderSend( для торговли в определенную сессию.Напишите кусок кода или прикрекпите какую нибудь сову с отложками, я дальше сам разберусь Ссылка на сообщение Поделиться на другие сайты More sharing options...
boovood Опубликовано 27 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 27 июля, 2016 у меня возник вопрос при написании советника: -как при не открытии ордера из серии ордеров открыть не открытый ордер ещё раз.я понимаю что есть в этом языке метка как в бейсике строка на которую можно вернуться если не открылся ордер, но как это реализовать не знаю. подскажите кто знаетздесь как я думаю надо поставить меткуticket=OrderSend(Symbol(),OP_SELL, Lots_sell, Bid,Slippage,SL,TP,"oposit",Magic,0,Red); if(ticket {Print("Не удалось открыть ордер на продажу"); а здесь как я думаю надо написать переход к метке } Ссылка на сообщение Поделиться на другие сайты More sharing options...
Arius777 Опубликовано 28 июля, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 28 июля, 2016 у меня возник вопрос при написании советника: -как при не открытии ордера из серии ордеров открыть не открытый ордер ещё раз.я понимаю что есть в этом языке метка как в бейсике строка на которую можно вернуться если не открылся ордер, но как это реализовать не знаю. подскажите кто знает вообще, методов много - любой советник нормальный возьмите, там будет блок по обработке функций открытия-закрытия ордеров, чаще всего делают даже с возможным заданием количества попыток. Самый простой метод в Вашем куске кода присвоить ticket =-1. А OrderSend поместить внутрь цикла while (ticket10 к примеру. Самый примитивный пример. Спойлер int attempt =0;ticket =-1;while (ticket{ticket = OrderSend(...);attempt++;if (attempt>10) break;} Лучше, конечно использовать цикл for. Так что никаких меток не нужно :) Ссылка на сообщение Поделиться на другие сайты More sharing options...
pavlus777 Опубликовано 1 августа, 2016 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 1 августа, 2016 Второй урок по MQL5http://tradelikeapro.ru/mql5-pishem-pervyiy-sovetnik/ Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти