Problema de pedidos múltiplos - página 5

 
RaptorUK:

Leia os códigos de erro de execução e faça com que seu código esteja de acordo com as informações ali fornecidas, por exemplo . .

ERR_TRADE_TIMEOUT128Chegou-se a um limite de tempo para o comércio. Antes de tentar novamente(pelo menos em 1 minuto), é necessário ter certeza de que a operação comercial não foi realmente bem sucedida (uma nova posição não foi aberta, ou a ordem existente não foi modificada ou apagada, ou a posição existente não foi fechada).


Olá RaptorUK,

Obrigado pela dica.

Outro número (mais uma.....);

Digamos que no Corretor ECN uma operação está aberta e por "Requisitos e Limitações na realização de negócios" uma ordem de mercado não pode ser fechada se o Stoploss estiver dentro da distância de Congelamento, nesse caso esta função CloseAll fechará mesmo aquelas ordens que estão dentro da distância de Congelamento ?

Melhores Cumprimentos

Luis

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:


Olá RaptorUK,

Obrigado pela dica.

Outro número (mais uma.....);

Digamos que no Corretor ECN uma operação está aberta e por "Requisitos e Limitações na realização de negócios" uma ordem de mercado não pode ser fechada se o Stoploss estiver dentro da distância de Congelamento, nesse caso esta função CloseAll fechará mesmo aquelas ordens que estão dentro da distância de Congelamento ?

Não, falhará, provavelmente erro 130
 

Olá RaptorUK,

Se possível, gostaria de lhe pedir alguma ajuda nesta questão;

Este pedaço de código encontra o último OrderLots() e o multiplica pelo fator multiplicador, mas algumas vezes ele passa este fator e eu tenho pedidos desta forma; 0,01, 196,83, 590,49, etc.

Devo dizer que tenho um limite para abrir ordens, neste caso 5. Agora, a maneira como eu vejo esta lógica, mesmo que venha uma condição para abrir uma ordem acima de 5, não abrirá e então o número de ordens no pool é limitado a 5, portanto, se o código só vê 5 ordens no pool o tamanho do lote para essas ordens deve ser ; 0,01, 0,02, 0,04, 0,08, 0,16. Há algo de errado neste código que eu não saiba?

(espero que a indentação esteja bem...)

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 

Com os melhores cumprimentos

Luis

 
luisneves:

Olá RaptorUK,

Se possível, gostaria de lhe pedir alguma ajuda nesta questão;

Este pedaço de código encontra o último OrderLots() e o multiplica pelo fator multiplicador, mas algumas vezes ele passa este fator e eu tenho pedidos desta forma; 0,01, 196,83, 590,49, etc.

Devo dizer que tenho um limite para abrir ordens, neste caso 5. Agora, a maneira como eu vejo esta lógica, mesmo que venha uma condição para abrir uma ordem acima de 5, não abrirá e então o número de ordens no pool é limitado a 5, portanto, se o código só vê 5 ordens no pool o tamanho do lote para essas ordens deve ser ; 0,01, 0,02, 0,04, 0,08, 0,16. Há algo de errado neste código que eu não saiba?

(espero que a indentação esteja bem...)

Eu o faço assim . . .

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 

se a OrderSelect() falhar MLots = LotSize ?? por que ? sua indentação não o ajuda a ver o que está acontecendo com suas declarações e aparelhos . . você quis fazer isto ?

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 

Eu fiz isto . . .

if(MLots < 0.001)

. como um método rápido e sujo para evitar problemas de dupla comparação, você já leu isto ?Can price != preço ?

 
RaptorUK:

Eu o faço assim . . .

se a OrderSelect() falhar MLots = LotSize ?? por que ? sua indentação não ajuda você a ver o que está acontecendo com suas declarações e aparelhos . . você quis fazer isso ?

Eu fiz isto . . .

. como um método rápido e sujo para evitar problemas de dupla comparação, você já leu isto ?Can price != preço ?


Olá RaptorUk,

Obrigado por sua pronta resposta.

Portanto, acho que é melhor não fazer uso de outra coisa, pois isso não serve para nada. E obrigado pelo link fornecido.

Melhores egards

Luis

 

Olá RaptorUK,

Eu tenho um problema (mais um.....)

Alguns pedidos fecham antes do tempo, o que eu quero dizer é;

Estas ordens foram abertas e há um limite de abertura de até 6. Todas as ordens devem fechar por meio do TrailingStop, mas as ordens 1. 3 e 5 foram fechadas antes das outras que foram fechadas depois (07:43).

Devido a estas 3 ordens terem fechado antes das outras darem espaço para as ordens abertas 7, 8 e 9 e estas abrirem com um lote baseado no último lote (2,43).

Portanto, até onde entendi as de fechamento errático de ordens às 07:23 não deveriam ter acontecido e não foram encontrados erros...

1 - 49518192013.01.28 19:51vender0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04comprar0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12vender0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20comprar0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27vender0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48comprar2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23vender7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40comprar21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40venda65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

O código para fechar todos eles por meio do TrailingStop é este aqui;

Este código poderia falhar e fechar as ordens em momentos diferentes?

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 

Com a maior consideração

Luis

 
luisneves:


O código para fechar todos eles por meio do TrailingStop é este aqui;

Este código poderia falhar e fechar as ordens em momentos diferentes?

OK, isto não faz sentido. . . um SL móvel é definido de modo que se o preço for com uma ordem o SL é movido em direção ao preço de modo que se o novo SL for atingido haverá menos perdas ou até mesmo um lucro. Por que ter um SL móvel se você está indo para OrderClose() o comércio de qualquer maneira ? para mim isso não é um SL móvel, não é um SL de qualquer tipo já que você está ativamente fechando o comércio através do EA e não do SL.

Talvez suafunção CloseAllOnSL() faça algo diferente do que eu acho que faz, mas, ainda assim, você não tem comentários explicando o que seu código está tentando fazer. Não há Sl móvel, pois não há OrderModify().

 

Leia isto:O que são valores de retorno de função ? Como eu os utilizo ?

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 

Adicione mais informações à declaração de impressão, adicione OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc, etc qualquer informação que você precise para determinar qual era o problema quando o erro ocorreu, você não pode facilmente voltar no tempo e descobrir tudo isso, então quando isso acontecer imprima-o para o log.

 
luisneves:


Portanto, até onde entendi, os de fechamento errático de ordens às 07:23 não deveriam ter acontecido e nenhum erro foi encontrado...

1 - 49518192013.01.28 19:51vender0.01eurusdi1.345471.350471.343472013.01.29 07:231.34347-0.060.000.001.49
2 - 49520362013.01.28 20:04comprar0.03eurusdi1.345791.340791.347792013.01.29 07:431.34421-0.170.00-0.04-3.53
3 - 49520742013.01.28 20:12vender0.09eurusdi1.345481.350481.343482013.01.29 07:231.34348-0.500.000.0013.40
4 - 49520932013.01.28 20:20comprar0.27eurusdi1.345791.340791.347792013.01.29 07:431.34421-1.490.00-0.38-31.74
5 - 49521102013.01.28 20:27vender0.81eurusdi1.345481.350481.343482013.01.29 07:231.34348-4.460.000.00120.58
6 - 49521502013.01.28 20:48comprar2.43eurusdi1.345791.340791.347792013.01.29 07:431.34421-13.370.00-3.43-285.63
7 - 49593372013.01.29 07:23vender7.29eurusdi1.343511.348511.341512013.01.29 07:431.34424-40.100.000.00-395.89
8 - 49598582013.01.29 07:40comprar21.87eurusdi1.343821.344221.345822013.01.29 07:431.34422-120.290.000.00650.79
9 - 49598602013.01.29 07:40venda65.61eurusdi1.343821.348821.341822013.01.29 07:431.34424-360.860.000.00-2 049.95

Mostrar a saída do registro quando isso aconteceu . .
 
RaptorUK:

Leia isto:O que são valores de retorno de função ? Como eu os utilizo ?

Adicione mais informações à declaração de impressão, adicione OrderTicket(), OrderLots(), OrderClosePrice(), Bid, Ask, etc, etc, etc qualquer informação que você precise para determinar qual era o problema quando o erro ocorreu, você não pode facilmente voltar no tempo e descobrir tudo isso, então quando isso acontecer imprima-o para o log.


Olá RaptorUk,

Obrigado por seu tempo.

O código para TrailingStop está em outra parte, o código enviado é apenas para fechar tudo uma vez que o pedido tenha sido fechado por meio do TrailingStop.

No entanto, vou atrás de seu conselho e procuro por qualquer erro que possa dar mais informações adicionais para que os pedidos fechem antes de outros.

A propósito, ao seguir o código faz sentido mudar a posição do MLots = 0; do lugar real para antes do for loop ?

   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 

Com os melhores cumprimentos

Luis

Razão: