A EA mistura pedidos de compra e venda - página 3

 
WHRoeder:

int OrderType = OrderType() não está bem, um pode estar escondendo o outro (as declarações locais escondem os globos sem nenhum erro).

int orderType = OrderType()

O código original é . . . .

int orderType;
   for(cnt = total-1; cnt >= 0; cnt--)
   {
      while (!OrderSelect(cnt, SELECT_BY_POS)) {Sleep(500);}
      orderType = OrderType();

. . que é efetivamente o mesmo que o que você está sugerindo ?

Acho que dvarrin está dizendo que seu problema está no número de seu bilhete.

 

não, não é.

Otipo de pedido declarado fora do loop irá efetivamente transferir o valor do OrderType para o próximo ciclo e mesmo que ocorra erro, esse valor entrará no próximo condicional.

Se você declarar dentro do loop com configuração imediata do valor do OrderType() não haverá espaço para tal erro.

(talvez não seja o problema dos OPs, mas pode impedir que outros aconteçam) o que é não tentar?

Também meio segundo no sono é um pouco exagerado. Enquanto o loop deve estar bem com um temporizador de 10 milissegundos para dormir sem nenhum acerto na sua carga de cpu (bem quase :P)

 
forexCoder:

não, não é.

O tipo de pedido declarado fora do loop irá efetivamente transferir o valor do OrderType para o próximo ciclo e mesmo que ocorra erro, esse valor entrará no próximo condicional.

Se você declarar dentro do loop com configuração imediata do valor do OrderType() não haverá espaço para tal erro.

(talvez não seja o problema dos OPs, mas pode impedir que outros aconteçam) o que é não tentar?

Também meio segundo no sono é um pouco exagerado. Enquanto o loop deve estar bem com um temporizador de 10 milissegundos para dormir sem nenhum acerto na sua carga de cpu (bem quase :P)


Suspeito que o problema seja o uso de "pedir confirmação manual" ao testar a EA, mas não entendo o que acontece exatamente.

Tudo que sei é que não há como uma variável chamada OrderType interferir em um método com o mesmo nome e também a localização da declaração não tem nada a ver com meu problema.

O problema é que OrderTicket(), OrderStoploss(), ... não estão fornecendo os dados para a mesma ordem depois de usar OrderSelect().

Se eu usar variáveis locais e defini-las após a chamada para OrderSelect() ele funciona, mas se eu usar diretamente OrderTicket() ou OrderStoploss() ele dá valores errados.


Por que em meu código está OrderStopLoss() devolvendo o stoploss de uma outra ordem dentro da mesma iteração do loop "para"?

 

Aqui está o código completo da EA:

O problema está no primeiro loop "para" do método updateFbOrders().

Para testá-lo, eu adiciono os indicadores jacaré e fractal em um gráfico e encontro um gráfico onde o último fractal ascendente está acima das linhas do jacaré e o último fractal inferior está abaixo das linhas do jacaré.

Em seguida, deve criar ordens de compra e venda pendentes. Se houver uma quebra de um dos fractal, ele abrirá uma ordem imediata.

Em seguida, modificará o prejuízo de cada ordem cada vez que os fractais mudarem, mas define o prejuízo para a ordem errada.

Verifique as janelas de alerta e procure por uma mensagem como esta: Conte: 1 Stoploss 1.41008000 para pedido de compra: 46454014 orderType: 5, e se você verificar o pedido 46454014, verá que na verdade é um pedido de "venda". E continuará modificando os pedidos mesmo que o stoploss não mude, isto porque ele toma o nível de stoploss errado.
Arquivos anexados:
 

Isto é estúpido. Você não está colando o código inteiro.

Você tem um

areBuyOrdersInProfitAt

função, que não vemos no interior, por favor, cole-a. É altamente provável que você tenha cometido um erro em outro lugar. Você está usando a função OrderSelect em outro lugar?

Além disso, onde você define suas variáveis de longSL e shortSL? Por favor, cole também essa parte do código.

EDIT: você colou enquanto eu estava digitando, olhando para o novo post agora.

 
forexCoder:

Isto é estúpido. Você não está colando o código inteiro.

Você tem um

areBuyOrdersInProfitAt

função, que não vemos no interior, por favor, cole-a. É altamente provável que você tenha cometido um erro em outro lugar. Você está usando a função OrderSelect em outro lugar?

Além disso, onde você define suas variáveis de longSL e shortSL? Por favor, cole também essa parte do código.

EDIT: você colou enquanto eu estava digitando, olhando para o novo post agora.

Olá forexCoder

Eu adicionei o EA ao posto anterior.


Mas acho que você apontou o problema: estou usando OrderSelect() no método "areBuyOrdersInProfitAt". :-)))))))))))

 

Sim, como eu pensava.

A função areBuyOrdersInProfitAt contém outra função OrderSelect e substitui a do snippet original. Quando este areBuyOrdersInProfitAt functiopn retorna, a OrderSelect é alterada, assim como o bilhete. Neste caso, você deve estar sempre recebendo a última ordem em sua lista aqui.

 

Assim que você começar a usar OrderSelect em um loop, passando por todas as ordens, você não poderá criar outro OrderSelect para loop dentro dele, pois quando o segundo retornar, você estará usando o ticket da última ordem em seu trade pool.

Você tem aí um código bastante longo, portanto não me apetece muito corrigi-lo (sry:P) mas agora você tem um ponteiro na direção certa.

 
dvarrin:

Mas acho que você apontou o problema: estou usando OrderSelect() no método "areBuyOrdersInProfitAt". :-)))))))))))

É bom saber que você está a caminho de uma solução :-)
 
RaptorUK:
É bom saber que você está a caminho de uma solução :-)
Muito obrigado a todos. Foi realmente um erro estúpido que eu cometi :-((
Razão: