Estou tentando criar uma rotina para que todas as ordens fechem no caso de atingir o stop loss. Testando no backtest funciona normalmente, mas operando real/demo não fecha.
Minha estratégia para isso, é buscar no histórico a ultima ordem e verificar se ela fechou com o comentário de [sl], se fechou então fecha todas as ordens abertas, mas não está fechando.
Como resolver isso ?
Olá Fernando,
Eu não li seu código, mas a rotina para fechar todas as Ordens estou colocando abaixo. Então é só encontrar em seu código o momento que você quer que feche todas e inserir a chamada da rotina abaixo PendingOrderDelete();
void PendingOrderDelete() { int o_total=OrdersTotal(); for(int j=o_total-1; j>=0; j--) { ulong o_ticket = OrderGetTicket(j); if(o_ticket != 0) { // delete the pending order negocio.OrderDelete(o_ticket); Print("Ordens não realizadas foram excluídas."); } } }

- www.mql5.com
Olá Fernando,
Dentro do OnTick() o TimeCurrent() é a hora do última cotação recebida pelo ativo , então a condição IF(TimeCurrent() <= DTOrder ) vai dar verdadeira e esporadicamente vai dar falsa, pois se uma COTAÇÃO for recebida pelo TERMINAL quando o OnTick() estiver sendo processado o TimeCurrent() será > que dtOrder. Seu backteste funcionou porque no backteste os TICKS são gerados pelo gerador de ticks e não existe COTAÇÃO , então o TimeCurrent() será sempre <= DTOrder da última posição.
Agora vem o pior, boa sorte mas muito boa sorte mesmo!, quando for deletar o GRID de ORDENS PENDENTES principalmente se for muito grande.... Vez por outra você pode ganhar um 10013 ou 10024. Mas como você em seguida fecha as posições você já sabe as consequências.
Dicas: Comece a DELETAR pelo índice = 0 ou seja a mais antiga ou a que está mais perto do preço de execução.
Olá Fernando,
Dentro do OnTick() o TimeCurrent() é a hora do última cotação recebida pelo ativo , então a condição IF(TimeCurrent() <= DTOrder ) vai dar verdadeira e esporadicamente vai dar falsa, pois se uma COTAÇÃO for recebida pelo TERMINAL quando o OnTick() estiver sendo processado o TimeCurrent() será > que dtOrder. Seu backteste funcionou porque no backteste os TICKS são gerados pelo gerador de ticks e não existe COTAÇÃO , então o TimeCurrent() será sempre <= DTOrder da última posição.
Agora vem o pior, boa sorte mas muito boa sorte mesmo!, quando for deletar o GRID de ORDENS PENDENTES principalmente se for muito grande.... Vez por outra você pode ganhar um 10013 ou 10024. Mas como você em seguida fecha as posições você já sabe as consequências.
Dicas: Comece a DELETAR pelo índice = 0 ou seja a mais antiga ou a que está mais perto do preço de execução.
Ola Rogerio.
A titulo de curiosidade, o que seria "ganhar um 10013 ou 10024"..?

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Estou tentando criar uma rotina para que todas as ordens fechem no caso de atingir o stop loss. Testando no backtest funciona normalmente, mas operando real/demo não fecha.
Minha estratégia para isso, é buscar no histórico a ultima ordem e verificar se ela fechou com o comentário de [sl], se fechou então fecha todas as ordens abertas, mas não está fechando.
Como resolver isso ?