La nouvelle syntaxe MQL4 - page 6

 
SDC:

Le compilateur se trompe lorsque je place le chemin d'accès à l'icône dans le répertoire terminal_data_directory. L'erreur indique qu'il est impossible d'ouvrir un fichier dans un dossier du magasin virtuel alors que je n'ai pas spécifié de dossier dans le magasin virtuel. Je spécifie un dossier dans le répertoire terminal_data_directory.

La seule façon de le faire fonctionner était de placer le fichier dans le même dossier que le code source et de ne pas spécifier de chemin d'accès du tout, juste #property icon "MyIcon.ico".


Au cas où quelqu'un aurait un problème avec l'icône#property icon "\\Images\\MyIcon.ico", vous devriez considérer la taille de l'icône 96x96 px ou plus. J'ai également rencontré l'erreur, mais cela fonctionne maintenant.
 

J'ai remarqué que le compilateur effectue des castings auxquels je ne m'attendais pas.

J'ai le code suivant :

où la classe de l'objet key est MT4String, alors que la fonction getKey() retourne une classe plus générique. Le même cas se présente avec l'objet button. Le casting explicite est omis.

Le code original ressemblait à ceci :

En JAVA, un casting explicite serait nécessaire, mais le compilateur MQL4 fonctionne aussi correctement avec cette syntaxe.

Est-ce que ce casting implicite est une caractéristique, qui est également valable en C++ ? Ou s'agit-il d'un bogue ?

 

Je ne suis pas un expert en C++ mais passer d'une classe de base à une classe enfant est appelé downcasting et selon cette page, il semble que le downcasting doit être explicite en C++ également. (comme Java) ?

Comme MQL4 permet le downcasting implicite, c'est soit une "fonctionnalité" soit un bug :)

Si c'est une "fonctionnalité", cela signifie probablement que le compilateur ne préviendra pas le codeur d'une erreur potentielle, donc ce n'est pas une grande fonctionnalité. Le C++ et Java exigent tous deux le downcasting explicite pour une raison ?

De plus, dans MQL4, il n'y a pas de moyen intégré pour vérifier la classe d'un objet (par exemple instanceOf, etc.), ce qui signifie qu'une erreur d'exécution ne peut être évitée, à moins d'implémenter votre propre vérification du "type"...


Animal a;

Dog d;

...

if (a  instanceOf Dog) { // no built in check like this - we all have to roll our own??

 d = a;

}
 
ydrol:

Je ne suis pas un expert en C++ mais passer d'une classe de base à une classe enfant est appelé downcasting et selon cette page, il semble que le downcasting doit être explicite en C++ également. (comme Java) ?

Comme MQL4 permet le downcasting implicite, c'est soit une "fonctionnalité" soit un bug :)

Si c'est une "fonctionnalité", cela signifie probablement que le compilateur ne préviendra pas le codeur d'une erreur potentielle, donc ce n'est pas une grande fonctionnalité. Le C++ et Java exigent tous deux le downcasting explicite pour une raison ?

De plus, dans MQL4, il n'y a pas de moyen intégré pour vérifier la classe d'un objet (par exemple instanceOf, etc.), ce qui signifie qu'une erreur d'exécution ne peut être évitée, à moins d'implémenter votre propre vérification du "type"...




Oui, j'apprécierais aussi instanceof ou ".class", mais d'après ce que j'ai remarqué, ce n'est pas disponible même dans le C++. Même le débogueur de MQL4 ne connaît pas le type de l'objet surveillé. Je ne m'en soucie guère, car la fonctionnalité de la POO dans MQL4 est étonnamment bien implémentée, et si c'était le seul bug, alors je dirais bravo. J'étais juste curieux de savoir si cela suivait un modèle existant, mais il semble que ce soit plutôt un bug.

 

trading en un clic

Dans l'ancien MT4, j'utilisais un fichier dll pour créer un EA en un clic.

je peux taper les paramètres... LOT, TP SL directement dans la zone de texte blanche.

quand je clique sur acheter ou vendre... mon EA lit le texte saisi dans la boîte.

Dans le nouveau MT4, je vois la fonction de bouton, mais je ne peux pas trouver la fonction pour créer et lire une boîte de texte comme celle-là.

 
WDholic:

Dans l'ancien MT4, j'utilisais un fichier dll pour créer un EA en un clic.

je peux taper les paramètres... LOT, TP SL directement dans la zone de texte blanche.

quand je clique sur acheter ou vendre... mon EA lit le texte saisi dans la boîte.

Dans le nouveau MT4, je vois la fonction de bouton, mais je ne trouve pas la fonction pour créer et lire une boîte de texte comme celle-là.

Pour la saisie au clavier, il y a le type d'objet OBJ_EDIT. Il déclenche l'événement CHARTEVENT_OBJECT_ENDEDIT si vous appuyez sur la touche Entrée. Mais il semble que la touche Entrée soit le seul moyen de terminer l'édition, par exemple, un clic de souris en dehors des limites de l'objet ne termine pas l'édition. Cela m'empêche de déployer l'objet comme étant peu convivial.

De plus, si une chaîne vide est fournie comme valeur initiale, le texte automatique "Edit" apparaît à la place (et ce mot peut même être édité), ce qui est vraiment déroutant.

 
void OnChartEvent(const int id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam){

   if(id==CHARTEVENT_OBJECT_ENDEDIT ){
   
      if(sparam=="pulsanteEdit") Print("The text in the Edit field of the object with name ",sparam," has been changed");
     } 
}
void creaPulsanteEdit(const string objNameIns,const string objText,int xDistance,int yDistance,int xSize,int ySize,color clrIns,color clrTextIns){
   
   if(!ObjectCreate(0,objNameIns,OBJ_EDIT,0,0,0)){ 
      stampaErrore("Errore creazione pulsante edit");
      return;
   }
   
   ObjectSetInteger(0,objNameIns,OBJPROP_CORNER,CORNER_LEFT_UPPER);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_XDISTANCE,xDistance); 
   ObjectSetInteger(0,objNameIns,OBJPROP_YDISTANCE,yDistance); 

   ObjectSetInteger(0,objNameIns,OBJPROP_XSIZE,xSize); 
   ObjectSetInteger(0,objNameIns,OBJPROP_YSIZE,ySize);
   
//--- set the text 
   ObjectSetString(0,objNameIns,OBJPROP_TEXT,objText);
   ObjectSetString(0,objNameIns,OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,objNameIns,OBJPROP_FONTSIZE,10);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_READONLY,false);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_BGCOLOR,clrIns);
   ObjectSetInteger(0,objNameIns,OBJPROP_COLOR,clrTextIns);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_BORDER_COLOR,LightSeaGreen);
   
//--- display in the foreground (false) or background (true) 
   ObjectSetInteger(0,objNameIns,OBJPROP_BACK,false);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,objNameIns,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,objNameIns,OBJPROP_HIDDEN,false);
}

void OnTick(){

  creaPulsanteEdit("pulsanteEdit", string1, 10, 275,60,30,Black,LightSeaGreen);

  Print("string1: "+string1);
}

J'ai créé ce bouton pour éditer le texte à l'intérieur et je voudrais lire et convertir la chaîne de texte dans une variable double ou int mais cela ne fonctionne pas et n'imprime pas le "Le texte dans le champ d'édition de l'objet avec le nom" a été modifié".

Pouvez-vous m'aider ?