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

 
fxsaber:
A nuance de comparar números inteiros num exemplo real

Você vai medir exatamente um segundo com Sleep(1000)?

E você não sabe que o temporizador no processador tem um erro de 15 ms?

 
Slava:

Você vai dormir Sleep(1000) para medir exatamente um segundo?

Você sabe que o temporizador na CPU tem uma margem de erro de 15 ms?


Olá, pode dizer-me se existe uma forma de reiniciar o buffer do temporizador para eliminar o erro de definição do temporizador?

 
Vladislav Andruschenko:

Olá, pode dizer-me se existe uma forma de reiniciar o buffer do temporizador para evitar um erro de definição do temporizador?

Ocorre um erro de ajuste do temporizador porque a fila de mensagens do sistema está cheia. Pode haver muitas razões para isto. Normalmente, o transbordo da fila é temporário (se não for, você não poderá trabalhar no computador)

Use o OnTick para monitorar o temporizador. Se o temporizador não estiver definido, defina-o para OnTick

Entretanto, estamos trabalhando para que as configurações do temporizador sejam independentes do estado da fila de mensagens.

PS Habilitar o temporizador do sistema e definir o temporizador para uma aplicação não estão relacionados

 
Slava:

Você vai dormir Sleep(1000) para medir exatamente um segundo?

Não, é sobre estas duas linhas de comparação de números inteiros.

Fórum sobre negociação, sistemas de negociação automatizados e testes estratégicos

Características da linguagem mql5, subtilezas e truques

fxsaber, 2018.01.24 21:48

A nuance de comparar números inteiros usando um exemplo real
//  if (GetMicrosecondCount() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount() - StartTime > 1000000) // Правильно

À primeira vista, ambas as linhas devem dar os mesmos resultados. Mas não tem. O primeiro, por vezes, dá o resultado errado.

O exemplo com o tempo é escolhido apenas por uma questão de clareza.
Slava:

E o facto de o temporizador no processador ter um erro de 15 ms, isso é desconhecido para si?

É estranho que ainda estejas a usar o GetTickCount. Foi provado no fórum (demasiado preguiçoso para procurar) que um temporizador de microssegundos não é mais lento do que um temporizador de milissegundos. Ao mesmo tempo, não tem nenhum erro selvagem.

 
fxsaber:

Não, é sobre estas duas cordas de comparações de números inteiros.

À primeira vista, ambas as cordas devem dar os mesmos resultados. Mas este não é o caso. O primeiro, por vezes, dá o resultado errado.

O exemplo com o tempo é escolhido apenas por uma questão de clareza.

É estranho que ainda estejas a usar o GetTickCount. Foi provado no fórum (sou demasiado preguiçoso para o procurar) que o temporizador de microssegundos não é mais lento do que o temporizador de milissegundos. Ao mesmo tempo, não tem nenhum erro selvagem.

Quero dizer Dormir(1000)
 
Slava:

Ocorre um erro de temporizador porque a fila de mensagens do sistema está cheia. Pode haver uma série de razões para isso. Um transbordo de fila é normalmente temporário (se não for, não poderá trabalhar no seu computador).

Use o OnTick para monitorar o temporizador. Se o temporizador não estiver definido, defina-o para OnTick

Entretanto, estamos trabalhando para fazer as configurações do temporizador independentemente do estado da fila de mensagens.

PS Habilitar o temporizador do sistema e configurar o temporizador para uma aplicação são questões separadas


É exactamente isso que eu faço,

O erro do temporizador ocorre após algum tempo - não imediatamente. e exatamente por causa do transbordamento - quando há muitos dados, por exemplo, histórico de pedidos, ou pedidos atuais de 50 ou mais.

já tentei e ainda estou tentando usá-lo, mas tenho a sensação de que mesmo assim vou resolver o problema.

 
Slava:
Estou a falar de Sleep(1000).

Sim, você atolou o assunto de comparar números inteiros.

 
fxsaber:

Sim, estás a falar em comparar números inteiros.

Não há problema em comparar números inteiros.

Mostrar o mesmo sem escorregar e sem GetMicrosecondsCount

 
Slava:

Não há problema em comparar números inteiros.

Mostrar o mesmo sem o deslize e sem GetMicrosecondsCount

ulong GetMicrosecondCount2()
{
  static ulong StartTime = 0;
  
  if (StartTime)
    StartTime += 1000001;            // При повторном - добавляем больше "секунды"
  else
    StartTime = ULONG_MAX - 1000000; // При первом запуске возвращаем это "время"
    
  return(StartTime);
}

void OnStart()
{
  const ulong StartTime = GetMicrosecondCount2();
  
//  Sleep(1000);
  
//  if (GetMicrosecondCount2() > StartTime + 1000000) // Неправильно
  if (GetMicrosecondCount2() - StartTime > 1000000) // Правильно
    Print("Прошло больше секунды.");
  else
    Print("Прошло меньше секунды."); 
}
E não é um problema, é uma subtileza.
 

Fórum sobre negociação, sistemas de negociação automatizados e testes de estratégia de negociação

Discussão sobre "Sistema de contabilidade da posição de cobertura adicionado ao MetaTrader 5".

fxsaber, 2018.01.25 10:14

  1. Mostra um exemplo de uma situação comercial que Andrew apontou ao ler este artigo.
  2. HistorySelectByPosition não pode selecionar a ordem que causou a troca.
  3. A ordem e o negócio que gerou podem ter identificações diferentes.
O segundo e o terceiro pontos devem, pelo menos, ser expressos em algum lugar. O que fez.

Estamos a falar de análise da história até do comércio manual, não estamos a falar de escrever TS.

Por exemplo, queremos entender como o acordo se concretizou.
Razão: