Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 185

 

Boa tarde.

Preciso que a EA desista após um determinado evento.

Entendo que esta é a função deinit(), eu preciso chamá-la de alguma forma. Esta é uma citação do tutorial:

"A função especial deinit() é chamada para execução pelo terminal do cliente também quando o terminal do cliente é desligado, quando a janela do instrumento financeiro é fechada, pouco antes de alterar um instrumento financeiro e/ou período do gráfico, quando o programa é recompilado com sucesso no MetaEditor, quando os parâmetros de entrada são alterados, e quando a conta é alterada. "

Então eu tenho que fechar o terminal manualmente, por exemplo, para que esta função seja chamada?

Tentei chamar esta função quando uma condição desencadeou, ela foi executada, mas um novo tique veio e a função de início foi iniciada novamente.

int deinit()
  {
  Alert("Закрываем программу"); 
   return(0);
  }

int start()
{
//код
..............
if (OrdersTotal()==0) deinit();
return(0);
}



Como eu ainda termino o programa?

Obrigado.

 
GygaByte:

Boa tarde.

Preciso que a EA pare depois de um certo evento.

Entendo que esta é a função deinit(), eu preciso chamá-la de alguma forma. Esta é uma citação do tutorial:

"A função especial deinit() é chamada para execução pelo terminal do cliente também quando o terminal do cliente é desligado, quando a janela do instrumento financeiro é fechada, pouco antes de alterar um instrumento financeiro e/ou período do gráfico, quando o programa é recompilado com sucesso no MetaEditor, quando os parâmetros de entrada são alterados, e quando a conta é alterada. "

Então eu tenho que fechar o terminal manualmente, por exemplo, para que esta função seja chamada?

Tentei chamar esta função quando uma condição desencadeou, ela foi executada, mas um novo tique veio e a função de início foi iniciada novamente.

Como eu ainda termino o programa?

Obrigado.

Para fechar o terminal programmaticamente, insira logo no início do código antes da função start():

//----
#import "user32.dll"
int GetParent(int hWnd);  // вызов API
#import
//----

Na função start(), quando você precisar fechar o terminal, ligue para ExitMT4(), que você declara fora da função start()

//+----------------------------------------------------------------------------+
void ExitMT4() {  // выгрузить MT4 из памяти

   int hwnd=WindowHandle(Symbol(),Period());
   int hwnd_parent=0;
//----
   while(!IsStopped()) {
      hwnd=GetParent(hwnd);
      if(hwnd==0) break;
      hwnd_parent=hwnd;
      }
   if(hwnd_parent!=0) PostMessageA(hwnd_parent,WM_CLOSE,0,0);
}
//+----------------------------------------------------------------------------+
 
artmedia70:

Para fechar o terminal programmaticamente, insira logo no início do código antes da função start():

Na função start(), quando você precisar fechar o terminal, ligue para ExitMT4(), que você declara fora da função start()



Muito obrigado por sua resposta abrangente.

Basicamente, seria suficiente para mim apenas terminar a EA, não preciso fechar o terminal. Não há uma maneira fácil de fazer isso?

Acho que deinit() deveria de alguma forma resolver esta questão, mas devo estar fazendo algo errado...

 

Não posso remover o Terminal.exe da Alpari Limited, construa o 509.

Ao utilizar o painel de controle para desinstalar, um "Você não tem direitos suficientes para desinstalar". Contate seu administrador de sistema".

Ao utilizar o Uninstall.exe ele exibe "Server has retornado o link".

O suporte técnico da Alpari não consegue dizer nada compreensível. Eles apenas sugeriram que eu deveria apagar a pasta inteira e instalar o terminal em outro diretório.

Eu tenho Win 7, Ultimate. Direitos de Administrador ativado, eu executei Uninstall.exe como Administrador.

Eu ficaria muito grato por qualquer ajuda para resolver este problema.

 
GygaByte:


Muito obrigado pela resposta detalhada.

Em princípio, seria suficiente para mim apenas terminar a EA, não há necessidade de fechar o terminal. Não há uma maneira fácil?

Acho que deinit() deveria de alguma forma resolver esta questão, mas devo estar fazendo algo errado...

Não deinit(), mas return(0);
 
artmedia70:
Não deinit() mas return(0);


Se não me engano, o return(0) simplesmente terminará a função atual start() e aguardará o próximo tick, enquanto eu preciso que a EA termine seu trabalho, como se eu o tivesse separado manualmente do gráfico.

Eu o verifiquei na prática e ele continua exibindo "0 ordens em aberto" de alerta a cada tique.

Eu não esperei pelo querido "Tchau".

int start()
  {
  if (OrdersTotal()==0) 
   {
   Alert("Открытых ордеров - ", OrdersTotal());
   return(0);
   }  
  }
//+------------------------------------------------------------------+
int deinit()
  {
 Alert("Пока");  
   return(0);
  }
 
polycomp:

Não é possível desinstalar o Terminal.exe da Alpari Limited, construa o 509.

Ao utilizar o painel de controle para desinstalar, um "Você não tem direitos suficientes para desinstalar". Contate seu administrador de sistema".

Ao utilizar o Uninstall.exe ele exibe "Server has retornado o link".

O suporte técnico da Alpari não consegue dizer nada compreensível. Eles apenas sugeriram que eu deveria apagar a pasta inteira e instalar o terminal em outro diretório.

Eu tenho Win 7, Ultimate. Direitos de administrador ativado, desinstalar.exe executado como administrador.

Será muito grato por qualquer conselho para resolver este problema

Alguns programas maliciosos (mail.ru, eu tinha) redistribuem os direitos de acesso, de modo que você com privilégios de administrador não tem acesso à sua remoção.

O problema foi resolvido pelo método de poke científico na redistribuição de direitos (clique sobre a pasta, propriedades, segurança, alterar, adicionar, opcional, tipos de objetos, search.......)

Mas depois conheci o "Revo uninstaller" e todo o incômodo de apagar algo desapareceu + a certeza de que o registro foi limpo de suas atividades.

 
GygaByte:


Se não me engano, o return(0) simplesmente terminará a função atual start() e aguardará o próximo tick. Preciso que a EA termine seu trabalho como se eu o tivesse separado manualmente do gráfico.

Verifiquei na prática - interminavelmente a cada tique dá o alerta "Ordens abertas - 0".

Eu não esperei pelo querido "Adeus".

Seu desejo faz lembrar a piada das "damas". Se você quiser que a EA pare de negociar, então ativando a bandeira (global) (após algumas condições), a interrupção da função start() (saída via retorno) dará o resultado esperado.
 
ALXIMIKS:

Alguns programas maliciosos (mail.ru que eu tinha) redistribuem os direitos de acesso e fazem com que você com direitos de administrador não tenha acesso à sua eliminação.

O problema foi resolvido pelo método científico de redistribuição de permissões (PCM na pasta, propriedades, segurança, alterar, adicionar, opcional, tipos de objetos, search.......)

Mas depois conheci o "Revo uninstaller" e todo o incômodo de apagar algo desapareceu, + a certeza de que o registro foi limpo de suas atividades.

Muito obrigado! Vou me familiarizar com o Desinstalador Revo.
 
TarasBY:
Seu desejo faz lembrar a piada do "desenhista". Se você quiser que o consultor pare de negociar, então pela ativação da bandeira (global) (após algumas condições), a interrupção do início da função() (saída via retorno) dará o resultado esperado.

Isto é mais ou menos o que parece:

bool GlobalFlag;
int init()
{
   GlobalFlag = true;
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if ( GlobalFlag )
      if (OrdersTotal() == 0) 
      {
         GlobalFlag = false;
         Alert("Открытых ордеров - ", OrdersTotal());
         Alert("Пока");  
      }  
   return(0);
}
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+
Razão: