Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1188

 
Ivan_Invanov:
En général, à en juger par votre réponse, vous ne comprenez pas vraiment le fonctionnement du programme. Donc ça semble être une question stupide. Tout comme le commentateur précédent pense que ça s'arrête. D'après mon expérience de programmation dans d'autres langages, je pense qu'il exécute son corps dans une boucle, et lorsqu'un événement survient, il s'y plonge. Si le programme exécute son corps dans une boucle, cela explique pourquoi le programme est écrit de cette façon.

Lorsqu'un nouveau tick se produit, le programme est lancé dans le gestionnaire OnTick(), exécuté jusqu'à la fin et arrêté. Avec l'arrivée d'une nouvelle tique, tout se répète depuis le début. Si un nouveau tick est arrivé pendant l'exécution du programme, et que le programme n'a pas fini de traiter le tick précédent (il est toujours en cours d'exécution), alors ce tick est sauté.

Les programmes en MQL ne sont pas bouclés. Ils ont trois points d'entrée - OnInit(), OnDeinit() et OnTick().

Au démarrage, OnInit() est exécuté, puis lorsqu'un tick est reçu - OnTick(), lorsque l'opération est terminée - OnDeinit().

Il existe également d'autres manipulateurs. Mais vous feriez mieux d'ouvrir l'aide plutôt que de demander à quelqu'un de la reproduire ici.

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

Bonjour. En travaillant sur mon indicateur, j'ai trouvé un bug lors du redémarrage du terminal. Sur la base de ce bogue, j'ai créé un petit code source pour le tester :

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

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);
}

Si cet exemple est lancé sur un graphique (ou s'il s'agit du premier démarrage du terminal après le démarrage du système), tout fonctionne bien. Dans le journal, il est indiqué ce qui suit :

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

2020.06.24 21:05:50.773 Loader::Barres de chargement : 140433

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

2020.06.24 21:05:50.773 Loader::Barres de chargeurs (2) : 140433


Mais si je redémarre le terminal avec cet indicateur, j'obtiens une erreur :

2020.06.24 21:07:34.963 Loader::Loader symbole : EURUSD timeframe : PERIOD_H1

2020.06.24 21:07:34.963 Loader::Barres de chargement : 0

2020.06.24 21:07:34.963 Loader::Loader Erreur : 4401

2020.06.24 21:07:34.964 Loader::Barres de chargeurs (2) : 140433

Symbole et calendrier initialisés ok

2020.06.24 21:07:34.963 Loader::Loader symbole : EURUSD timeframe : PERIOD_H1

Mais iBars(symbol, timeframe) donne 0 pour une raison quelconque.

2020.06.24 21:07:34.963 Loader::Barres de chargement : 0

Dans ce cas, l'erreur 4401 apparaît.

Mais iBars(Symbol(), Period()) fonctionne bien.

2020.06.24 21:07:34.964 Loader::Barres de chargeurs (2) : 140433

Au moins symbol = Symbol() et timeframe = Period() selon les messages du journal (même pendant le lag, lorsque le terminal redémarre). Comment iBars(symbol, timeframe), avec un symbole et un timeframe absolument corrects, peut-il donner zéro, alors que iBars(Symbol(), Period()) fonctionne bien, si les paramètres des fonctions sont les mêmes, selon le log ?

Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
Dossiers :
Test.mq5  7 kb
 
Qui connaît le modérateur de ce fil de discussion ?
 

Comment ouvrir un compte de démonstration MT4 sur MetaQuotes Demo ? Avant, cela fonctionnait sans problème, maintenant, sur la dernière page de la boîte de dialogue, il est indiqué : Enregistrement, Patientez un peu, s'il vous plaît, et dans cet état, il reste inactif indéfiniment, les champs avec le login et le mot de passe restent vides. Aucun message dans le journal. J'ai essayé les comptes "démo" et "réel" et différents types de comptes.

UPD A essayé la démo d'un courtier - même chose.

 
Artyom Trishkin:

Lorsqu'un événement "new tick" se produit, le programme est lancé dans le gestionnaire OnTick(), exécuté jusqu'à la fin et arrêté. Avec l'arrivée d'une nouvelle tique, tout se répète depuis le début. Si un nouveau tick est arrivé pendant l'exécution du programme, et que le programme n'a pas fini de traiter le tick précédent (il est toujours en cours d'exécution), alors ce tick est sauté.

Les programmes en MQL ne sont pas bouclés. Ils ont trois points d'entrée - OnInit(), OnDeinit() et OnTick().

Au démarrage, OnInit() est exécuté, puis lorsqu'un tick est reçu - OnTick(), lorsque l'opération est terminée - OnDeinit().

Il existe également d'autres manipulateurs. Mais vous feriez mieux d'ouvrir l'aide plutôt que de demander à quelqu'un de la reproduire ici.

Merci. Oui, je comprends, c'est juste que la fonction est écrite dans le corps du programme. Peut-être que je n'ai pas remarqué qu'il était appelé quelque part.
 
Ivan_Invanov:
Merci. Oui, je comprends, c'est juste que la fonction est écrite dans le corps du programme. Peut-être que je n'ai pas remarqué qu'il était appelé quelque part.

Comment pouvons-nous voir ce dont vous parlez ? Donnez-nous un exemple.

 
Artyom Trishkin:

Comment pouvons-nous voir ce dont vous parlez ? Donnez-nous un exemple.

Merci encore, oui, je n'avais pas remarqué l'appel, je l'ai regardé maintenant, et il a été appelé par la fonction qui ouvre les transactions.
 
Ivan_Invanov:
Merci. Oui, je comprends, c'est juste que la fonction est écrite dans le corps du programme. J'ai peut-être manqué un appel quelque part.

Dans mql4, les fonctions sont écrites dans n'importe quel ordre, au-dessus-dessous, cela n'a pas d'importance, cela peut sembler fonctionner avant ou après. Il n'y a pas de telle chose en C++ où toutes les fonctions ne peuvent fonctionner que dans l'ordre d'écriture et si vous voulez l'appeler, elle doit être définie avant le lieu d'appel sinon le programme se plante. L'homme m'a montré comment écrire des fonctions dans un ordre différent, mais je ne me souviens pas comment le faire en C++.

 
Ivan_Invanov:

Salutations. Aidez-moi, s'il vous plaît. J'ai une question. Est-ce que je comprends bien. Le programme est exécuté du début à la fin, mais s'arrête lorsqu'un événement se produit, par exemple un tick, la fonction ontick commence à s'exécuter, puis elle termine son exécution et le programme est à nouveau exécuté depuis le début ? Cette question est liée à la suivante, où dois-je écrire par exemple la taille du lot de négociation, dans le corps du programme ou dans la fonction ontick ?

Je regarde le bot officiel, qui est un exemple dans le terminal, là beaucoup de calcul est effectué dans le corps du programme, et je ne comprends pas pourquoi ainsi.

Mon lot est calculé comme suit

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

c'est au début de l'Expert Advisor...et je l'ai mis à la toute fin du code

Lorsque la fonction OnTick appelle la variable Lots, alors EA la trouve et la recalcule.

 

@Artyom Trishkin

Êtes-vous un modérateur dans ce fil ?