Problemas com OrdersTotal() - página 2

 
Ricardo Rodrigues Lucca #:


Show,

tudo explicado! 

 
Ricardo Rodrigues Lucca #:

Eduardo,

Quando voce esta passando o i de 0 ao total de ordens, voce esta percorrendo uma lista. Como voce esta removendo um elemento da lista voce tem que garantir que o elemento 'i' na próxima iteração não vai ser alterado porque se não voce pulara um elemento.

Veja: 0, 1, 2, 3, 4. Considere isso uma lista de ids, okay?

Quando deletar logando o "i", vai vir 0, 1, 2 e os ids que vão permancer são 1, 3.

Na primeira execução deletou o id 0, na segunda execução por que tu pulou o id 1, vai excluir o de id 2, na terceira execução vai remover o id 4 e terminou a lista. Simples né? Teste de mesa resolve seu problema.

Coloque então depois do OrderDelete, um "i--;" e volta pro seu primeiro for que esse que não atualiza o total vai ti dar dor de cabeça.

EDIT: simplificando a explicação.

Ricardo,

Agradeço muito a sugestão. Fiz o teste e funcionou. Precisei apenas colocar um break para quando o número do ticket == 0


void DeletaOrdens()

  {


   int total = OrdersTotal();


   for(int i = 0 ; i <= total ; i++)


     {

      ulong ticket = OrderGetTicket(i);

      ulong magic = OrderGetInteger(ORDER_MAGIC);

      string symbol = OrderGetString(ORDER_SYMBOL);

      long cicloAtual = StringToInteger(OrderGetString(ORDER_COMMENT));

      Print(i," Ticket: ",ticket," Magic: ",magic," Symbol: ",symbol," Ciclo: ",cicloAtual," Total Ordens: ",OrdersTotal() );

      

      if(symbol == _Symbol && magic == magic_number && cicloAtual == ciclo && ticket > 0)

        {

         trade.OrderDelete(ticket);

      i--;

        } else

            {

cicloEmAndamento = false;

             break;

            }

     }

}


Muito obrigado!!!

 
Eduardo Vianna #:

Ricardo,

Agradeço muito a sugestão. Fiz o teste e funcionou. Precisei apenas colocar um break para quando o número do ticket == 0


void DeletaOrdens()

  {


   int total = OrdersTotal();


   for(int i = 0 ; i <= total ; i++)


     {

      ulong ticket = OrderGetTicket(i);

      ulong magic = OrderGetInteger(ORDER_MAGIC);

      string symbol = OrderGetString(ORDER_SYMBOL);

      long cicloAtual = StringToInteger(OrderGetString(ORDER_COMMENT));

      Print(i," Ticket: ",ticket," Magic: ",magic," Symbol: ",symbol," Ciclo: ",cicloAtual," Total Ordens: ",OrdersTotal() );

      

      if(symbol == _Symbol && magic == magic_number && cicloAtual == ciclo && ticket > 0)

        {

         trade.OrderDelete(ticket);

      i--;

        } else

            {

cicloEmAndamento = false;

             break;

            }

     }

}


Muito obrigado!!!

Se quiser eliminar esse break, eu mudaria o for pro seu valor da primeira tentativa como tinha dito antes:   for(int i = 0 ; i < OrdersTotal() ; i++)

Lembrando que o i nao pode ser igual a OrdersTotal porque se nao teriamos um elemento a mais... Mas se ja ta funcionando, parabens!

 
Rogerio Giannetti Torres #:
Alguém pode me ajudar a eliminar uma função de repetição de ordem?
Meu robô emite ordem de compra ou venda e após o fechamento seja no lucro ou no prejuizo ele reabre a ordem. enquanto deveria aguardar um novo sinal para faze-lo, alguém sabe como resolver ou onde posso resolver no código e qual parte dele devo modificar?
 
Thiago Victor Oliveira Santos #:
Alguém pode me ajudar a eliminar uma função de repetição de ordem?
Meu robô emite ordem de compra ou venda e após o fechamento seja no lucro ou no prejuizo ele reabre a ordem. enquanto deveria aguardar um novo sinal para faze-lo, alguém sabe como resolver ou onde posso resolver no código e qual parte dele devo modificar?

Não roube o topico do colega, abra um topico seu e dando mais informações. Seria em mt5? Voce que fez o robo ou comprou de alguem? etc...

Razão: