Как правильно работать в MT5 с OrderSend - страница 3

 
prostotrader:

Пользуйтесь.

Зачем вы отправляете пустой запрос на сервер? Это выглядит не имеющим смысла.
И что вы будете делать в "//смотрим причину result.retcode", если получите скажем TRADE_RETCODE_TIMEOUT или TRADE_RETCODE_FROZEN ?
 
RickD:
Зачем вы отправляете пустой запрос на сервер? Это выглядит не имеющим смысла.
И что вы будете делать в "//смотрим причину result.retcode", если получите скажем TRADE_RETCODE_TIMEOUT или TRADE_RETCODE_FROZEN ?
Повешусь :)
 
Andrey Khatimlianskii:

Поддерживаю обеими руками. MQ как буд-то не хотят брать на себя ответственность за готовую функцию отправки ордера и получения ответа.

Мой вариант тоже с костылями:

 

Почему не сделать что-то похожее (не на все случаи жизни, хотя бы на самый простой!) и не выложить в СБ? 

в самом деле, какой толк от "быстроты"  исполнения OrderSend(...), если мы в ЕА вынуждены ждать 

обновления окружения, в данном случае обновления истории... и придумывать разные алгоритмы этого ожидания...

ведь пока история не обновится, дальше мы не двинемся...то есть пользы от этой быстроты никакой...

 
Denis Sartakov:

в самом деле, какой толк от "быстроты"  исполнения OrderSend(...), если мы в ЕА вынуждены ждать 

обновления окружения, в данном случае обновления истории... и придумывать разные алгоритмы этого ожидания...

ведь пока история не обновится, дальше мы не двинемся...то есть пользы от этой быстроты никакой...

Вероятно, так реализовано с тем рассчетом, что параллельно в терминале могут исполняться OrderSend и OrderSendAsync, и принудительная синхронизация истории после OrderSend как то влияла бы на OrderSendAsync, OnTrade, OnTradeTransaction, замедляя их.
 
Andrey Khatimlianskii:
Речь не о встроенных функциях языка, речь о стандартной библиотеке.
У меня речь именно о встроенных функциях языка, что OrderSend мог бы ждать обновления торговой истории внутри, но не ждет. :)
Вы говорите, что у вас есть костыль, но что то он того, ненадежный. Дайте пример хорошего надежного костыля.
Я говорю - что может можно вообще обойтись без костылей. Если разработчики соизволили бы изменить поведение OrderSend. Сделать, как в MT4.
Ну - или еще альтернативный вариант. Добавить функцию OrderSendMT4Style. :)
 

Самостоятельно пишется очень простая перегрузка OrderSend: пока OnTrade не возвратит ответ, все последующие OrderSend возвращают false. Как ответ получен - принудительный false отменяется.

Именно такое решение нужно добавить в СБ. И самим использовать.

В СБ по тому же принципу добавить bool CTrade::IsHistoryLoad( const string Symb = NULL ).

И никаких костылей тогда! Обе функции легко пишутся самостоятельно.

 

ЗЫ Если хочется совсем полноценно (не для СБ), то в OnTrade по приходу соответствующей синхронизации вызывать самостоятельно OnTick и OnTimer.

 

Каких-же костылей понаписали... Изучайте поведение функции void OnTradeTransaction()

/*********************TradeTransaction function*********************/
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
      if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
       {
        if(!PositionSelectByTicket(trans.position))
         {
          //Print("********* закрылась позиция ", trans.position);
           closedPosition(trans);
         }
        if(PositionSelectByTicket(trans.position))
         {
          //Print("********* отккрылась позиция ", ", ", EnumToString(trans.deal_type), ", ", trans.position);
           openedPosition(trans);
         }
       }
       
}/*******************************************************************/

Так-же обрабатывайте ошибки открытия позиций и ордеров.

 
Alexey Viktorov:

Каких-же костылей понаписали... Изучайте поведение функции void OnTradeTransaction()

Так-же обрабатывайте ошибки открытия позиций и ордеров.

Вы прочли тему по-диагонали.
 
fxsaber:
Вы прочли тему по-диагонали.

Нет, только по вертикали. Только первую букву каждой строки.

 
Andrey Khatimlianskii:

Как с этой простой перегрузкой будут работать 2 советника на одном инструменте?

К сожалению, только через костыль - глобальная переменная терминала.