
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Правильный вариант на простом примере
Думаю правильней в случае когда ордер еще не учтен в позиции, просто подождать пока он учтется.
Не уловил мысль.
Из этой схемы хорошо видно, что при выставлении маркет-ордера через OrderSendAsync на том же MetaQuotes-Demo невозможно гарантированно поймать событие выставления соответствующего ордера до момента, пока ордер не будет исполнен или отклонен. Т.е. в MT5 нет никаких простых механизмов оценивания промежуточных результатов своего OrderSendAsync.
Кажется в теме,
Хочу отметить что такой код :
на ДЕМО работает безупречно (result=request),
но на РЕАЛ - результат получить невозможно (result=0.0). ... если не подождать несколько секунд.
Кажется в теме,
Хочу отметить что такой код :
на ДЕМО работает безупречно (result=request),
но на РЕАЛ - результат получить невозможно (result=0.0). ... если не подождать несколько секунд.
Не хватает данных - логи, значения полей структур после OrderSend, имя торгового сервера.
Смысл вкратце таков: если стоит маркет-ордер, считай, что и это "позиция". В кавычках, потому что это оберточная позиция. Выделенный код, как правило, нигде не фигурирует. Но он позволяет избегать повторных открытий позиций. Самое интересное здесь - выделенное красным. Необходимость этой фишки не сразу осознать.
На следующем тике может не быть торгового сигнала. Сам использую MT4-style, поэтому не могу не видеть такие "позиции", при этом проблем не получаю.
Не хватает данных - логи, значения полей структур после OrderSend, имя торгового сервера.
2018.02.20 15:20:35.845 Trades order #66745055 buy 0.01 / 0.01 EURUSDeur at market done in 610.625 ms
2018.02.20 15:20:35.935 Trades deal #5461453 buy 0.01 EURUSDeur at 1.23403 done (based on order #66745055)
2018.02.20 15:20:35.845 TestBUY (EURUSDeur,M15) retcode=10009 deal=0 order=66745055
Если запрос выполнен (10009) , то почему deal=0
Если запрос выполнен (10009) , то почему deal=0
Почти с этого и началось обсуждение. По ссылкам там все подробности.
Есть решение, чтобы OrderSend отрабатывал идеально, но это будет уже реклама.
Правильный вариант на простом примере
Смысл вкратце таков: если стоит маркет-ордер, считай, что и это "позиция". В кавычках, потому что это оберточная позиция. Выделенный код, как правило, нигде не фигурирует. Но он позволяет избегать повторных открытий позиций. Самое интересное здесь - выделенное красным. Необходимость этой фишки не сразу осознать.
Дело в том, что есть так называемые закрывающие маркет-ордера. Те же SL/TP. Очевидно, что такие маркет-ордера видеть в виде "позиций" не хотелось бы. Да и те ордера, которые сам выставил для закрытия - аналогично. Вот выделенное условие и является соответствующим фильтром.
for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) && !OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb)) Res++;
ЗЫ Вставьте этот код сюда и проверьте результат на демо-сервере.
Приглашаю всех заинтересованных к обсуждению данного вопроса. Моё мнение на этот счёт таково:
for (int i = OrdersTotal() - 1; i >= 0; i--) if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) <= ORDER_TYPE_SELL) && !OrderGetInteger(ORDER_POSITION_ID) && (OrderGetString(ORDER_SYMBOL) == Symb)) Res++;
Этот цикл добавляет одну позицию если нашёлся ордер, который не имеет идентификатора позиции (ID нулевой).
Мы вернули больше на одну позицию.
А если ордер будет отменён сервером?
...
Думается мне, что при учёте маркет-ордеров, необходимо - если таковой нашёлся - возвращать допустим WRONG_VALUE - позиций не может быть меньше нуля. Это будет сигналом, что есть неучтённый маркет-ордер. Но никак не добавлять число позиций.