Características da linguagem mql5, subtilezas e técnicas - página 168

 
Slava:

Quando se recebe uma mensagem sobre uma fuga de memória, isso significa que não houve nenhum comando explícito para libertar essa memória.

Quando o programa termina (que é quando se recebe estas mensagens), liberta toda a memória, incluindo a memória vazada, de qualquer forma.

Posso ter usado o termo "fuga" de informação de forma demasiado solta. A questão é que um recurso é deixado pendurado na memória, cujo nome nem sequer é reconhecível se o objecto for apagado. E se souber o seu nome, não poderá apagá-lo em lado nenhum a não ser do programa que criou o recurso.


Agora é muito fácil escrever um guião para o Market que irá suspender (não necessariamente premeditado) o Terminal no VPS, enchendo toda a memória com recursos que não são apagados após a execução do guião.

 

Alguns servidores de negociação podem ter mais do que um tipo de conta de cada vez. Por exemplo, ECN e norma. Neste caso, os símbolos podem não ter prefixos, ou seja, os nomes são os mesmos.

Neste caso, o histórico do bar (incluindo o valor actual do lance/venda/venda/último no gráfico) e o histórico do tick correspondem sempre apenas a um tipo de conta.

E os dados do Market Watch correspondem aos que estão ligados.


Devido a isto, é fácil observar que o Market Watch é completamente inconsistente com os gráficos e a história do tick.

 

Várias vezes encontrei uma alteração acidental (manual) do símbolo da carta onde se encontra um conselheiro de combate.

Protecção contra a mudança de símbolos.

int OnInit()
{
  static const string Symb = _Symbol;  
  const bool Res = (_Symbol != Symb);
  
  if (Res)
    Alert("Symbol is change!");
  
  return(Res); // Защита от смены символа.
}
 
Ao iniciar uma EA, é frequentemente necessário decidir o momento a partir do qual o histórico de preços deve ser obtido. Para evitar ter de o introduzir manualmente de cada vez, fi-lo desta forma.
#define  WEEK (7 * 24 * 3600)
input datetime temp = __DATE__ - WEEK;

Por conseguinte, levo a história uma semana antes da sua compilação. É conveniente.

 
fxsaber:
Ao iniciar uma EA, é frequentemente necessário decidir o momento a partir do qual o histórico de preços deve ser obtido. Para evitar ter de o introduzir manualmente de cada vez, fi-lo desta forma.

Por conseguinte, levo a história uma semana antes da sua compilação. Conveniente.

Por que razão deveria confiar demasiado no optimizador? É melhor:

#define WEEK 604800

 

Função de interrupção de emergência, parece funcionar bem

#define  EXIT (STD_CExit(__LINE__,__FUNCTION__)).Exit

class STD_CExit{
   string function;
   int line;
public:
   STD_CExit(int _line,string _func):line(_line),function(_func){}
   void Exit(string reason=NULL);
};
//--------------------------------------------------------------------------
void STD_CExit::Exit(string reason=NULL){
   Alert(StringFormat("Abort in line %i, function %s.\nReason: %s.",line,function,reason==NULL||reason==""?"Unknow":reason));
   int a=0;
   int b=1/a;}

void OnStart()
{
   Test();
}

void Test(){
   EXIT("Some reason");
}
 
Vladimir Simakov:

Função de interrupção de emergência, parece estar a funcionar bem

é a coisa certa a fazer - fiquei feliz por ver isso acontecer... fizemo-lo com@Victhttps://www.mql5.com/ru/forum/318246/page10#comment_12651569

mas isto:

- nãoSaída http://www.delphibasics.ru/Exit.php

- nãoAbortar http://www.delphibasics.ru/Abort.php

éHalt http://www.delphibasics.ru/Halt.php

UPD: um tal guião é muito necessário

void OnTick()
{
   if(!getData()) EXIT("No data");
}
bool getData()
{
   return(false);
}
 
Igor Makanu:

a coisa é necessária - fiquei feliz por ver isso acontecer..., aqui está o problema que resolvemos com@Victhttps://www.mql5.com/ru/forum/318246/page10#comment_12651569

mas isto:

- nãoSaída http://www.delphibasics.ru/Exit.php

- nãoAbortar http://www.delphibasics.ru/Abort.php

éHalt http://www.delphibasics.ru/Halt.php

UPD: um tal guião é muito necessário

Ainda não há maneira de isso funcionar(((
 
Vladimir Simakov:
Este ainda não funcionou((((.

não consigo ver porque preciso dele!

Se os programadores tivessem dado saída / abortar como padrão, então seria possível terminar correctamente o processamento de dados, se, por exemplo, a TF não estiver pronta - dados OHLC, também seria útil para o processamento de ordens de envio para o servidor... seria conveniente interromper o código em qualquer lugar e sair antes do próximo tick sem retorno infinito() para sair de OnTick()

 
Igor Makanu:

não posso ter a certeza de que preciso!

Se os programadores tivessem dado saída / abortar como padrão, então seria possível terminar correctamente o processamento de dados, se, por exemplo, a TF não estiver pronta - dados OHLC, também seria útil para o processamento de ordens de envio para o servidor... seria conveniente interromper o código em qualquer lugar e sair antes do próximo tick sem retorno infinito() para sair de OnTick()

Bem, não podia, ainda não...