Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1315

 
Aleksey Mavrin:

Existe tal coisa no MT4, não sei se quando o OnInit é acionado após mudar a conta, o ambiente não teve tempo para atualizar o número da conta ou algum outro bug, eu decidi temporizar

muitas coisas dão errado se o terminal com EA em funcionamento for recarregado

imho, se o código não é para o testador, então toda inicialização é melhor quando o primeiro tick chegar - então 99,9% de tudo será inicializado corretamente

 
Igor Makanu:

muitas coisas dão errado se o terminal com um EA em funcionamento estiver sobrecarregado

imho, se o código não é para um testador, então toda inicialização é melhor quando o primeiro tick chegar - então 99,9% de tudo será inicializado corretamente

Concordo, mas provavelmente há 0,1% ))

 
Igor Makanu:

muitas coisas dão errado se o terminal com um EA em funcionamento estiver sobrecarregado

imho, se o código não é para o testador, então é melhor inicializar tudo quando o primeiro tick chegar - então 99,9% de tudo será inicializado corretamente

melhor fazer toda a inicialização quando chegar o primeiro tick - então 99,9% das coisas serão inicializadas corretamente... como é??

 
ponochka:

todas as inicializações são melhor feitas na chegada do primeiro tick - então 99,9% de tudo será inicializado corretamente... como é??

void OnTick()
{
   static bool first_run = true;
   if(first_run)
   {
      MyOnInit();
      first_run = false;
   }
 
Igor Makanu:

Você pode fazer isso diretamente, evitando um espaçador do tipo "Meu".

int OnInit()
  {
   ...
    account=AccountNumber();
   ...
  }

void OnTick()
{
  static bool first_run = true;
   if(first_run)
   {
     if(account==0) { // Если терминал не успел получить данные с сервера
      OnInit(); // пробуем снова всё инициализировать
      return;
     }
      first_run = false;
   }
 
Vitaly Muzichenko:

Você pode fazer isso diretamente, evitando o estofamento na forma de "Meu".

não é um estofamento, é um código estruturado.

Seu exemplo é um exemplo de como é preguiçoso escrever um par extra de cartas e obter código não-sistemático - aqui pelo menos 2 vezes será chamado OnInit() ao executar EA, não o fato de que será necessário, ou melhor, não violar o que foi escrito antes - o nível de perguntas que você viu, certo? )))

 
Igor Makanu:

não é um bloco, é um código estruturado

Seu exemplo é um exemplo de como é preguiçoso escrever um par extra de cartas e obter código não estruturado - aqui pelo menos 2 vezes será chamado OnInit() na inicialização da EA, não o fato de que será necessário, ou melhor, não quebrará o que foi escrito antes - o nível de perguntas que você viu, certo? )))

first_run = true;

Você também precisa verificar no Init na primeira inicialização e talvez já lá esteja "zero".

Caso contrário, sim, eu concordo.


P.S. Eu não concordo, não será chamado 2 vezes se você conseguiu se conectar ao servidor e obter dados reais a partir dele.

 
Igor Makanu:

não funciona, porque está escrito na documentação queOnTick() não funciona em indicadores!

 
ponochka:

não funciona, porque a documentação diz queOnTick() não funciona em indicadores!

Bem, este é o limite :(

Substitua OnTick() por

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
E eu irei para a outra filial.
 
Vitaly Muzichenko:

Bem, esse é o limite :(

Eu escrevi acima, sobre o nível das perguntas ;)

E você começou a procurar a otimização da inicialização no OnTick/OnInit - tudo é mais simples lá, você precisa de proteção para que o código encontrado possa ser compartilhado com os mesmos amigos ))))

Razão: