Verificar conexão com servidor da corretora

 

Bom dia,

Tenho um EA no qual consegui implementar minha estratégia. No entanto, como trabalho, não consigo saber como está o status da minha conexão.


Sei que tem a função `onTimer` que pode ser chamada a cada x segundos e verificar a conexão com `TERMINAL_CONNECTED`. Queria saber se um overhead muito grande seria adicionado ao meu código ou se teria um maneira melhor de checar pela conexão.

 
jpedronascimento:

Bom dia,

Tenho um EA no qual consegui implementar minha estratégia. No entanto, como trabalho, não consigo saber como está o status da minha conexão.


Sei que tem a função `onTimer` que pode ser chamada a cada x segundos e verificar a conexão com `TERMINAL_CONNECTED`. Queria saber se um overhead muito grande seria adicionado ao meu código ou se teria um maneira melhor de checar pela conexão.

Suponho que você só tem que checar a conexão antes de enviar uma Ordem correto? Então você só precisa chegar a conexão antes de enviar qualquer tipo de ordem (seja de entrada, saída ou modificação, fique atento a não esquecer nenhuma delas...), ou seja, nem precisará usar o OnTimer.

Mas se ainda assim quiser usar o OnTimer você pode ajustar o tempo de intervalo entre um evento e outro. Usando o EventSetTimer

 
Ruy Christian Hoffmann:

Suponho que você só tem que checar a conexão antes de enviar uma Ordem correto? Então você só precisa chegar a conexão antes de enviar qualquer tipo de ordem (seja de entrada, saída ou modificação, fique atento a não esquecer nenhuma delas...), ou seja, nem precisará usar o OnTimer.

Mas se ainda assim quiser usar o OnTimer você pode ajustar o tempo de intervalo entre um evento e outro. Usando o EventSetTimer

Todas minhas ordens são enviadas dentro da OnTick, então se a OnTick está executando é porque tenho conexão e estou recebendo os ticks. Por isso, pensei em usar a OnTimer, mas estou receoso de que um overhead muito grande seja adicionado e eu perca algumas entradas.


Você checar pela sua conexão?

 
jpedronascimento:

Todas minhas ordens são enviadas dentro da OnTick, então se a OnTick está executando é porque tenho conexão e estou recebendo os ticks. Por isso, pensei em usar a OnTimer, mas estou receoso de que um overhead muito grande seja adicionado e eu perca algumas entradas.


Você checar pela sua conexão?

JPE você vai ter (ou já está tendo) um overhead alto desde o momento que colocou para enviar suas ordens no OnTick. Ai já tem uma sobrecarga.  A sequencia lógica para evitar o máximo de overhead possível nas estratégias que efetivamente precisam ser checadas de tick em tick é:

1o. Chamada para seu setup (estratégia);

2o. Se essa chamada acima der resultado positivo, então efetua a chamada para abertura das ordens/posições;

3o. Antes de efetivamente enviar a Ordem, efetua todos os checks de segurança (conexão, saldo... e por ai mais as que você utilizar).

4o. Só então envia a ordem.

Pois perceba, você até pode ter um setup que necessita verificar de tick em tick, mas dificilmente você precisará enviar Ordens de aberturas ou fechamentos de Posições de tick em tick.

Mas pelo que você disse é como se tivesse colocado tudo isso num bloco só dentro do seu OnTick. Neste caso você vai ter overhead por um monte de coisas, não só sobre a checagem do terminal.

 
Ruy Christian Hoffmann:

JPE você vai ter (ou já está tendo) um overhead alto desde o momento que colocou para enviar suas ordens no OnTick. Ai já tem uma sobrecarga.  A sequencia lógica para evitar o máximo de overhead possível nas estratégias que efetivamente precisam ser checadas de tick em tick é:

1o. Chamada para seu setup (estratégia);

2o. Se essa chamada acima der resultado positivo, então efetua a chamada para abertura das ordens/posições;

3o. Antes de efetivamente enviar a Ordem, efetua todos os checks de segurança (conexão, saldo... e por ai mais as que você utilizar).

4o. Só então envia a ordem.

Pois perceba, você até pode ter um setup que necessita verificar de tick em tick, mas dificilmente você precisará enviar Ordens de aberturas ou fechamentos de Posições de tick em tick.

Mas pelo que você disse é como se tivesse colocado tudo isso num bloco só dentro do seu OnTick. Neste caso você vai ter overhead por um monte de coisas, não só sobre a checagem do terminal.

@Ruy Christian Hoffmann agradeço pela ajuda, você me fez lembrar de uma verificação que ainda não fiz, e concordo com você, se eu tivesse abrindo e fechando posições a cada tick, o overhead iria ser muito grande. Mas, faço igual você disse, tenho algumas condições que devem ser satisfeitas para que a posição seja aberta ou fechada, e depois de aberta uma posição não abro outra até fechá-la.

O que eu preciso é detectar, da melhor forma possível, se a minha internet ou a conexão com o servidor caiu, de modo que não adicione um overhead quando ela estiver normal e que eu consiga fechar as posições abertas(ligando na mesa da corretora, ou rotear pelo 4G) sem ter que carregar o ativo.

 
jpedronascimento:

Bom dia,

Tenho um EA no qual consegui implementar minha estratégia. No entanto, como trabalho, não consigo saber como está o status da minha conexão.


Ola Pedro,

é o seguinte eu uso  TERMINAL_CONNECTED e claro que é no OnTimer()  e com EventSetTimer(1), no OnTime() eu mando uma notificação para CEL. se ficou mais de 10 seg sem conexão com servidor. Porém as poucas vezes que isso aconteceu, quando abri o VM para ver o MT5 a conexão tinha sido restabelecida, ou seja, aparentemente , para o SendNotification()  ser executado o terminal precisa estar conectado ao servidor  (  ?! ).

Quanto a sobrecarga de CPU, acho que  alguns micro segundos de CPU a cada segundo é irrelevante. Porém, tem sempre um porém, quando o EA está em modo OTIMIZADOR/TESTADOR estratégia o OnTime() é ajustado para  EventSetTimer(600)

Se você está mesmo preocupado com a performance de seu EA use o "profilador" do metaeditor para saber onde seu código está pesado.

Começando por responder: você sabe  o que é mais rápido para pegar os valores de  ASK, BID, LAST, VOLUME,  usar o SymbolInforTick  para montar o MqlTick,  ou usar as funções  SymbollnfoDouble e SymbolInfoInteger ?

 
Rogerio Giannetti Torres:

Ola Pedro,

é o seguinte eu uso  TERMINAL_CONNECTED e claro que é no OnTimer()  e com EventSetTimer(1), no OnTime() eu mando uma notificação para CEL. se ficou mais de 10 seg sem conexão com servidor. Porém as poucas vezes que isso aconteceu, quando abri o VM para ver o MT5 a conexão tinha sido restabelecida, ou seja, aparentemente , para o SendNotification()  ser executado o terminal precisa estar conectado ao servidor  (  ?! ).

Quanto a sobrecarga de CPU, acho que  alguns micro segundos de CPU a cada segundo é irrelevante. Porém, tem sempre um porém, quando o EA está em modo OTIMIZADOR/TESTADOR estratégia o OnTime() é ajustado para  EventSetTimer(600)

Se você está mesmo preocupado com a performance de seu EA use o "profilador" do metaeditor para saber onde seu código está pesado.

Começando por responder: você sabe  o que é mais rápido para pegar os valores de  ASK, BID, LAST, VOLUME,  usar o SymbolInforTick  para montar o MqlTick,  ou usar as funções  SymbollnfoDouble e SymbolInfoInteger ?

Boa tarde, Rogerio,

O que eu pretendo fazer é algo semelhante ao que você faz, mas enviando notificações a cada X tempo enquanto houver conexão. Deste modo, se decorrido o tempo de receber uma notificação e ela não acontecer, sei que há algo de errado na conexão.

Como faz pouco tempo que estou utilizando MetaQuote5 para escrever código, ainda sou iniciante nesta linguagem. Pesquisei bastante nos fóruns e encontrei poucas threads com relação a minha dúvida, por isso resolvi escrever.

Meu objetivo não é ter um algoritmo otimizado, e sim, não adicionar um overhead muito grande ao meu EA que possa fazer com que eu perca o tick no qual eu poderia ter comprado ou vendido o ativo.

Respondendo a sua pergunta, eu não cheguei a fazer a análise dessas funções para verificar implementação delas e ter certeza qual é mais rápida. No entanto, creio que usar SymbolInforTick seja melhor, pois você faz apenas uma chamada para obter todos esses valores.
 
jpedronascimento:

Boa tarde, Rogerio,

O que eu pretendo fazer é algo semelhante ao que você faz, mas enviando notificações a cada X tempo enquanto houver conexão. Deste modo, se decorrido o tempo de receber uma notificação e ela não acontecer, sei que há algo de errado na conexão.

Como faz pouco tempo que estou utilizando MetaQuote5 para escrever código, ainda sou iniciante nesta linguagem. Pesquisei bastante nos fóruns e encontrei poucas threads com relação a minha dúvida, por isso resolvi escrever.

Meu objetivo não é ter um algoritmo otimizado, e sim, não adicionar um overhead muito grande ao meu EA que possa fazer com que eu perca o tick no qual eu poderia ter comprado ou vendido o ativo.

Respondendo a sua pergunta, eu não cheguei a fazer a análise dessas funções para verificar implementação delas e ter certeza qual é mais rápida. No entanto, creio que usar SymbolInforTick seja melhor, pois você faz apenas uma chamada para obter todos esses valores.

Boa tarde,

o que causaria overhead, tirando um código mal feito, seria o uso do comando SendNotification, mas infelizmente a documentação não diz muita coisa.

Se você não quer perder um TICK bom (!?) , seu código no OnTick() deve estar o mais otimizado possível, por exemplo:  Só use Comment ou Print após um abrir um trade ou condição de erro, esses comandos custam milisegundos !!!

Razão: