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

 
Ivan_Invanov:
Geralmente, a julgar por sua resposta, você não entende realmente como o programa funciona. Portanto, parece ser uma pergunta estúpida. Assim como o comentarista anterior pensa que isso pára. Apenas pela experiência de programação em outras linguagens, acho que ele executa seu corpo em loop, e quando chega um evento, ele mergulha nele. Se o programa executa seu corpo em loop, isso explica porque o programa é escrito dessa forma.

Quando ocorre um evento de "novo tick", o programa é iniciado no manipulador OnTick(), executado até a conclusão e parado. Com a chegada de um novo tique tudo se repete desde o início. Se um novo tick chegou durante a execução do programa, e o programa ainda não terminou de processar o tick anterior (ainda está em execução), então este tick é pulado.

Os programas em MQL não são looped. Eles têm três pontos de entrada - OnInit(), OnDeinit() e OnTick().

Na inicialização, OnInit() é executado, depois quando um tick é recebido - OnTick(), quando a operação é concluída - OnDeinit().

Há outros manipuladores também. Mas é melhor abrir a ajuda em vez de pedir a alguém que a duplique aqui.

Документация по MQL5: Программы MQL5
Документация по MQL5: Программы MQL5
  • www.mql5.com
Для того чтобы mql5-программа могла работать, она должна быть скомпилирована (кнопка "Компилировать" или клавиша F7). Компиляция должна пройти без ошибок (допускаются предупреждения, которые необходимо проанализировать). При этом в соответствующей директории Эксперты, пользовательские индикаторы и скрипты прикрепляются к одному из открытых...
 

Olá. Enquanto trabalhava no meu indicador, encontrei um bug ao reiniciar o terminal. Com base neste bug, fiz um pequeno código fonte para seus testes:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class Loader {
private:
  string symbol;
  ENUM_TIMEFRAMES timeframe;

public:  
  Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); // Этот же вызов iBars() работает нормально
  }
};

Loader * loader;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  loader = new Loader();
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  delete loader;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]
) {
  return(rates_total);
}

Se este exemplo for lançado em um gráfico (ou é o primeiro terminal a ser iniciado após a partida do sistema), tudo funciona bem. No registro, diz o seguinte:

2020.06.24 21:05:50.773 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 21:05:50.773 Carregador::Barras carregadoras: 140433

2020.06.24 21:05:50.773 Loader::Loader Error: 0

2020.06.24 21:05:50.773 Loader::Loader bars (2): 140433


Mas se eu reiniciar o terminal com este indicador, recebo um erro:

2020.06.24 21:07:34.963 Carregador::Símbolo do carregador: EURUSD Prazo: PERÍODO_H1

2020.06.24 21:07:34.963 Loader::Barras Loader: 0

2020.06.24 21:07:34.963 Loader::Loader Error: 4401

2020.06.24 21:07:34.964 Loader::Loader bars (2): 140433

Símbolo e cronograma inicializados ok

2020.06.24 21:07:34.963 Carregador::Símbolo do carregador: EURUSD Prazo: PERÍODO_H1

Mas iBars(símbolo, cronograma) dá 0 por alguma razão

2020.06.24 21:07:34.963 Loader::Barras Loader: 0

Neste caso, aparece o erro 4401.

Mas iBars(Símbolo(), Período()) funciona bem.

2020.06.24 21:07:34.964 Loader::Loader bars (2): 140433

Pelo menos símbolo = Símbolo() e cronograma = Período() de acordo com as mensagens de registro (mesmo durante a defasagem, quando o terminal reinicia). Como o iBars(símbolo, prazo), com símbolo e prazo absolutamente corretos, pode dar zero, enquanto iBars(Símbolo(), Prazo()) funciona bem, se os parâmetros em funções são os mesmos, de acordo com o log?

Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
Arquivos anexados:
Test.mq5  7 kb
 
Quem conhece o moderador desta linha?
 

Como abro uma conta demo MT4 em MetaQuotes Demo? Costumava funcionar sem nenhum problema, agora na última página do diálogo diz: Registro, Espere um pouco, por favor, e neste estado permanece ocioso indefinidamente, os campos com login e senha permanecem vazios. Nenhuma mensagem em log. Tentou tanto a "demonstração" como a "real" e diferentes tipos de contas.

UPD Tried one broker demo - a mesma coisa.

 
Artyom Trishkin:

Quando ocorre um evento de "novo tick", o programa é iniciado no manipulador OnTick(), executado até a conclusão e parado. Com a chegada de um novo tique tudo se repete desde o início. Se um novo tick chegou durante a execução do programa, e o programa ainda não terminou de processar o tick anterior (ainda está em execução), então este tick é pulado.

Os programas em MQL não são looped. Eles têm três pontos de entrada - OnInit(), OnDeinit() e OnTick().

Na partida, OnInit() é executado, depois quando um tick é recebido - OnTick(), quando a operação é concluída - OnDeinit().

Há outros manipuladores também. Mas é melhor abrir a ajuda em vez de pedir a alguém que a duplique aqui.

Obrigado. Sim, eu entendo isso, é só que a função está escrita no corpo do programa. Talvez eu não tenha percebido que foi chamado em algum lugar.
 
Ivan_Invanov:
Obrigado. Sim, eu entendo isso, é só que a função está escrita no corpo do programa. Talvez eu não tenha percebido que foi chamado em algum lugar.

Como podemos ver do que você está falando? Dê-nos um exemplo.

 
Artyom Trishkin:

Como podemos ver do que você está falando? Dê-nos um exemplo.

Obrigado novamente, sim, não notei a chamada, procurei agora, e ela foi chamada pela função que abre os negócios.
 
Ivan_Invanov:
Obrigado. Sim, eu entendo, é apenas a função que está escrita no corpo do programa. Talvez eu tenha perdido uma chamada para isso em algum lugar.

Em mql4 as funções são escritas em qualquer ordem, acima não importa, abaixo pode parecer que funciona mais cedo ou mais tarde. Não existe tal coisa em C++ onde todas as funções podem funcionar somente em ordem de escrita e se você quiser chamá-la, ela deve ser definida antes do local de chamada caso contrário o programa trava. O homem me mostrou como escrever funções em ordem diferente, mas não me lembro como fazer isso em C++.

 
Ivan_Invanov:

Saudações. Por favor, me ajude. Eu tenho esta pergunta. Se entendo corretamente. O programa é executado do início ao fim, mas pára quando ocorre um evento, por exemplo, um tick, a função ontick começa a ser executada, depois termina sua execução e o programa é executado novamente desde o início? Esta pergunta está relacionada ao seguinte, onde devo escrever, por exemplo, o tamanho do lote comercial, no corpo do programa ou na função de pen drive?

Eu olho para o bot oficial, que é como um exemplo no terminal, há um cálculo de lote no corpo do programa, e não entendo porquê.

Meu lote é calculado da seguinte forma

#property link      "http://www.mql5.com"
input double CheckLots = 0.01;
input int    Persent   = 5;
   double Lots=NormalizeDouble(AccountBalance()*CheckLots/1000-0.005,2);  

está no início do Expert Advisor...e eu o coloco no final do código

Quando a função OnTick chama a variável Lots, então a EA a encontra e recalcula.

 

@Artyom Trishkin

Você é um moderador neste tópico?

Razão: