Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Não haverá mais ticks com a última hora conhecida.
O OnTimer em milissegundos garante que todos os ticks tenham ocorrido ANTES desse evento do temporizador. Ou seja, os ticks estão atualizados para todos os símbolos.
Se a questão for que o indicador-espião possa, por alguma razão técnica, reter um “tique antigo” e enviá-lo depois de um mais recente de outro instrumento, então é provável que isso possa acontecer. Fora isso, não vejo problemas diretamente no código.
Não acho que o temporizador garanta, em maior medida, que todos os ticks tenham ocorrido ANTES do novo “evento” (contagem de uma unidade de tempo). O temporizador funciona no horário local, enquanto os carimbos de data e hora nos ticks contêm o horário do servidor. Por isso, é melhor não depender do temporizador para a sincronização dos instrumentos.
Tudo bem, isso é aceitável para os ticks, devido à complexidade da sincronização, embora possamos definir um intervalo de milissegundos e ajustar os ticks em relação ao tempo.
Mas acontece o mesmo com os preços de abertura, embora o horário de abertura seja o mesmo para todos os símbolos.
E, devido a esse comportamento, é impossível testar adequadamente uma série de sistemas.
Demonstração do problema.
Na captura de tela, estão todos os dados necessários para reproduzir o problema na MetaQuotes-Demo. Dá para ver claramente que, ao usar o OnTick, os ticks não estão sincronizados, enquanto que, ao usar o OnTimer (que é extremamente lento), eles estão sincronizados.
Através do OnTick, os ticks não ficam sincronizados, enquanto que através do OnTimer (que deixa o sistema bem lento) eles ficam sincronizados.
Parece que a única maneira de acelerar os cálculos no modo sincronizado é usar o modo matemático, semelhante ao EAToMath.
Ou então, gravar antecipadamente em um arquivo esses dados de uma única passagem.
E, no seu expert advisor, usar os dados desse arquivo para sincronização no OnTick. Vai funcionar rápido e corretamente.
Demonstração do problema.
Na captura de tela estão todos os dados necessários para reproduzir o problema no MetaQuotes-Demo. Dá para ver claramente que, ao usar o OnTick, os ticks não estão sincronizados, enquanto que, ao usar o OnTimer (que é extremamente lento), eles estão sincronizados.
Bem, você usou seu código com a condição de entrada na operação usando ==. Eu mencionei acima que a condição deve ser estritamente >, sem o sinal de igual. Para realizar negociações sincronizadas com base nos últimos preços conhecidos até 01/10/2025 às 01:00:00.081 em todos os instrumentos, você deve começar a monitorar os ticks antes desse horário, ou seja, usar como constante de demonstração, por exemplo, >1759280400080. Para cada algoritmo, é preciso modificar a lógica — simplesmente substituir um tipo de processador por outro não vai funcionar.
PS. Por sincronização, refiro-me à negociação com base nos últimos preços conhecidos. Para a sincronização com precisão de milissegundos, são necessárias, é claro, verificações adicionais, mas a probabilidade de tais situações (coincidência de milissegundos de ticks de instrumentos diferentes) é baixa, o que significa a perda de sinais potenciais. Não tenho certeza se essa sincronização tem interesse prático.
Para realizar operações sincronizadas com base nos últimos preços conhecidos até 01/10/2025 às 01:00:00.081 em todos os instrumentos, você deve começar a monitorar os ticks antes desse horário, ou seja, utilizar como constante de demonstração, por exemplo, >1759280400080.
A maneira mais simples de sincronização é criar um conjunto com os tempos de tick dos símbolos utilizados.
É difícil realizar a sincronização em tempo real, em uma única passagem.
A dificuldade está na incerteza do atraso. Não se sabe qual símbolo será o líder.
Estou pronto para dar uma olhada na sua versão no código.
Para um caso de teste completo, eu precisaria entender a tarefa prática: estamos negociando apenas com base em tics cujo tempo coincida com precisão de milissegundos?
Para um exemplo artificial com uma única operação em um momento conhecido de antemão, com tics sincronizados em todos os instrumentos — é possível criar um algoritmo ótimo artificial, mas para quê?
Mas, afinal, os preços de abertura são os mesmos, embora o horário de abertura seja o mesmo para todos os símbolos.
Seria preciso esclarecer melhor a tarefa. Em relação aos preços de abertura, se o algoritmo exigir a presença de barras de todos os símbolos, esperamos até que o iTime(,,0) de todos os símbolos coincida. Para as barras, nessa abordagem, geralmente não há problema lógico, pois as barras (mesmo as M1) raramente estão ausentes; já para segundos e intervalos menores, falhas na sincronização podem ser frequentes. O que fazer nessas situações?
Acredito que, na prática, devemos considerar como sincronização a presença de qualquer cotação com menos de um determinado tempo limite definido, e não a igualdade estrita dos carimbos de data/hora dos ticks.
Seria bom esclarecer melhor a tarefa. Com base nos preços de abertura, se o algoritmo exigir a presença de barras de todos os símbolos, aguardamos até que o iTime(,,0) seja o mesmo para todos os símbolos. Para as barras, nessa abordagem, geralmente não há problema lógico, pois as barras (mesmo as do M1) raramente estão ausentes
Refere-se ao modo de teste com preços de abertura.
para segundos e intervalos menores, falhas na sincronização podem ser frequentes. O que fazer nessas situações?
Utilizar o último valor conhecido.