OrderSend() perguntas - página 8

 

Enquanto esperamos por um artigo sobre este assunto, compreendo correctamente o conceito geral de análise de operações comerciais.

...
bool AllowTrade = true;
ulong OrderTicket;
...
void OnTick() {
  ...
  if (!AllowTrade) return;
  ...
  MqlTradeResult Result;
  if (OrderSend(...)) {
    Ticket = Result.order;
    AllowTrade = false;
  }
}
...
void OnTrade() {
  if (AllowTrade) return;
  if (OrderSelect(Ticket)) {
    if (...)
    ...
    // AllowTrade = true|false;
  }
  else AllowTrade = true;
}
...

Isto é, grosso modo, depois de enviar uma ordem sem analisar o código retc, proibimos operações comerciais no circuito de trabalho (OnTick()) usando a bandeira "AllowTrade".

A proibição de comércio só é desbloqueada no OnTrade() depois de o número de encomenda ter sido encontrado e de ter sido feita alguma análise do seu destino.

Temos duas questões:

1. Qual é o bilhete de encomenda a ser verificado no OnTrade? Quais são os estados finais na sua vida útil?

2. Eu sei que a fila de eventos Tick (OnTick) pode "cair". Ou seja, se outro evento Tick chegar e a função OnTick (do Tick anterior) ainda não tiver terminado o seu trabalho, o evento actual será "largado", ou seja, não será processado. Existe uma abordagem semelhante com eventos comerciais (OnTrade)? Isto é, é possível que, por exemplo, no laço principal eu coloque uma proibição de comércio e o evento OnTrade na ordem recém enviada "cai", porque no momento da sua chegada eu ainda estarei processando algo no mesmo tick que o envio da ordem comercial correspondente?

 
voix_kas: Isto é, existe a probabilidade de, por exemplo, eu colocar uma proibição de comércio no laço principal e o evento OnTrade na ordem apenas enviou "desiste", porque no momento da sua chegada ainda estarei a processar algo no mesmo tick que o envio da ordem comercial correspondente?

Ainda não lidei com este tópico, mas eis o que diz o Manual:

1) O comprimento da fila de transacções é de 1024 artigos. Se a OnTradeTransaction() demorar demasiado tempo a processar outra transacção, as antigas transacções na fila podem ser substituídas por novas transacções;

2) A OnTrade é chamada após as chamadas adequadas da OnTradeTransaction.

 
Yedelkin:

Ainda não lidei com este tópico, mas eis o que diz o Manual:

1) O comprimento da fila de transacções é de 1024 artigos. Se a OnTradeTransaction() demorar demasiado tempo a processar outra transacção, as antigas transacções na fila podem ser substituídas por novas transacções;

2) A OnTrade é chamada após as chamadas adequadas da OnTradeTransaction.

Geralmente entendido. Como opapaklass já assinalou e disse no artigohttps://www.mql5.com/ru/articles/232:

Só há uma forma garantida de descobrir exactamente o que mudou numa conta comercial. Assim, é recordar o estado do comércio e da história comercial e comparar o novo estado com o estado salvo.

Mais um bloco de serviço no Expert Advisor. :(

Na verdade, a questão é esta. Podemos reduzir o tamanho do código sem analisar todas as variáveis (encomendas/contratos/posições), e concentrarmo-nos apenas no número de encomenda obtido a partir do resultado do OrderSend? Ou este número pode ser não único/não estar reflectido na história?

 
voix_kas: Podemos reduzir o tamanho do código sem analisar todas as variáveis (encomendas/operações/posições), e concentrarmo-nos apenas na encomenda cujo número é obtido a partir do resultado do OrderSend? Ou este número pode ser não único/não estar reflectido na história?

Claro que sim. Se um pedido comercial resultar na recepção de um bilhete de encomenda, então este bilhete é único, e todo o destino da encomenda pode ser rastreado por ele.

Aqui pode ver como o bilhete de encomenda é utilizado no histórico: Referência MQL5 / Funções de negociação / HistoryOrderGetInteger

 
Yedelkin:
Claro que sim. Se um pedido comercial tiver resultado num bilhete de encomenda, então esse bilhete é único e pode ser utilizado para seguir todo o destino da encomenda.
Só para informação. Caso a ordem não tenha sido aceite pelo servidor para execução, por exemplo, um requote, a variável MqlTradeResult.order tem um valor por defeito (por exemplo, "0")?
 
voix_kas: No caso de uma ordem não ter sido aceite pelo servidor para execução, por exemplo, um requote, é atribuída à variável MqlTradeResult algum valor por defeito (por exemplo, "0")?
Uma variável do tipo MqlTradeResult é normalmente zerada antes de ser utilizada. Portanto, o campo Result.order contém um valor zero. Nunca vi este campo ter um valor diferente após o envio sem sucesso de um pedido comercial.
Документация по MQL5: Торговые функции / OrderSend
Документация по MQL5: Торговые функции / OrderSend
  • www.mql5.com
Торговые функции / OrderSend - Документация по MQL5
 
Yedelkin:
Uma variável do tipo MqlTradeResult é normalmente zerada antes de ser utilizada. Portanto, o campo Result.order contém valor zero. Nunca vi este campo ter um valor diferente após o envio sem sucesso de um pedido comercial.
Se não se importa, gostaria de aprofundar a questão da interpretação dos códigos de retorno. 24 das 30 respostas declaradas (esperemos que não encontremos respostas não declaradas) indicam claramente uma falha na colocação de encomendas. Os outros 6: 1. TRADE_RETCODE_PLACED Suponha que não colocamos encomendas pendentes. Esta resposta é possível no comércio de mercado (SYMBOL_TRADE_EXECUTION_MARKET)? 2. TRADE_RETCODE_DONE Nada mais pode ser verificado. Tudo correu exactamente como descrito pelo consultor especializado. 3. TRADE_RETCODE_DONE_PARTIAL Presumo que esta resposta é semelhante a TRADE_RETCODE_DONE dado o modo ORDER_FILLING_IOC, se negociar sem ordens pendentes. 4. TRADE_RETCODE_ORDER_CHANGED Isto significa uma rejeição inequívoca da nossa ordem comercial? 5. TRADE_RETCODE_LOCKED Penso que este é o pior caso. O que devemos fazer neste caso? Sugiro que o número de encomenda ainda não está disponível. O fluxo comercial é intenso. Não podemos negociar e não é claro como podemos saber que o fluxo comercial está desbloqueado. 6. TRADE_RETCODE_FROZEN Significa isto uma rejeição inequívoca da nossa ordem comercial? Comente por favor cada item.
 

voix_kas: Если не возражаете, хотелось бы углубиться в вопрос интерпритации кодов возврата. Из 30 задекларированных вариантов ответа (будем надеятся, что с недекларированными мы не столкнёмся) 24 - указывают на явный отказ в размещении ордера. Остальные 6:  

1. TRADE_RETCODE_PLACED Assumir que não há ordens pendentes. Esta resposta é possível durante a negociação no mercado (SYMBOL_TRADE_EXECUTION_MARKET)?

TRADE_RETCODE_DONE Nada mais pode ser verificado. Tudo correu exactamente como o Conselheiro Especialista pediu.

3. TRADE_RETCODE_DONE_PARTIAL Assumo que esta resposta é a mesma que TRADE_RETCODE_DONE dado o modo ORDER_FILLING_IOC.

4. TRADE_RETCODE_ORDER_CHANGED Isto significa uma rejeição inequívoca da nossa ordem comercial?

5. TRADE_RETCODE_LOCKED Penso que este é o pior caso. O que devemos fazer neste caso? Sugiro que o número de encomenda ainda não está disponível. O fluxo comercial é intenso. Não podemos negociar, e não é claro como devemos saber se o fluxo comercial está desbloqueado.

6. TRADE_RETCODE_FROZEN Significa isto uma rejeição inequívoca da nossa ordem comercial?

Por favor, comente cada item.

Infelizmente, o meu conhecimento não é suficiente para um comentário completo sobre cada ponto. Bem, se algo acontecer, os meus colegas irão corrigi-lo.

1. O fórum mencionou uma vez uma situação em que uma conta de negociação pode ser aberta com um sub-corretor. Neste caso, o sub-empresário pode enviar o pedido comercial para processamento posterior (ao corretor) e enviar TRADE_RETCODE_PLACED para o terminal do cliente. Não se sabe se o corretor acabará por processar um pedido comercial deste tipo.

2. Sim, eu também penso assim. A única coisa que devemos lembrar é que a informação sobre esta encomenda será recebida na base de dados do terminal de forma assíncrona.

Penso que estamos a falar da execução parcial de um pedido comercial nos modos ORDER_FILLING_IOC e ORDER_FILLING_RETURN.

4. https://www.mql5.com/ru/forum/1111/page124#comment_18407

5. Não sei absolutamente nada sobre este código. Tecnicamente, verifica-se que o pedido não foi processado devido a algumas razões internas do corretor. Se será processado mais tarde não é claro. Eu próprio equiparo este código à rejeição de um pedido comercial.

6. https://www.mql5.com/ru/forum/1111/page123#comment_18372

..E em geral - tente uma pesquisa por palavra-chave do fórum. Pode encontrar muito mais informações :)

 
Yedelkin:

Infelizmente, não tenho conhecimento suficiente para comentar plenamente cada um dos pontos. Bem, se alguma coisa, os colegas irão corrigi-la.

1. O fórum mencionou uma vez uma situação em que uma conta de negociação pode ser aberta com um sub-corretor. Neste caso, o sub-empresário pode enviar o pedido comercial para processamento posterior (ao corretor) e enviar TRADE_RETCODE_PLACED para o terminal do cliente. Não se sabe se o corretor acabará por processar um pedido comercial deste tipo.

2. Sim, eu também penso assim. A única coisa que devemos lembrar é que a informação sobre esta encomenda será recebida na base de dados do terminal de forma assíncrona.

Penso que estamos a falar da execução parcial de um pedido comercial nos modos ORDER_FILLING_IOC e ORDER_FILLING_RETURN.

4. https://www.mql5.com/ru/forum/1111/page124#comment_18407

5. Não sei absolutamente nada sobre este código. Tecnicamente, verifica-se que o pedido não foi processado devido a algumas razões internas do corretor. Se será processado mais tarde não é claro. Eu próprio equiparo este código à rejeição de um pedido comercial.

6. https://www.mql5.com/ru/forum/1111/page123#comment_18372

..E em geral - tente uma pesquisa por palavra-chave do fórum. Pode encontrar muito mais informações :).

Aqui temos o seguinte: 26 dos 30 códigos (incluindo TRADE_RETCODE_ORDER_CHANGED e TRADE_RETCODE_FROZEN) representam uma recusa explícita do pedido (não gera uma ordem).

TRADE_RETCODE_DONE e TRADE_RETCODE_DONE_PARTIAL - ordem criada garantida.

Como executar correctamente TRADE_RETCODE_PLACED (não pendente) e TRADE_RETCODE_LOCKED é uma questão. Os comentários da MQ sobre estes dois códigos seriam apreciados.

 
Isso é fixe, Feliz Ano Novo #2015 a todos, mas pergunto-me como terá acabado. Tem sido dois anos de silêncio....