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
É verdade. Obrigado. Eu não me lembrava disso. Na verdade, isso não resolve o problema completamente, pois preciso que as ordens sejam executadas quase imediatamente (e acho que com este método só posso verificá-lo a cada segundo, mas pelo menos não a cada carrapato), mas de fato posso facilmente construir uma solução temporária usando-o.
Embora o OnTimer tenha a taxa mais rápida alinhada com o relógio do sistema, ou seja, a cada 15 ms, eu preferiria o looping em intervalos de 1ms (usando o Sleep(1) no loop).
Embora o OnTimer tenha a taxa mais rápida alinhada com o relógio do sistema, ou seja, a cada 15 ms, eu preferiria o looping em intervalos de 1ms (usando o Sleep(1) no loop).
Isso não seria um problema? Quero dizer, não há processos internos no MT4 que possam precisar do OnTick() para serem executados para evitar que algum tipo de amortecedor interno acabe transbordando ou superdimensionado após semanas de funcionamento (o EA) sem parar e apenas fazer looping?
Estou perguntando por ignorância, não tenho idéia se poderia ser um problema, apenas assumindo que o MT4 não foi concebido para fazê-lo.
Então você acha que não será um problema? (Se sim, essas são ótimas notícias).
BTW: Como você consegue que o OnTimer() seja executado abaixo de um intervalo de 1 segundo? :?
Eu costumava executar EAs em um loop iniciado no init() alguns anos atrás, por uma razão semelhante - ler dados externos com o mínimo de atraso. Ele costumava rodar semanas sem nenhum efeito colateral. O Sleep(1) é satisfatório para tornar o impacto da potência computacional muito leve.
A configuração do temporizador aceita milis.
Eu costumava executar EAs em um loop iniciado no init() alguns anos atrás, por uma razão semelhante - ler dados externos com o mínimo de atraso. Ele costumava rodar semanas sem nenhum efeito colateral. O Sleep(1) é satisfatório para tornar o impacto da potência computacional muito leve.
A configuração do temporizador aceita milis.
BTW: Como obter o OnTimer() para ser executado abaixo de um intervalo de 1 segundo? :?
EventoSetMillisecondTimer
A função indica ao terminal do cliente que os eventos do temporizador devem ser gerados em intervalos inferiores a um segundo para este Expert Advisor ou indicador.
boolEventSetMillisecondTimer(
emmilissegundos// número de milissegundos
);
Parâmetros
milissegundos
[em] Número de milissegundos que definem a freqüência dos eventos do temporizador.
Valor retornado
Em caso de execução bem sucedida, os retornos são verdadeiros, caso contrário - falsos. Para receber um código de erro, a função GetLastError() deve ser chamada.
Nota
Esta característica é projetada para os casos em que é necessário um temporizador de alta resolução. Em outras palavras, os eventos do timer devem ser recebidos com mais freqüência do que uma vez por segundo. Se um timer convencional com o período de vários segundos for suficiente para você, use EventSetTimer().
Normalmente, esta função deve ser chamada a partir da função OnInit() ou no construtor de classes. Para lidar com eventos vindos do timer, um Expert Advisor ou um indicador deve ter a função OnTimer().
Cada Expert Advisor e cada indicador trabalham com seu próprio timer recebendo eventos somente deste timer. Durante o desligamento da aplicação mql4, o timer é destruído à força caso tenha sido criado mas não tenha sido desativado pela função EventKillTimer().
Apenas um timer pode ser lançado para cada programa. Cada aplicação mql4 e gráfico têm sua própria fila de eventos onde todos os eventos recém-chegados são colocados. Se a fila já contém o evento Timer ou se este evento está na etapa de processamento, então o novo evento Timer não é adicionado à fila de aplicação mql4.
EventoSetMillisecondTimer
A função indica ao cliente final que os eventos temporizados devem ser gerados em intervalos inferiores a um segundo para este Expert Advisor ou Indicador.
boolEventSetMillisecondTimer(
emmilissegundos// número de milissegundos
);
Parâmetros
milissegundos
[em] Número de milissegundos que definem a freqüência dos eventos do temporizador.
Valor retornado
Em caso de execução sucessiva, os retornos são verdadeiros, caso contrário - falsos. Para receber um código de erro, a função GetLastError() deve ser chamada.
Nota
Esta característica é projetada para os casos em que é necessário um temporizador de alta resolução. Em outras palavras, os eventos do temporizador devem ser recebidos com mais freqüência do que uma vez por segundo. Se um timer convencional com o período de vários segundos for suficiente para você, use EventSetTimer().
Normalmente, esta função deve ser chamada a partir da função OnInit()ou no construtor de classes. Para lidar com eventos vindos do temporizador, um Expert Advisor ou um indicador deve ter a função OnTimer( ).
Cada Expert Advisor e cada indicador trabalha com seu próprio timer recebendo eventos somente deste timer. Durante o desligamento da aplicação mql4, o timer é destruído à força caso tenha sido criado mas não tenha sido desabilitado pela função EventKillTimer().
Apenas um timer pode ser lançado para cada programa. Cada aplicação mql4 e gráfico tem sua própria fila de eventos onde todos os eventos recém-chegados são colocados. Se a fila já contém o evento Timer ou este evento estiver em fase de processamento, então o novo evento Timer não é adicionado à fila de aplicação do mql4.
Obrigado pela explicação detalhada; minha culpa; li muito rapidamente online. (Os links têm trocado o domínio docs.mql4.com com forum.mql4.com. Caso alguém mais verifique este tópico...)
EDIT: Vou aproveitar o fato de um moderador estar por perto: Você sabe se existe alguma diferença entre executar OnTimer() cada N milisecs e fazer o mesmo looping a cada N milisec como descrito em posts anteriores?
Não vejo por que todo esse alvoroço com o "ms" de tempo. A menos que isto seja algum tipo de "Escalador de notícias de alta freqüência" em uma conexão de corretor de latência muito baixa, intervalos de um segundo no OnTimer() devem ser mais do que suficientes como tempo de resposta.
Se você adicionar todos os atrasos e latência da execução do aplicativo JAVA, comunicação IPC (LAN & WAN), execução de gerenciamento de ordens e latência do servidor do corretor, não há nenhuma vantagem real em usar a temporização "ms" para estratégias normais.
Se, no entanto, for algum tipo de "Escalador de notícias de alta freqüência", para ser usado em um VPS com uma conexão de baixa latência com o corretor, então você NÃO deve estar brincando com JAVA e IPC, e deve codificar a estratégia diretamente em MQL muito compacto para obter a menor latência possível.
EDIT:
EDIT: Vou tirar vantagem de um moderador estar por perto: Você sabe se existe alguma diferença entre executar OnTimer() cada N milisecs e fazer o mesmo looping a cada N milisec como descrito em posts anteriores?
Só porque sou um moderador, isso não significa que eu seja mais conhecedor do que os outros. Na verdade, os outros cartazes deste tópico obviamente têm mais conhecimento do que eu sobre o assunto. Eu não sei nada sobre Java.
Eu não entendo o objetivo de usar Sleep() em um evento de temporizador, pois isso coloca a EA em espera e isso pode significar a falta de muitos eventos OnTick(). É claro que, dependendo do EA, os eventos OnTick podem não ser importantes.
Eu costumava executar EAs em um loop iniciado no init() alguns anos atrás, por uma razão semelhante - ler dados externos com o mínimo de atraso. Ele costumava rodar semanas sem nenhum efeito colateral. O Sleep(1) é satisfatório para tornar o impacto da potência computacional muito leve.
Para um pouco de diversão... o seguinte script aceita múltiplas conexões TCP/IP simultâneas, e grava mensagens de entrada delimitadas por CR para o log Experts. Por exemplo, uma vez que o script esteja rodando, você pode se conectar via Telnet (à porta 51234 por padrão), e cada linha de texto que você digitar será impressa.
Para um pouco de diversão... o seguinte script aceita múltiplas conexões TCP/IP simultâneas, e escreve mensagens de entrada delimitadas por CR para o log Experts.
... declarando o óbvio, se você quisesse fazer o acima descrito em um EA em vez de um script, então você simplesmente o mudaria da seguinte forma: