IsConnected() - página 2

 
Matutin:

Basta chamar start() a partir do init () ...e você estará no start() mesmo que não venha nenhum tick !

obrigado u 2
 
Viffer:

Expandindo o meu link acima... Eu executo uma EA separada para monitorar o status da conexão. Ele basicamente tem todo o código para o meu teste codificado por dentro, começando com um sono no final. O início é basicamente um grande loop, quando termina, ele volta para o início. Mas ao invés de esperar que um tick acione o início, eu chamo de start() dentro do init(). Desta forma, start() continua a fazer loop com o sono e o init() nunca termina, então o código funciona com base em intervalos de tempo a partir do sono em vez de esperar por um tick... o link acima mostra o principal...

hth

V


Matutin:

Basta chamar start() a partir do init () ...e você estará no start() mesmo que não venha nenhum tick !


nenhum dos dois resolve o problema porque o init() também não começou se não houver conexão

a única maneira de fazer isso é com um script; o problema é que não há maneira de abrir o terminal com um script carregado

 
qjol:


nenhum dos dois resolve o problema porque o init() também não começou se não houver conexão

a única maneira de fazer isso é com um script; o problema é que não há maneira de abrir o terminal com um script carregado


Dê uma olhada nas ferramentas do MT4i.com. Eu as utilizo para monitot connexionar e enviar alerta por correio ou sms.

http://www.mt4i.com/mtdashboard.aspx

 
Matutin:

Basta chamar start() a partir do init () ...e você estará em start() mesmo que não venha nenhum tick !

NÃO! Isto não é permitido. espera-se que o init() retorne após 2 segundos. Não é permitido bloquear o init()! Todo tipo de problema pode (e irá) surgir a partir disso.

Basta fazer o loop no início e esperar que o próximo tick disponível seja chamado automaticamente após o carregamento da EA. Houve ticks antes que a conexão caísse, portanto seu loop já estará funcionando quando este evento ocorrer.


Se você realmente precisar acionar um init() a partir de dentro do init() porque você precisa que ele funcione no fim de semana, então a única maneira correta é usar o truque PostMessage() para impor um tick. Você atira a mensagem e depois deixa o init retornar! O MT4 então chamará start() da maneira normal e o init() não bloqueará.


Veja o próximo post para um exemplo.

 
// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}
Esta é a única maneira correta de forçar um início() de dentro do init() em uma EA. Você não está autorizado a fazer isso em um indicador, uma vez que o start() será executado na rosca GUI.
 
/**
* MT4/experts/scripts/ticks.mq4
* send a fake tick every 200 ms to the chart and
* all its indicators and EA until this script is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);
      Sleep(200);
   }
}
Por uma questão de completude, o acima mencionado é um roteiro que uso para simular carrapatos falsos no fim de semana. Você não precisa dele, é apenas um exemplo. Isto é útil principalmente para depuração de outros EAs e indicadores.
 
/**
* this is a variation of the above script meant to be run as an EA.
* Send a fake tick every 200 ms to the chart and
* all its indicators until this EA is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue the first fake tick
}

int start(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   while(!IsStopped()){
      PostMessageA(hwnd, msg, 2, 1);  // produce more fake ticks
      Sleep(200);
   }
}

E isto é o mesmo que o script acima, mas implementado como uma EA, demonstra os dois conceitos em uma EA.

No init(), ele vai perguntar o primeiro tique para acionar o primeiro start() e depois no start(), ele vai produzir mais tiquetaques em um loop infinito.

 
7bit:
Esta é a única maneira correta de forçar um início() de dentro do init() em uma EA. Você não está autorizado a fazer isto em um indicador, uma vez que o start() será executado na rosca GUI.

// this is an EA

#import "user32.dll"
   int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int RegisterWindowMessageA(string lpString);
#import

int init(){
   int hwnd=WindowHandle(Symbol(), Period());
   int msg = RegisterWindowMessageA("MetaTrader4_Internal_Message");
   PostMessageA(hwnd, msg, 2, 1); // enqueue a fake tick and let init() return
   return(0);
}


int start(){
   while (!IsStopped()){
      // do your stuff here
      Sleep(1000);
   }
   return(0);
}

tente colocar este EA em um gráfico, feche o terminal, depois desative sua conexão à internet e ligue seu terminal (enquanto a conexão à internet estiver desligada) & Você verá que não funciona

 
qjol:


tente colocar esta ea em uma tabela fechar o terminal do que desativar sua conexão com a internet e ligar seu terminal (enquanto a conexão com a internet estiver desligada) & Você verá que não funciona

Mas deve continuar funcionando uma vez iniciado em condições normais (que deve ser o caso de uso normal). Tente desconectar depois de ter sido iniciado.


E serve como um exemplo de como evitar um init() de bloqueio e executá-lo como um EA em vez de um script.

 
7bit:

Mas deve continuar funcionando uma vez iniciado em condições normais (que deve ser o caso de uso normal). Tente desconectar depois de ter sido iniciado.


E serve como um exemplo de como evitar um init() de bloqueio e executá-lo como um EA em vez de um script.


Você está certo, mas eu não estou procurando uma solução para a situação que você descreve, eu estou procurando uma solução para a situação que eu descrevo, e neste momento a única solução que encontrei, que, software externo, irá executar um script