Minha EA faz uma entrada dupla - página 8

 
angevoyageur:

1) Não creio que esteja relacionado com a questão deste tópico. A questão que recebemos é no caso de um pedido ter sido atendido com sucesso e uma vaga ser aberta. Mas esta posição é aberta no servidor comercial, o problema que encontramos é quando há um atraso mais importante como de costume e o terminal MT5 é notificado desta nova posição DEPOIS de um novo tick já ter sido processado.

2) ... na minha opinião, é uma plataforma pobre, projetada para permitir explicitamente solicitações comerciais síncronas e assíncronas ...

3) ... o ResultRetCode é síncrono, é a atualização do banco de dados MT5 sobre posição (negócio e ordem) que é assíncrono ...

1) Discordo, e lamento a ignorância, mas como você está tão certo de que a posição é aberta após PositionOpen() no servidor de negociação sem verificar duas vezes o ResultRetcode()?

2) Concordo 100%.

3) Para ter certeza de que ResultRetCode() é síncrono, quero dizer que para verificar o código de resultado você (mestre) deve consultar o servidor (escravo) com várias mensagens "assíncronas".

 
figurelli:

1) Discordo, e lamento a ignorância, mas como você está tão certo de que a posição é aberta após PositionOpen() no servidor comercial sem verificar duas vezes o ResultRetcode()?

2) concordo 100%.

3) Para ter certeza de que ResultRetCode() é síncrono, quero dizer que para verificar o código de resultado você (mestre) deve consultar o servidor (escravo) com várias mensagens "assíncronas".

1) Este tópico é sobre uma entrada dupla, portanto estamos falando de uma solicitação de pedido que foi bem sucedida. Eu nunca escrevi que não é necessário verificar duas vezes o ResultRetCode(), eu escrevi exatamente o contrário. Mas isto NÃO está relacionado com a entrada dupla, por definição. Não é óbvio?

3) Provavelmente é um detalhe(incompreensão?) , mas o que você escreveu não faz sentido. Na primeira parte de sua frase você disse que ResultRetCode() é síncrono, na segunda você disse que "código de resultado" que é o mesmo que ResultRetCode() é obtido de forma assíncrona. Não há comunicação EM TUDO entre o servidor e o terminal para obter este valor (Retcode).

CTrade.PositionOpen() por padrão é síncrono, isto significa que a classe subjacente usa OrderSend(). Que envia o pedido de ordem e aguarda a resposta do servidor. O servidor retorna o resultado para o terminal, e o código EA continua (com valor retornado verdadeiro ou falso). A comunicação mestre/escravo está terminada. Depois disso, você pode verificar o ResultRetcode, que já está disponível localmente.

Documentation on MQL5: Trade Functions / OrderSend
Documentation on MQL5: Trade Functions / OrderSend
  • www.mql5.com
Trade Functions / OrderSend - Documentation on MQL5
 
@figurelli: Parabéns por se tornar Moderador ... .
 
Há um tempo limite para a vaga em aberto?
 
doshur:
Há um tempo limite para a vaga em aberto?
Olá doshur, o que você quer dizer exatamente com "timeout"?
 
Malacarne:
Olá doshur, o que você quer dizer exatamente com "timeout"?
Como se não houvesse resposta do servidor
 
angevoyageur:

1) Este tópico é sobre uma entrada dupla, por isso estamos falando de um pedido de pedido que foi bem sucedido. Eu nunca escrevi que não é necessário verificar duas vezes o ResultRetCode(), eu escrevi exatamente o contrário. Mas isto NÃO está relacionado com a entrada dupla, por definição. Não é óbvio?

3) Provavelmente é um detalhe(incompreensão?) , mas o que você escreveu não faz sentido. Na primeira parte de sua frase você disse que ResultRetCode() é síncrono, na segunda você disse que "código de resultado" que é o mesmo que ResultRetCode() é obtido de forma assíncrona. Não há comunicação EM TUDO entre o servidor e o terminal para obter este valor (Retcode).

CTrade.PositionOpen() por padrão é síncrono, isto significa que a classe subjacente usa OrderSend(). Que envia o pedido de ordem e aguarda a resposta do servidor. O servidor retorna o resultado para o terminal, e o código EA continua (com valor retornado verdadeiro ou falso). A comunicação mestre/escravo está terminada. Depois disso, você pode verificar o ResultRetcode, que já está disponível localmente.

Alain,

Cerca de 1) Eu ainda discordo, já que para mim o código original de
doshur não verifica ResultRetCode() e ele está procurando uma solução para a "entrada dupla", e para mim temos que abordar este é o código dele (como Malacarne propôs). Portanto, para mim isso não é tão óbvio.

Sobre 3) Você escreveu "Entretanto o ResultRetCode é síncrono, é a atualização do banco de dados MT5 sobre posição (negócio e ordem) que é assíncrono", então minha resposta foi sobre esta frase.

De qualquer forma,nosso debate se parece com a história sobre a meia xícara de água: alguns a verão como meio cheia e outros como meio vazia, mas é uma questão de se considerar o copo como sendo meio cheio, ou como sendo meio vazio ;-)))

Portanto, para ser honesto, não acredito que este debate seja produtivo e/ou deva continuar (pelo menos aqui neste tópico), uma vez que podemos voltar a trabalhar em soluções alternativas, portanto, por favor, lamento por criar tal controvérsia e por favor, prossiga com sua linha de pensamento, que eu acho que será mais adequada para ajudaro doshur e outros caras com o mesmo problema.

 
Ubzen:
@figurelli: Parabéns por se tornar Moderador ... .
Ubzen, muito obrigado, mas ainda acredito que este é apenas um grave bug mql5.com ;-))
 

Bem, todo o trabalho de volta postado é muito bom. Agradeço e aprendo algumas idéias ao longo do caminho.

Vocês são úteis.

Meu EA parece estar mais resistente agora.

 
figurelli:
...

Portanto, para ser honesto, não acredito que este debate seja produtivo e/ou deva continuar (pelo menos aqui neste tópico), uma vez que podemos voltar a trabalhar em soluções alternativas, portanto, por favor, lamento por criar tal controvérsia e por favor, prossiga com sua linha de pensamento, que eu acho que será mais adequada para ajudaro doshur e outros caras com o mesmo problema.

Eu concordo plenamente com isso. Não se preocupe e vá em frente.