多个订单问题 - 页 4

 
luisneves:

嗨,Kronin。

你的修改是有效的。你已经限制了最大的订单,但是否有可能让它们全部关闭?

我试着用下面的代码来做,但似乎不起作用。

致以最崇高的敬意

路易斯

嗯,我不确定我是否理解你的意思...
你的意思是,不打开最后一个订单(如果MaxOrders设置为7,则为7号订单)而关闭所有订单?

我很确定你不想等到达到MaxOrders时再立即关闭所有订单。最后一个订单在大多数情况下(或所有时间)都会以损失告终。
你看到关于价差控制器 的PM了吗?

 
kronin:

嗯,我不确定我是否理解你的意思......
你的意思是,不打开最后一个订单(如果MaxOrders设置为7,则为7号订单),而是关闭所有订单?

我很确定你不想等到达到MaxOrders时再立即关闭所有订单。最后一个订单在大多数情况下(或所有时间)都会以损失告终。
你看到关于价差控制器的PM了吗?


嗨,克洛宁。

谢谢你的及时答复。

假设在一个n个订单(MaxOrders)的乒乓周期后,所有未结订单都应该被关闭,我知道这可能没有意义,但即便如此。

我想在订单失败的情况下加入重新进入的代码,但我怀疑这是否有意义,因为已经有IsContextBusy () Sleep (10)的代码。据我所知,其含义是"如果服务器繁忙或平台上的其他EA正试图进行通信,那么等待10毫秒并再次尝试"。 所以我想,EA将保持这种行为,直到收到票据,我说的对吗?

关于PM问题,在这种情况下,最好不要在周末使用测试,或者在平台离线时进行测试....。

我已经插入了第5行,但我认为这没有必要,因为第1行你已经做了,我说的对吗?

int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber); //1 
   if(LastClosedTicket>0)
    {                                                                 
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))
      {
      if(OrderSymbol()== Symbol() && OrderMagicNumber()== MagicNumber) //5           
       {            
         if(OrderType()==OP_BUY)
         {
         BuyAllowed=false;SellAllowed=true;
         } 
         else                   
         {
         BuyAllowed=true;SellAllowed=false;
         } 
        }   
      }
    }             
  return(0);   
  }
 
  //+---------------------------------------------------------------------------+

另一个问题。

在下面这段代码中,黑体字的sym和mn不应该被替换成Symbol()和MagicNumber?

GetTicketFromHistory

int GetTicketFromHistory(string sym,int mn,int orderposinhistory=0)// <------------------------Should replace sym and mn with Symbol () and MagicNumber ?
 {
   bool debug=false;
   if(debug)Print("Orders in history: ", OrdersHistoryTotal());
   int ticket,count=1,i;
   datetime orderclosedates[];
   for(i=OrdersHistoryTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
      if(debug)Print("OrderSymbol: ",OrderSymbol(),"; OrderMagicNumber: ",OrderMagicNumber(),
                     " ;OrderType: ",OrderType(),"; OrderTicket: ",OrderTicket(),
                     "; OrderCloseTime: ",TimeToStr(OrderCloseTime()),";"); 
      if((OrderMagicNumber()  ==mn) // <---------------------------------------------------------Should replace  mn with  MagicNumber ?
         &&(OrderSymbol()     ==sym)// <---------------------------------------------------------Should replace sym with Symbol () ?
         &&(OrderType()==OP_BUY||OrderType()==OP_SELL))
         {                       
         ArrayResize(orderclosedates,count);
         orderclosedates[count-1]=OrderCloseTime();
         count++;

在下面的代码中,我已经按照你的建议插入了过滤器。

(//Phil:

//检查订单的总量。我会为市场、魔法和符号添加一个过滤器......//<----------- 不确定你说的市场过滤器是什么意思.....(Phil: 市场订单,没有挂单)

//....,但我现在很懒.....,这是你要做的事情。

这样做对吗?

int start()
 {//0 
                                         
  OTLastTick = OTCurrentTick;                      
  OTCurrentTick = OrdersTotal();
     if(OrderSymbol() == Symbol()           //<--------filter for symbol and magic number, but for market (suppose market orders can't understand how....)
      && OrderMagicNumber() == MagicNumber) //<-|
     if(OTCurrentTick == 0 && OTLastTick > 0)
      {
      BuyTrigger = Ask + OpenDistance * pt;
      SellTrigger = Bid - OpenDistance * pt;
      }             
     if(OTCurrentTick >0 )Trail();                   
     if(OTLastTick >= 2                     //<------could you comment the meaning of this line ?                            
     &&OTCurrentTick < OTLastTick
     && OTCurrentTick > 0)
     {
      CloseAllOnSL();return;
     }      
     if(OTCurrentTick >= MaxOrders)return;                                                            
     if(OTCurrentTick > 0)OpenOppositeOrder();                        
     if(OTCurrentTick == 0)
     {
      BuyAllowed = true;
      SellAllowed = true;


最诚挚的问候

路易斯

 

我不对功能 的使用进行评论。RaptorUK在之前的几篇文章中已经这样做了。再次阅读并理解为什么你不需要改变所给的代码的任何内容。甚至更好的是,理解为什么你可以在其他EA中使用它。

OrdersTotal()给出了一个订单的数量。你可能想知道,这些订单是属于你的EA还是属于手动交易,或者这些订单是待定的,还是已经是市场的参与者。我将创建一个函数(int),给出EA创建的订单数量。

if(OTLastTick >=2 //<------could you comment the meaning of this line?
If you have only one order open (less than 2), it doesn't make any sense to call CloseAllOnSL function..... the only open order is obviously not stopped out.

 
kronin:

我不对功能的使用进行评论。RaptorUK在之前的几个帖子中已经这样做了。再次阅读并理解为什么你不需要改变所给的代码的任何内容。甚至更好的是,理解为什么你可以在其他EA中使用它。

OrdersTotal()给出了一个订单的数量。你可能想知道,这些订单是属于你的EA还是属于手动交易,或者这些订单是待定的,还是已经是市场的参与者。我将创建一个函数(int),给出EA创建的订单数量。

if(OTLastTick >=2 //<------你能评论一下这一行的含义吗?
如果你只有一个订单未平仓(小于2),调用CloseAllOnSL功能没有任何意义.....,唯一未平仓的订单显然没有被止损。


你好,Kronin。

谢谢你对我的问题的回应。

我将对您的代码以及RaptorUK之前的建议给予最大的关注。

致以最美好的祝愿

路易斯

 

你好,Kronin。

一个问题出现了,与使用两个EA有关。如果我把两个EA放在不同的图表中,并使用不同的魔法数字,它们就不能同时工作。我收到的错误是uninit reason 5,但在论坛上看了一下,没有找到能让我在正确方向上处理这个问题的信息。

你有什么补充信息吗?

最诚挚的问候

路易斯

 
luisneves:

你好,Kronin。

一个问题出现了,与使用两个EA有关。如果我把两个EA放在不同的图表中,并使用不同的魔法数字,它们不能同时工作。我收到了一个错误,即uninit reason 5。

https://docs.mql4.com/constants/uninit
 

嗨,RaptorUK。

谢谢你的及时回复。

在提供的链接中,我发现。

原因_参数5输入的参数被用户改变了。

但据我所知,这些信息不能做任何事情。我不明白哪些输入参数被改变了。EA是一样的,只是改变了神奇的数字,以避免与其他EA之间的冲突。

顺便说一下,如果你在这里,你能告诉我,在下面的代码中,是否必须引入代码来获得订单被再次发送,而票据还没有被收到,对于平仓订单也是如此?

while(IsTradeContextBusy()) Sleep(10);
          RefreshRates();       
                       
     BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,RealSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket > -1)

最好的问候

路易斯

 
luisneves:

嗨,RaptorUK。

谢谢你的及时回复。

在提供的链接中,我发现。

原因_参数5输入的参数被用户改变了。

但据我所知,这些信息不能做任何事情。我不明白哪些输入参数被改变了。该EA是一样的,只是改变了魔法数字,以避免与其他EA之间的冲突。

如果你改变了魔法号码....

extern int    MagicNumber    = 08012013;

. . . 而它是一个外部参数,那么你就改变了一个参数,EA重新启动并给出理由5

如果你想在多个货币对上运行你的EA,我建议你做两件事,首先让你的EA在一个货币对上正常工作,对它进行全面测试,这样你就知道它在工作。 然后,第二,引入一个Mutex,这样当其他EA没有试图做同样的事情时,你的交易就会被处理。

 
RaptorUK:

如果你改变了 "魔法号码"....

.并且是一个外部参数,那么你就改变了一个参数,EA重新启动并给出原因5

如果您想在多个货币对上运行您的EA,我建议您做两件事,首先让您的EA在一个货币对上正常工作,对它进行全面测试,这样您就知道它在工作。 然后,第二,引入一个Mutex,这样您的交易在其他EA没有试图做同样的事情时就会被处理。


嗨,RaptorUk。

谢谢你对错误的回应,我想你已经改变了名称和魔法号码,并在不关闭平台的情况下将第二个EA放入图表。

关于重新输入订单的其他问题,这与订单关闭失败有关,因为它返回了一个错误的超时。

致以最崇高的敬意

路易斯

 
luisneves:


嗨,RaptorUk。

谢谢你对错误的回应,我想我已经改变了名称和魔法号码,并在没有关闭平台的情况下将第二个EA放入图表。

关于重新输入订单的其他问题,这与订单关闭失败有关,它返回了一个错误的超时。

致以最崇高的敬意

路易斯

仔细阅读执行错误代码,使你的代码符合那里给出的信息,例如 . . .

err_trade_timeout128交易的超时已经达到。在重试之前(至少在1分钟内),有必要确保交易操作没有真正成功(一个新的头寸没有被打开,或现有的订单没有被修改或删除,或现有的头寸没有被关闭)。