Características da linguagem mql5, subtilezas e técnicas - página 100

 
Sleep(0);

Um tal deslize pode levar dezenas de milissegundos para ser concluído.

 
fxsaber:

Um tal deslize pode durar dezenas de milissegundos.

O que é que isso significa?

Lembro-me que há muito tempo atrás o Sleep() era mencionado em processos paralelos

 
Fast528:

O que é que isso significa?

Exactamente o que ele disse.

 
fxsaber:

Um tal deslize pode durar dezenas de milissegundos.

Não dezenas, mas 15,625 milissegundos.
Eu tenho usado a construção há muito tempo:

if(pause>0) Sleep(pause);
 
Nikolai Semko:

Não dezenas, mas 15,625 milissegundos.
Eu tenho usado o design há muito tempo:

ulong GetSleepTime( const int Pause = 0 )
{
  const ulong StartTime = GetMicrosecondCount();
  
  Sleep(Pause);
  
  return(GetMicrosecondCount() - StartTime);
}

void OnStart()
{
  ulong MaxTime = 0;
  
  while (!IsStopped())
  {
    const ulong SleepTime = GetSleepTime();
    
    if (SleepTime > MaxTime)
    {
      Print(SleepTime);
      
      MaxTime = SleepTime;
    }
  }
}


Resultado

2542
9983
10033
10041
10148
10348
11982
26116
27529
40066
49915
56319
 
fxsaber:


Resultado

Calcule o tempo médio.

Acumule SleepTime e depois divida-o pelo número de iterações após o fim do laço.

Caso contrário, o resultado que acabou de apresentar parece assustador para mentes imaturas. Mostrar também o tempo mínimo ao mesmo tempo.

PS. A função Sleep( ) no MQL5 não é um redirecionamento para a função win api ::Sleep(). Ou melhor, se o valor for inferior a 100, é um redirecionamento. Mas acima de 100 é um laço com api de vitória escorrega dentro dele para que possa ser interrompido pelo IsStopped.

Há mais um ponto subtil. Se milissegundos <=0, nós prependemos 1. Ou seja, nós nunca chamamos ::Sleep(0).

O PPS importa a função Sleep do kernel32.dll e faz o mesmo experimento com ela

 
Slava:

Calcule o tempo médio.

Acumule SleepTime e depois divida pelo número de iterações após o ciclo estar completo.

Não me referia ao tempo médio, mas a uma possibilidade de espigões. Eu os encontrei quando esperava que o histórico comercial estivesse sincronizado com o resultado do OrderSend. Eu estava esperando usando o Sleep(0). Acabou por ser impossível.

Slava:

PS. A função Sleep( ) no MQL5 não é um redirecionamento para a função win api ::Sleep(). Bem, se o valor for inferior a 100, é um redireccionamento. Mas acima de 100 é um laço com api de vitória escorrega dentro dele para que possa ser interrompido pelo IsStopped.

Há mais um ponto subtil. Se milissegundos <=0, nós prependemos 1. Ou seja, nós nunca chamamos ::Sleep(0).

Obrigado pelos detalhes. Eu não sabia que o Sleep(5000) pode ser terminado através do IsStopped().

 
fxsaber:

Não se tratava do tempo médio, mas da possibilidade de espigões. Eu os encontrei enquanto esperava pela sincronização do histórico de negociação com o resultado do OrderSend. Eu estava esperando usando o Sleep(0). Acontece que isso não pode ser feito dessa maneira.

Portanto, o sistema operacional Windows nunca foi um sistema em tempo real.
 

fxsaber:

Obrigado pelos detalhes. Não sabia que o Sleep(5000) poderia ser terminado via IsStopped().

https://www.mql5.com/ru/docs/common/sleep

A função tem uma verificação integrada do estado da bandeira de paragem da EA a cada 0,1 segundos.

Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить. В функцию встроена проверка состояния флага остановки эксперта каждую 0.1 секунды.
 
Slava:
Portanto, o sistema operacional Windows nunca foi um sistema em tempo real.

Sinceramente, eu nem sei o que significa ou onde na MQL5 você pode encontrá-lo.