Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Show,
tudo explicado!
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!!!
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!
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?
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...