OnTradeTransaction - página 2

 
Игорь Герасько:

Por um lado, sim. Por outro lado: e nos casos em que um pedido foi enviado ao servidor, mas a operação ainda não foi executada? Como podemos saber onde estamos se só temos uma lista de pedidos e posições (e histórico da conta)?

Não existe tal problema no MT4, porque todas as operações comerciais lá são síncronas. Mas como resultado, obtemos um desempenho mais lento.

O fato de as operações assíncronas serem mais rápidas que as síncronas é um mito que vem da ignorância do que está acontecendo. As operações assíncronas têm um ciclo completo de condução de uma ação comercial dividida em várias partes, enquanto as síncronas têm apenas um ciclo. A operação assíncrona também requer a resposta do servidor, a execução na troca é a mesma, ou seja, o tempo total necessário para a operação assíncrona e síncrona é quase o mesmo. A vantagem das ordens assíncronas é a possibilidade de enviá-las simultaneamente, ou seja, é possível enviar duas ou mais ordens quase ao mesmo tempo. Isto é o que torna possível alcançar uma alta velocidade de operação (no total). Nem todos os Expert Advisor requerem o modo de envio assíncrono. Em primeiro lugar, é necessário para vários comerciantes de arbitragem onde é necessário comprar dois ou mais instrumentos ao mesmo tempo, ou algoritmos HFT. Por exemplo, o bot HFT pode enviar uma ordem para entrar no mercado, e em 3-4 msec pode enviar a ordem oposta, caso em que é muito tempo para esperar a resposta do servidor na primeira ordem, de modo que requer um modo assíncrono de envio - sem esperar pelo resultado. Na grande maioria dos EAs, tais velocidades não são necessárias.

 
Vasiliy Sokolov:
Você também não sabe como fazer isso. Você já escreveu dezenas de páginas sobre a OnTradeTransaction, mas não entendeu uma coisa: a OnTradeTransaction é uma função de serviço para resolver tarefas específicas, você não pode usá-la na negociação como você faz. E então os caras espertos lêem seus artigos e criam tópicos similares: "Por que a OnTradeTransaction não é garantida" - porque um Expert Advisor não deve criar seu ambiente comercial através da OnTradeTransaction, como você faz, mas confiar apenas no que está disponível no sistema, em particular no histórico de ordens e negócios.

E é aí que o Ostap se engana....

Se você tem um ressentimento pessoal contra mim, não há necessidade de trazê-lo para uma discussão

de problemas técnicos nos quais você é "altamente adepto"...

Você é quem engana as pessoas com suas teses insistentes!

 
Михаил:

E é aí que o Ostap o obtém....

Se você tem um ressentimento pessoal contra mim, não há necessidade de trazê-lo para uma discussão

de problemas técnicos nos quais você é "altamente adepto"...

Você está apenas enganando as pessoas com suas teorias assertivas!

Misha, hey! Como foi sua viagem à Fórmula 1? Como estava o tempo em Sochi?
 
Vasiliy Sokolov:
Misha, olá! Como foi sua viagem à Fórmula 1? Como estava o tempo em Sochi?

Hi!

Ótimo! Tinha nadado no mar (a água estava a 24 graus).

 
Михаил:

Hi!

Ótimo! Tinha nadado no mar (a água estava a 24 graus).

Legal, essa água é muito quente!

Com toda a seriedade - não tenho nenhuma queixa contra você. Se você quiser argumentar sobre os méritos - bem-vindo. Além disso, eu não tenho nenhum desejo de ensinar alguém. Cada um tem sua própria bicicleta com rodas quadradas.

 
Vasiliy Sokolov:

Se o tempo entre o envio da ordem e o próximo sinal de entrada no mercado exceder o tempo de execução da ordem, nada precisará ser feito. A lógica aqui é simples: enviamos uma ordem assíncrona, saímos da linha e a esquecemos. Esperamos pelo próximo momento para verificar o sinal. Se naquele momento o ambiente comercial não mudou - o Expert Advisor procura um sinal para entrar novamente no mercado e repete a ordem para entrar no mercado. Se, pelo contrário, tudo correu bem e a ordem foi executada, o consultor especializado perceberá que tem uma posição após analisar o ambiente e não abrirá uma nova posição novamente. Ou seja, nesta abordagem, a condição do Expert Advisor é garantida de ser consistente com o ambiente do mercado.

A situação é mais complicada no comércio de alta freqüência, onde um novo sinal pode ocorrer após um tempo comparável à execução de uma ordem (6-100 msec). Neste caso, você não pode passar sem travamento. O Consultor Especialista deve se lembrar da hora do último envio do pedido. Se ocorrer um erro na OnTransaction, o bloqueio é reiniciado e o Expert Advisor pode realizar operações novamente.

Deve-se notar que a OnTradeTransacton, pela qual tantas pessoas gostam de rezar, não ajuda na HFT. Um novo sinal de entrada pode chegar mais rápido do que a resposta sobre a execução bem sucedida de uma transação na OnTradeTransaction. O bloqueio é necessário quer você use ou não a OnTradeTransacton.

Como, você pode perguntar, podemos controlar os erros que surgem na OnTradeTransaction? Você pode responder com uma contra-question: Como você mudará a lógica comercial do Expert Advisor on the fly quando ocorrer um erro? - Você não pode. Os erros ocorrem se você não fizer verificações apropriadas antes (presença de dinheiro, volume, etc., etc.). Mas uma vez ocorrido, você não será capaz de corrigi-lo. Portanto, a melhor coisa que você pode fazer na OnTradeTransaction, é imprimir este erro no log (para corrigir a lógica do Expert Advisor mais tarde), e remover a fechadura, se ela for usada. Para isso e nada mais, a OnTradeTransaction deve ser utilizada.

Agora vários adeptos de Mikalas virão correndo e começarão a jogar tomates contra mim - deixe-os. Mas eu sempre repeti que uma lógica comercial confiável só pode ser organizada se for baseada no ambiente comercial do terminal. Tudo o resto - não funciona.

Eu não entendo bem o que o tempo entre os sinais tem a ver com isso? Cada sinal comercial tem seu tempo de registro. Uma vez que o sinal é registrado (apareceu), é necessário realizar uma operação comercial. Como resultado, o Expert Advisor envia uma ordem comercial para o servidor e trabalha mais adiante. A ordem ainda não foi executada pelo servidor. Um novo tique vem aí. O Conselheiro Especialista reanalisa seu estado e descobre que há um sinal de abertura, mas não há posição (ou ordem) correspondente entre as ordens de trabalho.

Minha pergunta é: como o Expert Advisor pode determinar sem usar os dados da OnTrade ou OnTradeTransaction por que não há posição? Pode haver várias razões:

1. O pedido de abertura foi enviado ao servidor, mas o servidor ainda não deu uma resposta sobre o resultado da execução do pedido. Temos que esperar pela resposta.

2. A solicitação ainda não foi enviada para o servidor. Os pedidos precisam ser enviados.

3. O pedido foi enviado, o servidor responde que o pedido não pode ser executado. A mensagem de erro deve ser processada e uma decisão deve ser tomada quanto ao que fazer em seguida.

4. O pedido foi enviado, mas o servidor não responde por muito tempo (cada um define este tempo ele mesmo, o meu é de 1 minuto) (timeout).

Não vejo nenhuma solução sem usar a OnTrade ou a OnTradeTransaction. Mas você afirma que existe um. Favor explicar qual deles. Como é estranho falar de travamento de rosca em MQL4/5 - não há duas ou mais roscas aqui, há apenas uma rosca. Além disso, você opera com expressões como "se tudo correr bem e a ordem for executada", mas você não explica como ela é determinada. E essa é a essência da minha pergunta.

 
Игорь Герасько:

Não está muito claro o que o tempo entre as ocorrências de sinais tem a ver com isso? Cada sinal comercial tem seu próprio tempo de registro. Uma vez que o sinal é registrado (ocorrido), é necessário realizar uma operação comercial. Como resultado, o Expert Advisor envia uma ordem comercial para o servidor e trabalha mais adiante. A ordem ainda não foi executada pelo servidor. Um novo tique vem aí. O Conselheiro Especialista reanalisa seu estado e descobre que há um sinal de abertura, mas não há posição (ou ordem) correspondente entre as ordens de trabalho.

Minha pergunta é: como o Expert Advisor pode determinar sem usar os dados da OnTrade ou OnTradeTransaction por que não há posição? Pode haver várias razões:

1. O pedido de abertura foi enviado ao servidor, mas o servidor ainda não deu uma resposta sobre o resultado da execução do pedido. Temos que esperar pela resposta.

2. A solicitação ainda não foi enviada para o servidor. Os pedidos precisam ser enviados.

3. O pedido foi enviado, o servidor responde que o pedido não pode ser executado. A mensagem de erro deve ser processada e uma decisão deve ser tomada quanto ao que fazer a seguir.

4. O pedido foi enviado, mas o servidor não responde por muito tempo (cada um define este tempo ele mesmo, o meu é de 1 minuto) (timeout).

Não vejo nenhuma solução sem usar a OnTrade ou a OnTradeTransaction. Mas você afirma que existe um. Favor explicar qual deles. Como é estranho falar de travamento de rosca em MQL4/5 - não há duas ou mais roscas aqui, há apenas uma rosca. Além disso, você opera com expressões como "se tudo correr bem e a ordem for executada", mas você não explica como ela é determinada. E essa é a essência da minha pergunta.

Não estou me referindo ao bloqueio do fio, mas ao bloqueio do envio da ordem de comércio.

Uma pergunta dupla: suponha que um consultor especializado tenha determinado a razão pela qual uma ordem de comércio não pode ser executada (o mercado está fechado, não há dinheiro, etc.), e a seguir? Como o Consultor Especialista irá melhorar a situação? Irá adicionar dinheiro à conta ou abrir o mercado? Como o conhecimento da causa do último pedido enviando erro ajudará o Consultor Especialista a negociar ainda mais?

 
Vasiliy Sokolov:

O que se pretende não é bloquear o fluxo, mas bloquear o envio da ordem de comércio.

Eis a questão: se o servidor retorna um erro de execução de ordem, como podemos descobrir para desbloquear a capacidade de enviar uma segunda ordem? Mais uma vez, se OnTrade e OnTradeTransaction não forem utilizadas.

Outra pergunta: Suponha que o Expert Advisor tenha determinado a razão pela qual uma ordem não pode ser executada (o mercado está fechado, não há dinheiro, etc.), o que segue? Como o Consultor Especialista irá melhorar a situação? Irá adicionar dinheiro à conta ou abrir o mercado? Como o conhecimento da causa do erro do último pedido ajudará o Expert Advisor a negociar ainda mais?

Isso vai ajudar muito. Deixaremos a falta de dinheiro, pois o consultor especializado deve determinar este ponto antes de enviar uma ordem de comércio e informar o comerciante com uma mensagem (ou por algum outro meio). Assim, a ordem comercial não é enviada de forma alguma.

A mensagem de erro pode nos informar se devemos continuar a tentar enviar pedidos. Por exemplo, se o mercado estiver fechado, não há necessidade de reenviar o pedido imediatamente. Você deve parar a negociação por algum tempo (é determinado pelo desenvolvedor do Expert Advisor), e só então enviar um novo pedido (se o sinal de negociação ainda estiver ativo). Se ocorrer uma solicitação, você pode enviar um novo pedido imediatamente. Se houve um erro na definição das paradas (Nível de parada ou Nível de congelamento mudou durante o tempo de envio do pedido), as paradas são corrigidas de acordo com os novos dados e um novo pedido é enviado imediatamente.

Portanto, o conhecimento de um erro comercial (em geral - qualquer erro) e seu processamento adequado é um pré-requisito para a operação de qualquer programa "normal".

 
Игорь Герасько:

Eis a questão: se o servidor retornar um erro de execução de ordem, como saberei sobre ele para desbloquear a capacidade de reenviar a ordem? Mais uma vez, se OnTrade e OnTradeTransaction não forem utilizadas.

Muito útil. Deixaremos a falta de dinheiro, pois o consultor especializado deve detectar este ponto antes de enviar uma ordem comercial e informar o comerciante com uma mensagem (ou por algum outro meio). Assim, a ordem comercial não é enviada de forma alguma.

A mensagem de erro pode nos informar se devemos continuar a tentar enviar pedidos. Por exemplo, se o mercado estiver fechado, não há necessidade de reenviar o pedido imediatamente. Você deve parar a negociação por algum tempo (é determinado pelo desenvolvedor do Expert Advisor), e só então enviar um novo pedido (se o sinal de negociação ainda estiver ativo). Se ocorrer uma solicitação, você pode enviar um novo pedido imediatamente. Se houve um erro na definição das paradas (Nível de parada ou Nível de congelamento mudou durante o tempo de envio do pedido), as paradas são corrigidas de acordo com os novos dados e um novo pedido é enviado imediatamente.

Portanto, o conhecimento de um erro comercial (em geral - qualquer erro) e seu correto processamento é uma condição necessária para o funcionamento de qualquer programa "normal".

Se o mercado estiver fechado, temos que verificar isto antes de enviar o pedido.

Em outros casos, a ordem comercial deve ser reenviada. Assim, todos os erros podem ser divididos em duas categorias:

  1. Erros, cuja ocorrência pode ser prevista antes do envio do pedido;
  2. Erros que não podem ser previstos no momento do envio do pedido, por exemplo, solicitações.

Se um Expert Advisor recebeu um erro do segundo tipo, suas ações devem ser sempre as mesmas e não dependem do tipo de erro: Nomeadamente, ele deve repetir sua ordem comercial esperando que ela seja executada desta vez. Antes de enviar uma ordem comercial, o Consultor Especialista deve controlar o primeiro tipo de erros. Portanto, o Expert Advisor não tem necessidade de corrigir seu comportamento, dependendo do tipo de erro retornado na OnTradeTransaction. Entretanto, você pode notificar o usuário sobre erros que surjam na OnTradeTransaction e reiniciar o bloqueio na realização de uma nova operação comercial se a operação anterior acabar com um erro do segundo tipo. Neste caso, se a OnTradeTransaction não ocorrer por algum motivo, a fechadura ainda deve ser reajustada por um tempo limite. Assim, não importará se a OnTradeTransaction vem ou não, apenas que com a OnTradeTransaction as ordens repetidas serão executadas na velocidade mais rápida possível.

s.w. FreezeLevel também deve ser analisado antes que o pedido seja enviado.

 
Como posso saber naOnTradeTransaction () que o SL/TP foi acionado?
Razão: