多个订单问题 - 页 5

 
RaptorUK:

阅读执行错误代码,使你的代码符合其中的信息,例如 . . .

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


嗨,RaptorUK。

谢谢你提供的线索。

另一个问题(更多.....)。

假设在ECN经纪商上有一笔交易,根据 "交易要求和限制",如果止损在冻结距离内,市场订单不能被关闭,在这种情况下,CloseAll功能是否会关闭那些在冻结距离内的订单?

祝贺你

路易斯

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;   
        RefreshRates(); 

   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket>0)                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()-OrderClosePrice())>            
            MathAbs(OrderStopLoss()-OrderClosePrice()))              
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
                  GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 
 
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
}
 
luisneves:


嗨,RaptorUK。

谢谢你提供的线索。

另一个问题(更多.....)。

假设在ECN经纪商上有一笔交易,根据 "交易要求和限制",如果止损在冻结距离内,则不能关闭市场订单,在这种情况下,这个CloseAll功能是否会关闭那些在冻结距离内的订单?

不,它会失败,可能是错误130
 

嗨,RaptorUK。

如果可能的话,想请你在这个问题上提供一些帮助。

这段代码找到最后的OrderLots(),并将其乘以乘数因子,但有些时候它通过了这个因子,我有这样的订单;0.01,196,83,590,49,等等。

必须指出的是,我有一个开仓订单的限制,在这种情况下是5。现在,我看到这个逻辑的方式是,即使有条件打开一个超过5的订单,它也不会打开,然后池中的订单数量 被限制为5,所以,如果代码只看到池中的5个订单,这些订单的手数应该是;0.01,0.02,0.04,0.08,0.16。这段代码中是否有我不知道的问题?

(希望缩进是好的...)

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
 if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
   {//12
 if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
   {//13
     LastLot = OrderLots();
   }//13              
     MLots = 0;                       
     MLots = LastLot * Multiplier;        
   }//12
 else MLots = LotSize;
   }//11 
 return(0);
 }//0 

最好的问候

路易斯

 
luisneves:

嗨,RaptorUK。

如果可能的话,想请你在这个问题上提供一些帮助。

这段代码找到最后的OrderLots(),并将其乘以乘数因子,但有些时候它通过了这个因子,我有这样的订单;0.01,196,83,590,49,等等。

必须指出的是,我有一个开仓订单的限制,在这种情况下是5。现在,我看到这个逻辑的方式是,即使有条件打开一个超过5的订单,它也不会打开,然后池中的订单数量被限制为5,所以,如果代码只看到池中的5个订单,这些订单的手数应该是;0.01,0.02,0.04,0.08,0.16。这段代码中是否有我不知道的问题?

(希望缩进是好的...)

我是这样做的 . .

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         }//13              
      MLots = 0;                       
      MLots = LastLot * Multiplier;        
      }//12
   else MLots = LotSize;
   }//11 
return(0);
}//0 

如果OrderSelect()失败,MLots = LotSize ? 为什么?你的缩进并不能帮助你看到你的if语句和大括号发生了什么。.你是想这样做吗?

for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {//11
   if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
      {//12
      if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
         {//13
         LastLot = OrderLots();
         MLots = 0;                       
         MLots = LastLot * Multiplier; 
         }//13              
      }//12
   }//11 
if(MLots < 0.001) MLots = LotSize;  //  if MLots == 0.0
return(0);
}//0 

我是这样做的 . . .

if(MLots < 0.001)

.作为一个快速和肮脏的方法来避免双重比较问题,你读过这个吗?Price != Price?

 
RaptorUK:

我是这样做的 . .

如果OrderSelect()失败,MLots = LotSize ? 为什么?你的缩进并不能帮助你看到你的if语句和大括号发生了什么。.你是想这样做吗?

我是这样做的 . . .

......作为一种快速和肮脏的方法来避免双重比较问题,你读过这个吗?Price != Price?


嗨,RaptorUk。

谢谢你的及时回复。

所以,我想最好不要使用其他的东西,因为那是白白存在的。谢谢你提供的链接。

最好的祝福

路易斯

 

嗨,RaptorUK。

我有一个问题(更多.....)

有些订单在时间之前关闭,我的意思是。

这些订单一直是开放的,有一个限制,可以开放到6。所有的订单都应该通过追踪止损(TrailingStop)来关闭,但是订单1.3和5已经在时间之前关闭。3号和5号订单在其他订单之前关闭,而其他订单在(07:43)之后关闭。

因为这3个订单比其他订单先关闭,所以给了7、8、9号订单空间,这些订单以最后一手(2.43)为基础开仓。

因此,据我所知,那些在07:23不稳定的平仓订单不应该发生,也没有发现错误......

1 - 49518192013.01.28 19:51卖出0.01秦皇岛1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04购买0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12出售0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20购买0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27出售0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48购买2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23出售7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40购买21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40出售65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

通过TrailingStop关闭这些订单的代码是这样的。

这段代码会不会在不同的时间失败并关闭订单?

void CloseAllOnSL()
 {
   int OrdType, GLError;
   double OrderClosed;
        
   int LastClosedTicket=GetTicketFromHistory(Symbol(),MagicNumber);  
   if(LastClosedTicket > 0 )                                          
   {//28                                                  
      Print("LastClosedTicket=",LastClosedTicket);                   
      if(OrderSelect(LastClosedTicket,SELECT_BY_TICKET))             
      {//29        
         if(MathAbs(OrderTakeProfit()- OrderClosePrice())>            
            MathAbs(OrderStopLoss()- OrderClosePrice()))             
            {//30        
            Print("Order with ticketnr: ", LastClosedTicket,
                  " hit SL! Close all open orders");

      for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
         if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
            && OrderMagicNumber()== MagicNumber 
            && OrderSymbol()== Symbol())                                       
            {//31
            OrdType = OrderType();
            if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 GLError = GetLastError();
              }//32               
             }//31      
         }//28 
      }//29     
   }//30 

致以最崇高的敬意

路易斯

 
luisneves:


通过TrailingStop关闭这些订单的代码是这个。

这段代码会不会在不同的时间失败并关闭订单?

好吧,这毫无意义 ......设置追踪止损是为了如果价格随着订单走,止损会向价格方向移动,所以如果新的止损被击中,损失会减少,甚至会有利润。在我看来,这不是一个追踪SL,这不是一个任何类型的SL,因为你是通过EA而不是SL主动关闭交易。

也许你的CloseAllOnSL()函数 所做的与我想的不同,但是,你没有注释解释你的代码试图做什么。 没有追踪SL,因为没有OrderModify()。

 

阅读本文:什么是函数的返回值?我如何使用它们?

if(OrdType == OP_BUY || OrdType==OP_SELL)
              {//32
              while(IsTradeContextBusy()) Sleep(SleepTime);  
                   RefreshRates();
              if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))                
                 {
                 GLError = GetLastError();

                 //  ? ? ? ? ?  why aren't you printing the information about the OrderClose() failure ? ? 
                 Print("OrderClose failed, error# ", GLError);  //<-----  like this  but more info
                 } 
              }//32 

在打印语句中添加更多的信息,添加OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, 等等,等等任何你需要的信息来确定错误发生时的问题是什么,你不可能轻易回到过去把这些都找出来,所以当它发生时要打印到日志上。

 
luisneves:


所以,据我所知,那些在07:23不稳定的平仓订单不应该发生,也没有发现错误......

1 - 49518192013.01.28 19:51卖出0.01秦皇岛1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04购买0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12出售0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20购买0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27出售0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48购买2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23出售7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40购买21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40出售65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

显示发生这种情况时的日志输出 . . .
 
RaptorUK:

阅读本文:什么是函数的返回值?我如何使用它们?

在打印语句中添加更多的信息,添加OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, 等等,等等任何你需要的信息来确定错误发生时的问题是什么,你不可能轻易回到过去把这些都找出来,所以当它发生时要打印到日志上。


嗨,RaptorUk。

谢谢你的时间。

追踪止损的代码在另一个部分,发送的代码只是为了关闭所有通过追踪止损关闭的订单。

尽管如此,我还是听从您的建议,寻找任何可以提供更多信息的错误,为什么订单在其他订单之前关闭。

顺便说一下,在下面的代码中,把MLots = 0;的位置从实际位置改到for循环之前是否合理?

   MLots = 0; <-----------------------------------------------------------------to here 
   for(int cnt = 0; cnt < OrdersTotal(); cnt++)
      {//11
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {//12
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {//13
            LastLot = OrderLots();
            }//13            
         MLots = 0;  <-----------------------------------------------------------from here                      
         MLots = LastLot * Multiplier;        
         }//12      
      }//11 
   return(0);
   }//0 

最好的问候

路易斯