Нашел ответ на вопрос 2. Между открытием ордеров нужно ставить вызов функции RefreshRates().
И проверять
IsTradeContextBusy( | ) != True |
Если вас не затруднит, вы можете как-нибудь помочь по другим вопросам? :)
Чтобы начала работать start нужно разрешить советников - кнопка "Советники" в верхней панели терминала и при установке советника на график разрешить ему торговать - первая закладка свойств советника.
2. Один ордер ставится потому что для второго торговый поток занят и цены изменились. Так наверное более правильно. Хотя установка ордеров в init это в корне противоречит принципам написания советников (потому что init выполняется всегда).
TicketUp = OrderSend(Symbol(), OP_BUYSTOP, 0.1, Ask + JumpSize, 3, Ask, Ask + (2 * JumpSize), "", 0, 0, Green); if (TicketUp < 0) { Print("OrderSend failed with error #", GetLastError()); return(0); } // while(IsTradeContextBusy() == True){ ; } RefreshRates(); // TicketDown = OrderSend(Symbol(), OP_SELLSTOP, 0.1, Bid - JumpSize, 3, Bid, Bid - (2 * JumpSize), "", 0, 0, Blue); if (TicketDown < 0) { Print("OrderSend failed with error #", GetLastError()); return(0); }3. Весь вывод сообщений от советников идет на закладку "Эксперты" в окне "Терминал".
4. Зеленые стрелочки - результат вызова функции OrderSend. Синие штрих-линии - уровни stop-loss и take-profit указанные в функции OrderSend
Зеленая штрих-пунктирная линия - уровень открытия ордера, который установлен, красные линии уровни stop-loss и take-profit установленного ордера.
5. В соответствие замыслу не вчитывался.
Огромное спасибо за обстоятельный ответ!
Хотя установка ордеров в init это в корне противоречит принципам написания советников (потому что init выполняется всегда).
В принципе если я уберу из init() вызов SetTwoOrders() поведение этого эксперта не изменится. :) Но спасибо за замечание.
Ещё раз благодарю!
В принципе если я уберу из init() вызов SetTwoOrders() поведение этого эксперта не изменится. :) Но спасибо за замечание.
Допустим вы еще не решили хотите сегодня торговать или нет. Запускаете терминал просто посмотреть обстановку, тут же запрещаете работу советников.
Но уже поздно, init отработал, запросы ушли на сервер и вы в торгах! Переключили login, а советники на графиках опять отработали свои init'ы!
Аналогично даже хуже с deinit. При закрытии терминала выполняется deinit всех советников, а результат можно узнать только из файла журнала.
2. Один ордер ставится потому что для второго торговый поток занят и цены изменились.
у меня на реале успешно выставляются два отложенных ордера подряд на одном тике
2. Один ордер ставится потому что для второго торговый поток занят и цены изменились.
у меня на реале успешно выставляются два отложенных ордера подряд на одном тике
Во первых не в функции init().
Во вторых https://docs.mql4.com/ru/runtime/start
При поступлении новых котировок выполняется функция start() у присоединенных советников и пользовательских индикаторов. Если при поступлении новой котировки выполнялась функция start(), запущенная на предыдущей котировке, то пришедшая котировка будет проигнорирована советником. Все пришедшие во время выполнения программы новые котировки программой игнорируются до тех пор, пока не завершится очередное выполнение функции start().
Так что все таки не на одном тике!Так что все таки не на одном тике!
все таки на одном!
Все пришедшие во время выполнения программы новые котировки программой игнорируются до тех пор, пока не завершится очередное выполнение функции start(). А очередное выполнение не завершится пока не будет выставленно 2 отложенных ордера, причем если один выставляется то всегда есть и второй! Функция старт выставляет либо сразу 2 ордера либо 0 т.к стоит проверка если отложенных ордеров 0 тогда выставлять
while (IsTradeContextBusy() == true) {} RefreshRates();между открытиями ордеров, открывался только первый ордер. Сейчас открываются оба...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здесь нет никакой логики, мне важно научиться делать хотя бы это. В перспективе эксперт должен будет брать данные из внешнего файла и на их основе открывать ордеры, поэтому текущее, лишенное логики поведение эксперта, получит осмысленное развитие.
В связи со всем изложенным у меня есть несколько вопросов, буду очень признателен за ответы.
Вот код моего эксперта (прошу прощения за стиль оформления кода, я просто привык к такой нотации):
Заранее благодарю за помощь.