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

 
fxsaber:
Это уже терминологический спор. Плохую ситуацию подробно описал выше. Стандартные библиотеки даже этого не учитывают.

Нет.

Но продолжайте упорствовать. Больше объяснять не буду.

 
Renat Fatkhullin:

Нет.

Но продолжайте упорствовать. Больше объяснять не буду.

Люди об этом пишут на форуме. И ни один раз. Реакция как раз вот такая.

 
fxsaber:

Люди об этом пишут на форуме. И ни один раз. Реакция как раз вот такая.

Люди не хотят думать сами, а хотят чтобы за нах это делали другие... к сожалению это так.
 
prostotrader:

Хотите, я Вам помогу обойти эти казусы (из личного опыта торговли на реальном счёте роботами МТ5)? 

Добавлено

Абсолютно бесплатно :) 

Добавьте в копилку и своего

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ожидание ответа сервера после посылки OrderSend()

Denis Sartakov, 2016.10.08 15:43

функция синхронная, просто история обновляется не синхронно с завершением работы этой функции,

я вот так делаю, думаю это проще чем возиться с OnTrade(), и прочими заморочками:

bool ClosePosition()
{
   if (!PositionSelect(_Symbol))
   {
      return(false);
   }

   bool   b_Result;
   
   b_Result = m_trade.PositionClose(_Symbol,mi_Deviation);
   
   if(!b_Result)
   {
      Print("The PositionClose() method has failed. Return code=",m_trade.ResultRetcode(),
            ". Code description: ",m_trade.ResultRetcodeDescription());
      return(false);
   }
   
   if(b_Result)
   {
      if (m_trade.ResultRetcode() == TRADE_RETCODE_DONE)
      {
         while(PositionSelect(_Symbol))
         {
         }
         
         Print("The PositionClose() has been successfully executed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(true);
      }
      if (m_trade.ResultRetcode() != TRADE_RETCODE_DONE)
      {
         Print("The PositionClose() failed. Return code=",m_trade.ResultRetcode(),
               " (",m_trade.ResultRetcodeDescription(),")");
         return(false);
      }
   }
   return(false);
}      
//+------------------------------------------------------------------+

 
prostotrader:
Люди не хотят думать сами, а хотят чтобы за нах это делали другие... к сожалению это так.

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

Ни одного примера в Документации на эту тему. И это с основной функцией.

 
fxsaber:

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

Ни одного примера в Документации на эту тему. И это с основной функцией.

Пример, который Вы привели выше, ивините - полная ерунда.

Не с этого нужно начинать! 

 
prostotrader:

Пример, который Вы привели выше, ивините - полная ерунда.

Не с этого нужно начинать! 

Мой вариант

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2016.10.09 09:39

Если отправляется OrderSend, то надо ЗАПОМНИТЬ (вот здесь потенциальная уязвимость), что это сделано. Далее не обращать внимание на текущую историю (торговое окружение), пока не придет соответствующее сообщение в OnTrade. Как только оно прийдет, ЗАПОМНЕННОЕ нужно ЗАБЫТЬ.

Когда нет ЗАПОМНЕННЫХ данных, можно доверять истории, как в MT4.


 
//+------------------------------------------------------------------+
//|                                                    OrderSend.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool is_busy;
ulong order_ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   is_busy=false; 
   order_ticket=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!is_busy && (order_ticket==0)) //Только при выполнении данного условия мы продолжаем работать(кроме отложенного ордера)
   {
     MqlTradeRequest request={0};
     MqlTradeResult  result={0};
     
     if(PositionSelect(Symbol()))
     {
       if(OrderSend(request, result)
       {
         if(result.retcode==TRADE_RETCODE_PLACED) //для биржи TRADE_RETCODE_PLACED
         {
           if(result.order>0)
           {
             is_busy=true;
             order_ticket=result.order;
             Print("Order plased, ticket = ",result.order);
           }
           else
           {
             Print("Internal error!");
           }  
         }
         else
         {
           //смотрим причину result.retcode
         }
       }
       else
       {
         Print("Order NOT send!");
       }
     }
     else
     {
     }
   }   
  }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
//--- В зависимости от того, квкой тип ордера мы устанавливали, смотрим, что с ордером произошло
// и только после полного понимания снимаем флаг is_busy=false; order_ticket=0;
// вот и все премудрости OrderSend
   
  }
//+------------------------------------------------------------------+

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

 
prostotrader:

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

Ну и чем это отличается от того, что написал выше? Мне хороший человек серьезную библу даже скинул на эту тему.

Люди находят решения. Речь же шла о том, что сами разработчики даже в СБ этого не имеют. 

 
fxsaber:

Ну и чем это отличается от того, что написал выше? Мне хороший человек серьезную библу даже скинул на эту тему.

Люди находят решения. Речь же шла о том, что сами разработчики даже в СБ этого не имеют. 

Не нравится - не пользуйтесь.
Причина обращения: