Erreurs, bugs, questions - page 435

 
voix_kas:

En général, c'est drôle comme ça se passe.
Par intuition, j'ai pensé que la fonction OnDenit est une sorte de destructeur et que la fonction OnInit est un constructeur d'une EA.

En fait, il s'avère que OnInit est un événement multiple (dans la durée de vie d'Expert Advisor). Il n'est pas clair alors, pourquoi avons-nous besoin de générer explicitement l'événement OnDenit si nous savons que l'EA ne termine pas son opération (par exemple, en cas de changement de période graphique) ?

Lorsque les symboles changent, le conseiller expert est chargé à chaud afin de permettre un démarrage rapide et de sauvegarder la base d'informations de sa vie précédente.

Par exemple, le conseiller expert est sur le graphique, il a accumulé ses statistiques et sa logique, puis il change de cadre temporel et doit recommencer à zéro lors d'un redémarrage à froid.

Et il y a une autre question.
La raison de la désinitialisation de REASON_CHARTCHANGE - un symbole ou une période graphique a été modifié.
Veuillez expliquer comment on peut changer le symbole d'un graphique sans supprimer un EA qui s'y trouve ?

En mode de redémarrage à chaud.
 

Yedelkin, Intéressant, Renat
Merci pour ces précisions.

Je pense qu'il est également judicieux d'inclure une liste explicite des redémarrages "à chaud" et "à froid" dans la documentation.

S'il n'y a pas de réinitialisation à chaque OnInit, pour l'EA multicast nous devrons utiliser une béquille, qui est un drapeau global. :(
Je posterai le code un peu plus tard.

 
Interesting:

Dans tous les cas, le Conseiller Expert ne sera pas supprimé lors de l'initialisation normale, il sera juste autorisé à trader sous certains paramètres du terminal (mais pour cela le Conseiller Expert doit comprendre que le symbole a été changé...).

Au fait, ça me rappelle. J'ai voulu demander aux développeurs quels étaient ces paramètres.

Renat, veuillez créer deux cases à cocher différentes pour désactiver le trading lors du changement d'échelle de temps et de symbole. Ce sont deux changements fondamentalement différents.

Je ne voudrais pas que mes EAs s'arrêtent de trader lorsqu'ils changent de période - c'est absolument inutile - de toute façon, ils traitent chaque tick et il n'y a aucun problème avec cela.

Mais le changement de symbole est fondamentalement important. Je voudrais garder ce verrouillage... mais maintenant ces deux ajustements sont pour une raison quelconque synchronisés et régulés ensemble.

Je résous ce problème de manière programmatique (en stockant le symbole original dans une variable statique et en contrôlant les changements dans l'inite). Mais il serait préférable que cela puisse être bloqué au niveau du terminal.

Mieux encore, il serait possible de réglementer la possibilité même de changer de cadre temporel ou de symbole lorsque le conseiller expert est en cours d'exécution. Pourquoi arrêter de commercer à cause d'une stupidité ou d'un oubli ?

C'est-à-dire qu'il serait bien mieux de bloquer le changement de cadre temporel et/ou de symbole (séparément !), s'il est spécifié dans les paramètres que cela est interdit lorsque le conseiller expert est présent sur un graphique.

// En donnant un message correspondant lors de la tentative de le faire.

En fait, ce problème peut également être résolu de manière programmatique (en remettant de force le symbole ou l'horizon temporel en place), mais je pense que vous êtes vous-même intéressé par des réglages vraiment pratiques au niveau du terminal.

 

MetaDriver:

Renat, veuillez créer deux cases à cocher différentes pour bloquer les transactions en cas de changement d'horizon temporel et de changement de symbole. Ce sont deux changements fondamentalement différents.

Je ne veux pas que mes EAs s'arrêtent de trader quand ils changent de période - c'est absolument inutile - de toute façon ils traitent chaque tick et il n'y a aucun problème avec cela.


Je soutiens l'idée, vous devriez faire deux ticks et une séparation dans les codes de raison de désinitialisation (ce serait plus pratique comme ça).

Mais bloquer la possibilité de changer de période, je ne sais pas comment (sur le symbole), c'est trop pour moi.

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
MetaDriver:

Ça me rappelle. Cela fait longtemps que j'ai envie de demander aux développeurs quels sont ces paramètres.

Renat, veuillez créer deux cases à cocher différentes pour bloquer les transactions en cas de changement d'horizon temporel et de changement de symbole. Ce sont deux changements fondamentalement différents.

Oui, il semble que la condition de changement de symbole et d'horizon temporel ait été combinée pour rien.

Moi aussi, je suis favorable à ce qu'on les divise en deux conditions. Le ticket a déjà été placé dans le Service Desk.

 

En fait, je joins le code permettant de définir les outils de travail pour le multicuiseur. Toute critique est la bienvenue. :)

input uint   inTimeToRescan = 3600; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF"; // Рабочие инструменты


bool Initialize;


int OnInit() {
  //...
  Initialize = true;
  //...
}


void OnTick() {
  static ulong  LastScan = 0;
  if ((ulong)TimeCurrent() - LastScan >= inTimeToRescan) Initialize = true;

  static string Symbol[];
//  static int    Forecast[];
//  static int    Volatile[];

  if (Initialize) {
    Comment("Опрос рабочих инструментов...");
    int SymbolCount_1 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        SymbolCount_1++;

    if (!SymbolCount_1) return;
    if (ArrayResize(Symbol, SymbolCount_1) != SymbolCount_1) return;

    int SymbolCount_2 = 0;
    for (int i = 0; i < SymbolsTotal(false); i++)
      if (StringFind(inWorkSymbols, SymbolName(i, false)) != -1)
        Symbol[SymbolCount_2++] = SymbolName(i, false);

    if (SymbolCount_1 != SymbolCount_2) return;

    //if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;
    //if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;

    Initialize = false;
  }
  //...
}

Chaque tick, un conseiller expert essaie d'obtenir une liste d'instruments de travail.
La mise à jour de la liste des instruments de travail se produit dans deux conditions : 1) OnInit est déclenché, 2) après le temps qui a été fixé dans le paramètre d'entrée de l'EA.
Comme nous le voyons, une béquille sous la forme d'une variable globale(bool Initialize) est utilisée pour détecter la prochaine initialisation. S'il y avait une initialisation des statiques, elle ne serait pas nécessaire.

Je considère les variables globales comme un mal, de même que l'opérateur goto inconditionnel en son temps.

 
voix_kas:

En l'absence de réinitialisation à chaque OnInit, pour les multilatéraux, une "béquille" sous forme de drapeau global doit être utilisée. :(

Il est préférable d'écrire le code avec soin dès le début, sans laisser de béquilles sous forme de variables statiques intermédiaires.

La solution consiste à cacher ces données dans une classe. Si la classe est morte, l'environnement l'est aussi.

Et au niveau global, laissez un minimum de variables statiques.

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 
voix_kas:

En fait, je joins le code permettant de définir les outils de travail pour le multicuiseur. Toute critique est la bienvenue. :)

Une astuce : mettez le symbole au niveau global et mettez-le à zéro dans OnInit. Si le tableau est vide, alors il est temps d'initialiser.

Et pas de drapeaux supplémentaires.

 
Renat:

Comme astuce, mettez le Symbol au niveau global et mettez-le à zéro dans OnInit. Si le tableau est vide, il est temps d'initialiser.

Et pas de drapeaux supplémentaires.

Je suppose que je suis paranoïaque. Je n'aime pas les variables publiques (globales). Je le considère comme un muveton.
Est-il possible de spécifier le déclenchement de OnInit à l'intérieur de OnTick ?
Par exemple, puis-je déclarer une variable statique dans OnTick qui stocke le nombre d'initialisations de l'EA (s'il existe une telle propriété ou une propriété similaire dans MQL5) ?

 
voix_kas:

Lesvariables globales sont diaboliques, tout comme l'opérateur goto inconditionnel à l'époque.

Je dois être paranoïaque. Je n'aime pas les variables publiques (globales). Je trouve que c'est un muveton.

1. Pourquoi ? Vous devez vous débarrasser des symptômes néfastes, et le faire avec détermination.

2. Ne nommez pas les variables, les tableaux et autres choses avec des consonnes ou des mots-clés similaires du langage (mais le tableau "Symbol" est très frappant, on ne peut pas dire si c'est un tableau ou autre chose dans votre code).

Renat:

La solution consiste à cacher ces données à l'intérieur de la classe. Si la classe meurt, l'environnement aussi.

Et à un niveau global, laissez un minimum de variables statiques.

Bonne suggestion. Il est déjà temps de passer à la POO... :)