MT5 e velocidade em ação - página 7

 
fxsaber:

Você não entende nada. Quando voltamos, estamos entrando no On-funcionamento da fila gerada. Isto pode causar uma pausa que impede que o primeiro OrderSend envie o segundo correto.

Em que consiste a pausa/atraso? Na cópia de 3 estruturas?

OnTradeTransaction( параметры )
{
        поместить параметры в очередь
        OnMain();
}

Você propõe acumular a fila salvando todas as On-funções após o retorno, aguardando a On-função, que dirá que o primeiro OrderSend está terminado. E depois envie apenas o segundo OrderSend.

Não é necessário acumular todos os eventos. Não espere pelo próximo evento para copiar - você pode processar os eventos antes de retornar e enviar o segundo OrderSend assim que os pré-requisitos chegarem para isso

Você também não percebe que a tomada de posição pode ser executada durante a primeira OrderSend, mas sua OnTradeTransaction estará na fila mais tarde (no mesmo microssegundo, mas mais tarde) que a OnTradeTransaction final da primeira OrderSend.

E como isso o ajuda em tal situação?

bool HandleNextEvent(ENUM_EVENT_TYPE);

Será a última, tanto aqui como ali

 
fxsaber:

Você não entende nada. Quando voltamos, estamos entrando no On-funcionamento da fila gerada. Isto pode causar uma pausa que impede o primeiro OrderSend de enviar o segundo correto imediatamente após o primeiro.

Você se propõe a acumular a fila salvando todas as funções On-funções após o retorno, aguardando o On-funcionamento, no qual haverá uma mensagem sobre o fim do primeiro OrderSend. E depois envie apenas o segundo OrderSend.

Ao mesmo tempo, você não entende que a tomada de posição pode ser executada durante a primeira OrderSend, mas sua OnTradeTransaction estará na fila mais tarde (no mesmo microssegundo, mas mais tarde) do que a OnTradeTransaction final da primeira OrderSend.

Não há fila de espera. O novo evento será processado após o atual, e todos os eventos que ocorreram durante este período serão ignorados.

 
A fila, ou pilha, é formada por você, MQ não faz isso.
 

Na minha opinião, a solução para o problema seria poder "assinar" um pedido. Ou seja, para que o terminal gere um evento quando ocorre uma transação em um pedido.

Mas isto deve ser implementado pelos desenvolvedores, não por nós. Todas as nossas soluções, de uma forma ou de outra, voltarão à história dos negócios. Eu não tenho uma criticidade tão microssegunda, mas é realmente

Mas é realmente irritante escrever bicicletas complexas para descobrir se um acordo é aprovado ou não, se os níveis são acionados ou se alguém corrigiu uma posição no terminal.

Embora parecesse uma coisa simples - um evento sobre um comércio sobre uma posição - e tudo seria muito mais fácil.

 
Maksim Emeliashin:

Mas cabe aos desenvolvedores implementar isto, não a nós.

Os desenvolvedores devem fornecer apenas as ferramentas. MQL é essencialmente uma linguagem de programação de baixo nível (assim como C++). Você o utiliza não em termos de tarefas, mas em termos de cálculos. E você toma todas as decisões de alto nível por conta própria. Você pode não ter ferramentas, mas não soluções prontas

 
A100:

Qual é o tempo de pausa? Na cópia de 3 estruturas?

No processamento de uma fila de eventos diversos.

Como isso o ajudaria em tal situação?

Será o último aqui ou ali.

Estarei ciente do fim do processo.

 
Алексей Тарабанов:

Não há fila de espera. O novo evento será processado após o evento atual e todos os eventos que ocorreram durante este período serão ignorados.

Incompetente.

 
fxsaber:

Há vários eventos na fila a serem processados.

Estarei ciente do fechamento do tee.

Vamos parar no fato de que eu realmente (sem código comHandleNextEvent ) não entendo as coisas elementares.

Como nota final, a diferença entre oHandleNextEvent proposto e o que escrevi é que ele é via recursividade e eu o tenho através de um loop. Além disso, a fila é formada inicialmente e você pode administrá-la... você lida com alguns eventos ao mesmo tempo e os adia por algum outro tempo, você tem total liberdade.

 
Qual é a razão para este EA não alertar?
const MqlTick GetMarketWatchTick( void )
{
  MqlTick Tick = {0};
  
  ::SymbolInfoTick(_Symbol, Tick);
  
  return(Tick);
}

const MqlTick GetLastHistoryTick()
{
  MqlTick Tick[1];
  
  ::CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1);
  
  return(Tick[0]);
}

void OnTick()
{
  if (GetMarketWatchTick().time_msc > GetLastHistoryTick().time_msc) // Тик из Обзора рынка свежее, чем последний тик из истории.
    Alert("Hello!");
}


Ao mesmo tempo, o mesmo cheque, cosido no conselheiro comercial de combate no mesmo Terminal, Alerta. Qual poderia ser a razão?

 

2474.

        Last tick time. Selected orders: 0; max time: 0.187 ms; avr time: 0.022 ms; 100000 iterations
        Last 3 days. Selected orders: 1956; max time: 1.832 ms; avr time: 0.301 ms; 100000 iterations
        Orders total: 56561

Tornou-se muito bom. Se você mudou - Obrigado. Vou ficar de olho no desempenho em modo de combate.


PS Em modo de combate, quando são feitos negócios, quase sempre ele se atrasa (só produz casos maiores que 5 milissegundos).

2020.06.03 13:57:27.895 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 14 ms.
2020.06.03 13:57:47.780 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 5 ms.
2020.06.03 14:03:49.844 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 9 ms.
2020.06.03 14:03:51.063 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 8 ms.
2020.06.03 14:03:55.115 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 12 ms.
2020.06.03 14:03:56.935 Alert: Time[NewTicks.mqh 112: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 6 ms.

Caso contrário, parece ser muito melhor do que 2470.