Símbolos personalizados. Erros, bugs, perguntas, sugestões. - página 25

 
jaffer wilson:

Isto não funciona do meu lado.

Estes são os detalhes da minha versão MT5.


Tente alterar o erro de tempo do sistema.

//+------------------------------------------------------------------+
//|                                           SpeedupSystemTimer.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Уменьшает погрешность системного таймера до 1 ms"

#import "winmm.dll"
   int timeBeginPeriod(uint per);
#import

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnInit()
{
   timeBeginPeriod(1);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   ExpertRemove();
}
//+------------------------------------------------------------------+
 
Roman :


Tente alterar o erro de tempo do sistema.

Eu já tentei. Por favor, verifique o arquivo. E o vídeo. Você vai descobrir. Até eu peço ao moderador que veja o arquivo anexo.

A mesma coisa acontece com o caráter personalizado.

Arquivos anexados:
 
jaffer wilson:

Eu tentei. Por favor, verifique o arquivo. E o vídeo. Você vai descobrir. Até eu peço ao moderador que veja o arquivo anexo.

A mesma coisa acontece com o caráter personalizado.

Leia na documentação sobre a TimeCurrent()

 
Roman :

Leia na documentação sobre a TimeCurrent()

Presumo que você não tenha executado o arquivo. Por favor, você pode executá-lo uma vez ao seu lado. Meu programa usa o TimeCurrent () para obter o tempo atual quando os segundos se tornam zero ou menos. Isto chamará a função SetTime ().

Então, se o tempo restante for de 50 segundos, então ele não verificará o TimeCurrent (), ele diminuirá os segundos. Acho que isto deveria ser visível quando o OnTimer () é chamado. Mas não é visível. Por favor, verifique uma vez.

 
jaffer wilson:

Presumo que você não tenha executado o arquivo. Por favor, você pode executá-lo uma vez ao seu lado. Meu programa usa o TimeCurrent () para obter o tempo atual quando os segundos se tornam zero ou menos. Isto chamará a função SetTime ().

Então, se o tempo restante for de 50 segundos, então ele não verificará o TimeCurrent (), ele diminuirá os segundos. Acho que isto deveria ser visível quando o OnTimer () é chamado. Mas não é visível. Por favor, verifique uma vez.

Eu examinei seu arquivo, mas os manipuladores em seu código foram priorizados.
Os dois indicadores funcionam de forma quase idêntica, dadas as especificidades do TimeCurrent()


Adicionado.
É melhor eu chamar a atenção dos desenvolvedores para o atraso do OnTimer() deste posto.

Arquivos anexados:
 
Roman:

Eu preferiria chamar a atenção dos desenvolvedores para o atraso do OnTimer() deste posto.

A precisão do temporizador a milissegundos não é garantida. E não será garantido devido a limitações de hardware.
 
Roman:

Eu preferiria chamar a atenção dos desenvolvedores para o atraso do OnTimer() deste posto.

16 milissegundos é a precisão de qualquer coisa com milissegundos. Isto já foi discutido em algum lugar.
Com microssegundos, a precisão é boa, mas a velocidade é mais lenta.
 
Nikolai Semko:
16 milissegundos é a precisão de qualquer coisa com milissegundos. Isto já foi discutido em algum lugar.
Com microssegundos a precisão é boa, mas a velocidade é mais lenta.

É evidente que a precisão do sistema é de ~16 milissegundos.
No exemplo, ele foi colocado acima de 16, EventSetMillisecondTimer(20);
Este é o manipulador OnTimer(), funciona em incrementos de 20 milissegundos.
Mas o contador que é exibido no comentário parece estar pendurado por vários milissegundos.
Não sei por que - ou o manipulador OnTimer() abranda ou a fila de processamento de eventos gráficos.

 
Roman:

É evidente que a precisão do sistema é de ~16 milissegundos.
No exemplo, ele foi colocado acima de 16, EventSetMillisecondTimer(20);
Este é o manipulador OnTimer(), funciona em incrementos de 20 milissegundos.
Mas o contador que é exibido no comentário parece estar pendurado por vários milissegundos.
Não sei por que - ou o manipulador OnTimer() abranda ou a fila de processamento de eventos gráficos.

Encontrado

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Como criar uma função para processar a cada milissegundo?

Nikolai Semko, 2018.09.13 04:45

Sim, é assim que as coisas são. (apenas não freqüência, mas período. Freqüência máxima = 64 Hz)

Apenas para acrescentar um esclarecimento:

A etapa do período para o temporizador = 15,625 milissegundos.

Isto é, com o comando EventSetMillisecondTimer(1) e com o comando EventSetMillisecondTimer(10) o período real será de 15.625 ms.

com o comando EventSetMillisecondTimer(21) e com o comando EventSetMillisecondTimer(30) o período real será de 31,25 ms.

Com o comando EventSetMillisecondTimer(95) e o comando EventSetMillisecondTimer(105), o período real será de 109,375 ms.

etc.

GetTickCount() muda a cada 1/(2^6)=1/64 segundos (15625 microssegundos).
 
Nikolai Semko:

encontrado

GetTickCount() muda de valor a cada 1/(2^6)=1/64 segundos (15625 microssegundos).

Obrigado, agora eu vejo qual é a razão.
Mudança de fase do sistema, ainda um múltiplo de 15.625

Adicionado.
Mas eu mudei o período do timer do sistema ganhar tempo da função apiBeginPeriod(1)
ou seja, na idéia o timer do sistema agora é incrementado para 1 milissegundo.
E a etapa do temporizador do sistema deve ser de 1 milissegundo, certo?
Por que o contador no comentário ainda congela?
Razão: