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

 
fxsaber:
Estava no computador, não fez nenhum cálculo. Não carregou a CPU com nada.

19 ms e 48 ms para a execução do SymbolInfoTick. Houve várias dezenas de casos em que a duração foi de centenas de microssegundos. Mas eu não os citei.


Aparentemente, a fim de reproduzi-lo, precisamos dirigir assessores de combate por 24 horas, e depois apenas assistir. Na minha opinião, é irrealista descobrir o que inicia tais desfasamentos.

Às vezes o computador pode estar baixando atualizações ou executando algumas tarefas de serviço. Além disso, as flutuações de tensão da rede elétrica podem afetá-la. Desta forma você pode chegar a placas de rede programáveis, onde toda a lógica bot é escrita a nível de hardware :) mas mesmo assim haverá atrasos devido a flutuações do campo quântico
 
Maxim Dmitrievsky:
Às vezes, o comp pode estar bombeando atualizações ou fazendo algumas tarefas de serviço. Além disso, as variações de tensão de rede podem afetá-la. Desta forma você pode chegar a cartões de rede programáveis, onde toda a lógica do bot está conectada por cabo :) mas mesmo assim haverá atrasos devido a flutuações quânticas do campo

Os desenvolvedores têm feito o melhor que podem. E sem isso, a filial forneceu um código que mostra como o tique está atrasado em relação à Market Watch e vice-versa. Como a seqüência de chegada do tick é quebrada e provavelmente algo mais. Em suma, um código válido desagradável é afixado para reproduzir outras situações.

 
Anton:

SymbolInfoTick envia os dados recebidos do servidor do corretor. O que o servidor envia é o que você recebe.

SymbolInfoTick() é executado em modo de bloqueio ou em modo não-bloqueio?

Por exemplo, ele está no corpo do loop of while e não há conexão ou o mercado está fechado para o fim de semana,
então ele será bloqueado pela parada do loop ou ele será executado de forma assíncrona?

 
fxsaber:

como o relógio de mercado fica atrás do relógio de mercado e vice-versa.

Isto é, SymbolInfoTick pega um novo tick e recebemos um Ask and Bid diferente através do evento Market Watch (sem esperar que o Market Watch mude) ? Não foi possível fazê-lo há cerca de um ano atrás. SymbolInfoTick e CopyTick e vintage sempre levam ao mesmo tick. Se você conseguir carrapatos através de várias funções OnXXX, é claro, você conseguirá algo através de uma função, e algo através de outra...

 
pivomoe:

ou seja, SymbolInfoTick pega um novo tick e nós recebemos um Ask and Bid diferente através da votação do copo (sem esperar pelo evento de troca de copo) ?

Aqui.

 
fxsaber:

Aqui.

Como eu pensava que você estava testando OnBookEvent e OnTick, não MarketBookGet e SymbolInfoTick. Se você testasse de acordo com este esquema, você teria tudo igualado:

While(1)
{
 Sleep(1)
 Запрос тика через SymbolInfoTick
 Запрос тика через стакан MarketBookGet
 Проверка на совпадение. 
}

p.s Leia seus posts abaixo. Você também entende isso. Por que você precisa do OnBookEvent e OnTick? No meu exemplo Sleep(1) leva 1-2 milissegundos, solicitar e assinalar com SymbloInfoTick leva menos de 1 milissegundo que MICROsecond. O processador já está descansando 99,9% do tempo se não houver carrapatos. Qual é a vantagem de usar o OnBookEvent e OnTick ?

 
pivomoe:

Como eu pensava que você estava testando OnBookEvent e OnTick, não MarketBookGet e SymbolInfoTick. Se você estivesse testando de acordo com este esquema, você teria tudo igualado:

p.s Leia seus posts abaixo. Você também entende isso. Por que você precisa do OnBookEvent e OnTick? No meu exemplo Sleep(1) leva 1-2 milissegundos, solicitar e assinalar com SymbloInfoTick leva menos de 1 milissegundo que MICROsecond. O processador já está descansando 99,9% do tempo se não houver carrapatos. Qual é a vantagem de usar o OnBookEvent e OnTick?

Sem um toque de diplomacia, você está falando bobagens. Dormir(1) é um décimo de um milissegundo. Eu vejo apenas uma teorização.

Os usuários no OnTick querem ver um novo tick e não aquele que chegou ao Terminal há algum tempo. Você pode colocar o SymbolInfoTick logo após o MarketBookGet no código fonte.


Os desenvolvedores reconheceram plenamente dois problemas com seu silêncio.

 
fxsaber:

Sem um toque de diplomacia, você está falando bobagens. Dormir(1) é uma dúzia de milissegundos. Eu vejo apenas uma teorização.

Os usuários querem ver um novo tick no OnTick e não um tick que chegou ao Terminal há algum tempo. Você pode colocar o SymbolInfoTick logo após o MarketBookGet no código fonte.


Os desenvolvedores, por seu silêncio, reconheceram plenamente dois problemas.

Nem sempre e não a cada décimo de milissegundo. Verificado com um roteiro simples

//+------------------------------------------------------------------+
//|                                                    TestSleep.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#define  ITERATIONS 10000
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong t1=GetMicrosecondCount();
   for(int i=0; i<ITERATIONS; i++)
     {
      Sleep(1);
     }
   ulong t2=GetMicrosecondCount()-t1;
   PrintFormat("total %I64u microseconds (%.3f ms per iteration)",t2,double(t2)/(ITERATIONS*1000.0));
  }
//+------------------------------------------------------------------+

Aqui está meu diário de bordo

2020.11.04 13:14:31.590 TestSleep (EURUSD,H1)   total 17058138 microseconds (1.706 ms per iteration)

Os usuários do OnTick sempre vêem o tick mais fresco.

OnBookEvent os usuários vêem sempre o mais fresco carrapato.

Mas se você quiser comparar os carrapatos recebidos pela OnTick e recebidos pela OnBookEvent, então você ficará desapontado, pois os eventos são processados sequencialmente, não em paralelo. Foi isso que o usuário pivomoe tentou dizer a você

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Slava:

Nem sempre e não em todos os lugares um décimo de milissegundo. Verificado com um roteiro simples

Aqui está meu diário de bordo.

E aqui está meu diário de bordo.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnStart()
{
  for (int i = 0; i < 5; i++)
    _BV(Sleep(1), 1);
}

Resultado.

2020.11.04 15:19:32.565 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 5326 mcs.
2020.11.04 15:19:32.580 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14928 mcs.
2020.11.04 15:19:32.596 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15930 mcs.
2020.11.04 15:19:32.611 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14910 mcs.
2020.11.04 15:19:32.627 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15941 mcs.

Os usuários do OnTick sempre vêem o tick mais fresco.

OnBookEvent os usuários vêem sempre o mais fresco carrapato.

O resultado de executar a EA em um único gráfico a partir de uma máquina que não está ocupada de forma alguma.

2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 6564 mcs.
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [0] 1.17192 1.17192     true     108150
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [1] 1.17192 1.17192    false         30
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [2] 1.17189 1.17191     true      88210
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [3] 1.17189 1.17191    false       6564
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 3888 mcs.
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [0] 1.17192 1.17192    false     117471
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [1] 1.17192 1.17192     true         11
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [2] 1.17192 1.17193     true     882710
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [3] 1.17192 1.17193    false       3888
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       Alert: OnTick-lag! - 4653 mcs.
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [0] 1.17195 1.17195     true      86660
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [1] 1.17195 1.17195    false         11
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [2] 1.17194 1.17194    false     220122
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [3] 1.17194 1.17194     true       4653

Marca carrapatos idênticos, que são recebidos em diferentes on-funções por métodos correspondentes. O atraso pode ser de até dezenas de milissegundos se for executado em seis gráficos em vez de um.

Mas se você quiser comparar carrapatos recebidos no OnTick e recebidos no OnBookEvent, então você ficará desapontado porque os eventos são processados sequencialmente, não em paralelo. O que o pivô do usuário tentou dizer a você

Se um OnBookEvent/OnTick quase vazio for acionado 20 milissegundos depois do correspondente OnTick/OnBookEvent quase vazio, isso está OK?


ZS Enquanto você está prestando atenção ao fio, há outro código de reprodução aqui. Lá no Market Watch os carrapatos chegam com um tempo anterior ao do Market Watch.

 
fxsaber:

Se um OnBookEvent/OnTick quase vazio for acionado 20 milissegundos depois do correspondente OnTick/OnBookEvent quase vazio, isso está OK?


A fila EA é um recurso que pode ser trancado. Quando um evento é escrito para a fila, o Expert Advisor espera (a menos que o Expert Advisor esteja atualmente processando um evento)

Os eventos para o Expert Advisor vêm da fila de eventos do gráfico correspondente, que por sua vez vem do ciclo de processamento do símbolo correspondente. E este ciclo de processamento não apenas distribui eventos para seus próprios gráficos, mas também faz muitas outras coisas.

Já lhes disse que o Windows não é um sistema operacional em tempo real.