Erreurs, bugs, questions - page 742

 
TheXpert:
Alors faites une usine. Cela résoudrait le problème.

C'est assez facile de travailler là-dedans comme ça. L'objet est structuré de manière assez rigide. Il appelle une méthode virtuelle Load de chacun de ses membres, qui à leur tour font de même. Au début de chaque bloc de données (objet), l'ID du type est écrit (pour le contrôle lors du chargement). C'est tout ce qu'il y a à faire. Il s'agit d'une sorte d'usine artisanale.

Il est logique de créer une usine si un type inconnu peut se trouver dans le fichier. Il faudra alors créer une usine et une table de registre des types. Bien que le problème ne soit pas aussi résolu, je me suis débrouillé avec des trombones et du ruban adhésif. :)

 

Le fan de Gunn.

Si le deuxième point d'ancrage se trouve dans le futur, l'angle change.

De plus, cet objet a quelques problèmes de copie (avec Ctrl enfoncé). Très souvent, il ne copie pas, mais traîne l'original, et il faut la troisième ou la cinquième tentative pour copier.

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

OK, super.

Slava, puis-je demander (pour le développement général) pourquoi vous ne pouvez pas initialiser la table des méthodes virtuelles au début du constructeur (après l'initialisation de l'ancêtre) ?

Je vous l'ai déjà dit. Les constructeurs fonctionnent selon une hiérarchie. Pendant qu'un ancêtre est en cours de construction, il n'y a pas d'information sur les descendants.
 
stringo:
Je vous l'ai déjà dit. Les constructeurs établissent la hiérarchie. Tant qu'un ancêtre est en cours de construction, il n'y a aucune information sur les descendants.

Je l'ai déjà lu. Et je l'ai très bien compris. Et j'ai posé une question basée sur ma compréhension de ce que j'ai lu. Je vais essayer d'être plus clair, avec des images.

class MySecond: MyFirst
{
  void  MySecond(MyArg arg): 
    MyFirst(arg)
   { // Можно код инициализации VMT добавлять здесь. Тогда не будет проблем с виртуальными вызовами.
     ...............
     MyVirtualFunc();
      ...........
     return;
   } // Сейчас код инициализации VMT добавляется здесь.

};

Je comprends tout, c'est plus difficile à faire, il y a toutes sortes de subtilités. Il est beaucoup plus facile et polyvalent (pour vous) d'écrire toute l'initialisation implicite à la fin. Et je crois même à l'avance que "personne ne fait ça" et que "ce n'est pas l'usage en C++" etc.

Mais pour nous (utilisateurs), il est plus simple, plus universel, raisonnable et logique de considérer le constructeur MySecond() comme un territoire de la classe MySecond et non MyFirst. Réfléchissez à ce qui est le plus facile : faire fonctionner les fonctions virtuelles dans les constructeurs ou exprimer des restrictions importantes et sérieuses sur le code des constructeurs dans la documentation à plusieurs endroits, et, malgré cela, recevoir régulièrement des messages importants et sérieux de la part de newbies au Service Desk et au Forum "à propos des bugs virtuels dans les constructeurs". C'est aussi un facteur sérieux - on attend beaucoup de newbies bientôt...

 
struct SDaylyRange {double min, max, open, close;};
void OnStart()
  {
//---
   SDaylyRange tmp, tmp2;
   tmp = 2+3 ? tmp : tmp2;
   if (2+3) tmp = tmp; else tmp = tmp2;
  }

L'opérateur tensoriel avec les structures conduit à une erreur de génération de code (bien que si vous le remplacez par if, cela fonctionne).

 

Je reçois régulièrement l'erreur 4401

ERR_HISTOIRE_NON_FONDÉE

Le code indicateur suivant

datetime prevTime[22];
MqlRates _Rates[];

bool IsNewBar(ENUM_TIMEFRAMES period) {
   datetime currentTime[1];
   CopyTime(Symbol(), period, 0, 1, currentTime);
   int _;
   switch (period) {
      case PERIOD_M1  : _= 1;
         break;
      case PERIOD_M2  : _= 2;
         break;
      case PERIOD_M3  : _= 3;
         break;
      case PERIOD_M4  : _= 4;
         break;
      case PERIOD_M5  : _= 5;
         break;
      case PERIOD_M6  : _= 6;
         break;
      case PERIOD_M10 : _= 7;
         break;
      case PERIOD_M12 : _= 8;
         break;
      case PERIOD_M15 : _= 9;
         break;
      case PERIOD_M20 : _= 10;
         break;
      case PERIOD_M30 : _= 11;
         break;
      case PERIOD_H1  : _= 12;
         break;
      case PERIOD_H2  : _= 13;
         break;
      case PERIOD_H3  : _= 14;
         break;
      case PERIOD_H4  : _= 15;
         break;
      case PERIOD_H6  : _= 16;
         break;
      case PERIOD_H8  : _= 17;
         break;
      case PERIOD_H12 : _= 18;
         break;
      case PERIOD_D1  : _= 19;
         break;
      case PERIOD_W1  : _= 20;
         break;
      case PERIOD_MN1 : _= 21;
         break;  
      default         : _= 0;    
   } 
   if(currentTime[0]== prevTime[_]) return(false);
   else {
      prevTime[_] = currentTime[0];
      return(true);
   }
}

int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[]) 
if (IsNewBar(_Period)) {
    int err = CopyRates(Symbol(), PERIOD_D1, 0, 2, _Rates);
   Print("Count:", err);
   if (err < 1) {
       Print("ERROR:", GetLastError());
       Print("__Symbol:", Symbol());
       return(rates_total);
   }

}
return(rates_total); 
}

produira une erreur immédiatement au démarrage (si ce n'est pas sur D1). Ou plutôt, une fois après le démarrage du terminal et l'ouverture du graphique - pour mettre l'indicateur, nous aurons une erreur. Si le terminal n'est pas fermé, il n'y aura pas une telle erreur au démarrage.

Mais après un certain temps (quelques heures - 2 heures ont suffi pour moi), nous verrons que nous obtiendrons l'erreur sur le graphique déjà ouvert. (Je l'ai fait fonctionner sur m30)

 

Bonjour, messieurs les développeurs !

Pouvons-nous apporter des modifications au compilateur MQL5 pour qu'il nous donne au moins un avertissement ?

pour les erreurs de ce genre dans le code.

if(Flag_Exitl=true) {break;}


La condition de comparaison ici n'est pas correcte (elle devrait être == ), c'est pourquoi il y aura toujours une rupture.

Comment remédier à cette situation dans le compilateur (si c'est possible), afin que je puisse avoir moins de bosses en écrivant du code ?

(Je pensais que cela ne marcherait pas, il semble séparer l'affectation et la comparaison dans if, puis la question est supprimée).

 
Fia:

Bonjour, messieurs les développeurs !

Est-il possible de modifier le compilateur MQL5 pour qu'il donne au moins un avertissement ?

pour les erreurs de ce genre dans le code.

if(Flag_Exitl=true) {break;}


La condition de comparaison n'est pas correcte (elle devrait être == ), c'est pourquoi il y aura toujours une rupture.

Comment remédier à cette situation dans le compilateur (si c'est possible), de manière à ce que je puisse avoir moins de bosses en écrivant du code ?

(J'ai pensé que ça ne marcherait pas, je pourrais séparer l'affectation et la comparaison en if, ainsi la question est supprimée).

La condition peut être écrite de manière incorrecte mais elle est autorisée dans MQL5.

Je vais traduire ce que vous avez codé : assigner la valeur vraie à la variable Flag_Exitl et ensuite vérifier si Flag_Exitl est vrai, puis break.

La séquence d'actions est exactement la suivante.

 

Je ne comprends pas bien comment travailler avec des tampons qui n'ont pas besoin d'être affichés à l'écran.

Selon le code ci-dessous, pour une raison quelconque

1) ne dessine rien

2) les deux tampons sont appelés Label1

bien qu'ils contiennent les bonnes données

#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   2

//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_color1  clrRed, clrWhite
#property indicator_type1   DRAW_COLOR_LINE

//--- plot Label2
#property indicator_label2  "Label2"
#property indicator_color2  clrRed, clrGreen
#property indicator_type2   DRAW_COLOR_LINE

//--- indicator buffers
double         L1_1[];
double         L2_1[];
double         Colors_1[];

//--- indicator buffers
double         L1_2[];
double         L2_2[];
double         Colors_2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0,L1_1,INDICATOR_DATA);
   SetIndexBuffer(1,L1_2,INDICATOR_DATA);
   SetIndexBuffer(2, Colors_1,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(3, Colors_2,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(4, L2_1, INDICATOR_CALCULATIONS);
   SetIndexBuffer(5, L2_2, INDICATOR_CALCULATIONS);
   return(0);
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   for (int i = 0; i < rates_total; i++)
   {
      L1_1[i] = i;
      L1_2[i] = i + 1;
   }
   return(rates_total);
}
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Стили рисования - Документация по MQL5
 

Bonjour. J'écris peut-être dans la mauvaise direction, mais j'espère que vous pourrez m'orienter dans la bonne direction. Où aller avec une question sur l'API Web pour mt5 ? )

Je vais essayer d'expliquer la situation, au cas où. J'ai un gestionnaire МТ et une API WEB avec php... La facture en russe est créée, les données sont envoyées et même affichées dans le gestionnaire МТ, mais il y a un problème - les données dans le gestionnaire МТ sont affichées en unicode ("044404300c0438043b0438044f" - c'est à cela que ressemble le nom d'utilisateur). Lors de l'envoi de données, rien n'est codé ou décodé, depuis le client MT tout est créé normalement... Au moins dans quel sens regarder ? (