如何在MT5中正确使用OrderSend? - 页 2

 
fxsaber:
这已经是一个术语的争论。上文已经详细介绍了这种糟糕的情况。标准库 甚至没有考虑到这一点。

没有。

但要继续坚持下去。我不会再解释了。

 
Renat Fatkhullin:

没有。

但要继续坚持下去。我不会再解释了。

人们在论坛上写到了这一点。而且不止一次。反应就是这样。

 
fxsaber:

人们在论坛上写到了这一点。而且不止一次。反应就像这样。

人们不愿意为自己思考,而是希望别人为他们思考......。不幸的是,情况就是如此。
 
prostotrader:

你想让我帮你绕过这些误区吗(来自真实账户上使用MT5机器人交易的个人经验)?

添加

绝对免费 :)

把你自己的也加到储蓄罐里。

关于交易、自动交易系统和交易策略测试的论坛

发送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消息到来。一旦到了,要记得忘记。

当没有REMEMBER时,你可以像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:

使用它。

那么它与我上面写的有什么不同呢?一位好心人甚至给我寄来了一本关于这个问题的严肃圣经。

人们正在寻找解决方案。这是关于开发商自己甚至在SB中都没有的事实。

 
fxsaber:

那么,这与我上面写的有什么不同呢?我甚至有一个好心人给我丢了一本关于这个问题的严肃圣经。

人们正在寻找解决方案。这是关于开发商自己甚至在SB中都没有的事实。

如果你不喜欢它,就不要使用它。
原因: