Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
По исходнику можете посмотреть, что реквоты обрабатываются правильно - по крайней мере аналогичным образом, как в других пятерочных исходниках. После первой ошибки реквоты поступают новые цены, они подставляются в следующий запрос, но ошибка остается. Причем при всех последующих попытках рефреш возвращает уже одни и те же цены. Количество попыток не важно - можно пытаться отрефрешиться до бесконечности. Очень похоже на баг в тестере.
Очень похоже на баг в программе. Бегло просмотрел, по моему она находится здесь:
Ордера на покупку переквалифицируются как ордера на продажу, так как за оператором case: OP_BUY тут же выполняется case: OP_SELL_. Это же видно и из лога: устанавливается ордер OP_SELL,
а цена берётся ask.
Это же касается и отложенных ордеров.
Да, для каждого case нужен свой break. https://www.mql5.com/ru/docs/basis/operators/switch
Супер. Спасибо всем за помощь. Был невнимателен в новом фрагменте кода.
А что относительно доп. вопросов? Есть для них ответы?
2) Как в тестере просмотреть позиции на чартах? По умолчанию открывается только чарт валюты, на которой запускался эксперт, но он же многовалютный. И как на графике с результатами тестирования получить инфу, где какая сделка была проведена, где какая позиция создавалась/поменялась? Сейчас график совершенно неинформативный. Всплывающих подсказок нет. Клики на нем никакой контекстной инфы не выводят.
Дополнительные вопросы. 1) В библиотеке делается попытка получить идентификатор сделки для только что открытой позиции из result.deal, но там почему-то всегда ноль. Нужно это, чтобы в идущем следом вызове HistoryDealGetInteger(result.deal, DEAL_POSITION_ID, LID); получить идентификатор самой позиции. В общем, вопрос - как получить id позиции, "не отходя от кассы"?
Так как торговые операции выполняются асинхронно, то Вам придется подождать момента, когда позиция будет открыта (если Вам непременно нужно получить IВ позиции сразу же после отправки OrderSend()). Вот примерный код:
Вторй вариант - запросить ID позиции, к которой относится сделка. Выглядит чуть короче, но желательно все равно проверять результат выполнения HistoryDealSelect():
Так как торговые операции выполняются асинхронно, то Вам придется подождать момента, когда позиция будет открыта (если Вам непременно нужно получить IВ позиции сразу же после отправки OrderSend()). Вот примерный код:
Вот этот кусочек очень интересен:
Для чего здесь "if"?
Далее, если SymbolInfoTick() завершится неуспешно, - какой смысл в последующем присваивании мусора (ведь изначально переменная tick неинициализирована)?
Какой смысл в последующем вызове OrderSend(), если ей передаются ошибочные данные (тот самый мусор)?
Хорошо, если это исправить, то - какой смысл 100 раз крутить цикл, вызывая PositionSelect() и выполняя задержку в 50 мс, если в документации на данный момент сказано:
Функция PositionSelect() работает с таймаутом. Если запрашиваемые данные уже готовы, то они отдаются сразу без ожидания. В противном случае на подготовку запрошенных данных отводится фиксированный таймаут в 3 секунды. Как только данные получены функция тут же завершает свою работу и возвращает результат.
Да, поведение функции не так давно было изменено, и, возможно, Вы на этом попались. Но если уж даже Вы попались, то каково же пользователям?
И в довершение, Вы в своём коде, который многие стараются брать за образец (как же, - код от разработчиков!), вставляете комментарии вида:
//--- будем считать, что позиция выбрана успешно - теперь можно получить ID розиции
А ведь совсем несложно было грамотно написать этот пример, чтобы не надо было "считать", а можно было бы в это месте, в случае, если до него дойдёт управление, иметь гарантию успешного выбора позиции, а не "будем считать".
Я нисколько не удивлён таким примером, потому что, очень похоже, что и сам MT5 пишется в подобном стиле, - а именно такой подход к программированию и даёт то качество, которое сейчас имеет и MT5.
Хорошо, если это исправить, то - какой смысл 100 раз крутить цикл, вызывая PositionSelect() и выполняя задержку в 50 мс, если в документации на данный момент сказано:
Функция PositionSelect() работает с таймаутом. Если запрашиваемые данные уже готовы, то они отдаются сразу без ожидания. В противном случае на подготовку запрошенных данных отводится фиксированный таймаут в 3 секунды. Как только данные получены функция тут же завершает свою работу и возвращает результат.
Да, поведение функции не так давно было изменено, и, возможно, Вы на этом попались. Но если уж даже Вы попались, то каково же пользователям?
Таймауты для торговых функций были убраны (https://www.mql5.com/ru/forum/23/page7):
MetaTrader 5 Client Terminal build 306
Вот этот кусочек очень интересен:
Я нисколько не удивлён таким примером, потому что, очень похоже, что и сам MT5 пишется в подобном стиле, - а именно такой подход к программированию и даёт то качество, которое сейчас имеет и MT5.