IsConnected() - página 4

 
7bit:

Pode ser verificado, basta executar a verificação em um loop infinito. como iniciar este loop ao iniciar o terminal durante uma interrupção de conexão é um problema completamente à parte. Uma vez que você tenha seu loop funcionando, ele fará o que é esperado.

Seu problema não tem nada a ver com a função IsConnected(). Com o mesmo argumento, você também pode reclamar da função Print() ou Alert() ou qualquer outra função que você não possa chamar porque não pôde iniciar o código inteiro em primeiro lugar por alguma razão completamente diferente.


ok, deixe-me explicar algo Porque estou usando muito Terminlas Ao longo de toda a minha utilização da cpu está subindo para 100 prcent e é por isso que preciso desligar alguns terminais

E quando os liguei (naturalmente automático) vi algumas vezes que eles não estavam conectados e a EA estava rodando sobre eles não informou que não havia conexão,

isto é, eu comecei este tópico e até agora a única maneira que encontrei é como eu disse acima com um programa externo.

 

Talvez esteja relacionado ao "recurso" que foi introduzido pela primeira vez com o Windows XP SP2 que se recusa a ter mais do que apenas um punhado de conexões semi-abertas a qualquer momento, principalmente para incomodar as pessoas que querem usar aplicações intensivas de rede. AFAIK existem métodos para corrigir este "recurso" irritante e restaurar a operabilidade normal: http://blog.davidkaspar.com/archives/2005/04/windows-xp-sp2-and-event-id-4226.php

Procure o evento 4226 no registro de eventos do windows.

 
7bit:
Esta é a única maneira correta de forçar um start() a partir de dentro do init() em uma EA. Não é permitido fazer isto em um indicador, uma vez que a start() será executada na rosca GUI.

Isto é bom, mas nem sempre funciona porque o carrapato pode ter desaparecido antes mesmo de ter retornado, caso em que o carrapato é descartado. Para destacar isto, se você acrescentar uma pausa de 5ms depois

PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return

então start() não será executado.

Existe uma solução melhor para que o consultor especializado comece() a executar em carga sem exigir um tique real do corretor?

 

Eu pouco velho, masprocurando uma solução para o mesmo problema que eu tive sobre este tópico.

Na verdade, a afirmação de qjol de que "a única maneira de fazer isso é com um script; o problema é que não há como abrir o terminal com um script carregado" é parcialmente verdadeira. Com um script ok, mas há uma maneira de iniciar um script com o terminal do cliente. Isto está documentado na ajuda do metatrader (F1, Ferramentas, Configuração na Inicialização). Talvez não seja o mesmo no momento em que este tópico foi iniciado.

Então eu desenvolvi um pequeno script para fazer o trabalho. Use isto com um script de inicialização, exemplo :

  ; open chart and run expert and/or script
  Symbol=EURUSD
  Period=H4
  Template=popular.tpl
  Expert=
  ExpertParameters=
  Script=CheckConnection
  ScriptParameters=

E lauch terminal com algo como :

"...\Metatrader 4\terminal.exe" config\start.ini

Arquivos anexados:
 

Oi, pessoal,

Vocêsconhecem algum de vocês, por que não trabalhar com carrapatos falsos de roteiro - https://www.mql5.com/en/forum/128803/page2#373539(página 2) este tópico para construir 600++?

Meu sistema operacional é Vista. Obrigado.

 
endy5:

Oi, pessoal,

Vocêsconhecem algum de vocês, por que não trabalhar com carrapatos falsos de roteiro - https://www.mql5.com/en/forum/128803/page2#373539(página 2) este tópico para construir 600++?

Meu sistema operacional é Vista. Obrigado.

Desde a build > 600 você tem que substituir "A" de ansi por "W" de unicode

int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageA(string lpString);
 

por que é usado 2 e 1 no parâmetro

PostMessageA(hwnd, msg, 2, 1)
 
iamsuman2:

por que é usado 2 e 1 no parâmetro

Está fora do escopo da MQL, mas não tem a função aqui:

 

Caso outra pessoa esteja procurando por informações sobre a função IsConnected().

Portanto, sim, a função não funcionará sob a função start() ou OnTick(), porque se não houver conexão, então nenhum novo tick chegará, e a função não acionará de qualquer forma....

Então, o que devemos fazer?

Use a função OnTimer(), para verificar regularmente a conexão, independentemente dos tiquetaques recebidos.

int timer = 60;   //60 seconds, for example
int OnInit()
  {
//--- create timer
   EventSetTimer(timer);  //could use EventSetMillisecondTimer(timer) for millisecond resolution
//---
   return(INIT_SUCCEEDED);
  }

// Metatrader self-triggered function, will be called regularly
void OnTimer()
  {
    if(!IsConnected())
      Alert("Problem, not connection to the server!");
  }

void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
      
 

fridayda13:

Portanto, sim, a função não funcionará sob a função start() ou OnTick(), porque se não houver conexão, então não chegará nenhum novo tick, e a função não acionará de qualquer forma....

Então, o que devemos fazer?

Use a função OnTimer(), para verificar regularmente a conexão, independentemente dos tiquetaques recebidos.

Você não deve fazer nada, porque não há nada que você possa fazer. Leva mais de 30 segundos antes que o tempo de rede se esgote e a função mude de valor. O que você vai fazer quando nada tiver mudado e você não tiver nenhuma conexão?

Só é útil se você nunca mais retornar do início/docurso (verifique antes de um OrderSend.) ou após o OrderSend para novas tentativas dentro do mesmo tick.

Em vez disso, se a OrderSend falhar, registre-a, retorne e teste/retroceda no próximo tick. Feito.

Razão: