Die neue MQL4-Syntax - Seite 6

 
SDC:

Der Compiler macht einen Fehler, wenn ich den Pfad zum Symbol in das terminal_data_directory setze. Die Fehlermeldung lautet: cannot open file in a virtual store folder, obwohl ich keinen Ordner im virtuellen Speicher angegeben habe. Ich habe einen Ordner im terminal_data_directory angegeben.

Der einzige Weg, wie ich es zum Funktionieren bringen konnte, war, die Datei in denselben Ordner wie den Quellcode zu legen und überhaupt keinen Pfad anzugeben, sondern nur #property icon "MyIcon.ico".


Hallo, nur für den Fall, dass jemand Probleme mit #property icon "MyIcon.ico" hat, sollte man die Größe des Icons 96x96 px oder höher wählen. Ich habe den Fehler auch erlebt, aber jetzt funktioniert es.
 

Mir ist aufgefallen, dass der Compiler ein Casting durchführt, von dem ich nicht erwarte, dass es auftritt.

Ich habe folgenden Code:

Die Klasse des Schlüsselobjekts ist MT4String, während die Funktion getKey() eine allgemeinere Klasse zurückgibt. Das Gleiche gilt für das Button-Objekt. Das explizite Casting wird weggelassen.

Der ursprüngliche Code sah wie folgt aus:

In JAVA wäre ein explizites Casting notwendig, aber der MQL4-Compiler arbeitet auch mit dieser Syntax korrekt.

Ist dieses implizite Casting ein Feature, das auch in C++ gültig ist? Oder ist es ein Fehler?

 

Ich bin kein C++-Experte, aber der Übergang von einer Basisklasse zu einer untergeordneten Klasse wird als Downcasting bezeichnet, und dieser Seite zufolge sieht es so aus, als ob Downcasting auch in C++ explizit sein muss. (wie Java) ?

Da MQL4 implizites Downcasting erlaubt, ist es entweder ein "Feature" oder ein Bug :)

Wenn es ein "Feature" ist, bedeutet das wahrscheinlich, dass der Compiler den Programmierer nicht vor einem möglichen Fehler warnt, es ist also kein tolles Feature. Sowohl C++ als auch Java verlangen aus einem bestimmten Grund explizites Downcasting?

Außerdem gibt es in MQL4 keine eingebaute Möglichkeit, die Klasse eines Objekts zu überprüfen (z.B. instanceOf etc.), so dass ein Laufzeitfehler nicht vermieden werden kann, es sei denn, Sie implementieren Ihre eigene "Typ"-Prüfung...


Animal a;

Dog d;

...

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

 d = a;

}
 
ydrol:

Ich bin kein C++-Experte, aber der Übergang von einer Basisklasse zu einer untergeordneten Klasse wird als Downcasting bezeichnet, und dieser Seite zufolge sieht es so aus, als ob Downcasting auch in C++ explizit sein muss. (wie Java) ?

Da MQL4 implizites Downcasting erlaubt, ist es entweder ein "Feature" oder ein Bug :)

Wenn es ein "Feature" ist, bedeutet es wahrscheinlich, dass der Compiler den Programmierer nicht vor einem möglichen Fehler warnt, also ist es kein tolles Feature. Sowohl C++ als auch Java verlangen aus einem bestimmten Grund explizites Downcasting?

Außerdem gibt es in MQL4 keine eingebaute Möglichkeit, die Klasse eines Objekts zu überprüfen (z.B. instanceOf etc.), so dass ein Laufzeitfehler nicht vermieden werden kann, es sei denn, Sie implementieren Ihre eigene "Typ"-Prüfung...




Ja, ich würde auch instanceof oder ".class" begrüßen, aber soweit ich bemerkt habe, ist es nicht einmal in C++ verfügbar. Selbst der MQL4-Debugger kennt den Typ des überwachten Objekts nicht. Mir ist das egal, denn das OOP-Feature in MQL4 ist erstaunlich gut implementiert, und wenn das der einzige Fehler wäre, dann würde ich sagen: Hurra. Ich war nur neugierig, ob es einem bestehenden Muster folgt, aber es scheint eher ein Fehler zu sein.

 

Ein-Klick-Handel

im alten MT4 benutze ich eine dll-Datei für die Erstellung von EA One-Click-Trading

Ich kann die Parameter eingeben. LOT, TP SL direkt in diese weißen Textfelder eingeben

Wenn ich auf Kaufen oder Verkaufen klicke, liest mein EA den eingegebenen Text im Feld.

Im neuen MT4 sehe ich die Button-Funktion, aber ich kann die Funktion nicht finden, um ein Textfeld wie dieses zu erstellen und zu lesen.

 
WDholic:

im alten MT4 benutze ich eine dll-Datei für die Erstellung von EA One-Click-Trading

Ich kann die Parameter eingeben. LOT, TP SL direkt in diese weißen Textfelder eingeben

Wenn ich auf Kaufen oder Verkaufen klicke, liest mein EA den eingegebenen Text im Feld.

Im neuen MT4 sehe ich die Tastenfunktion, aber ich kann die Funktion zum Erstellen und Lesen eines solchen Textfeldes nicht finden.

Für die Tastatureingabe gibt es den Objekttyp OBJ_EDIT. Es feuert CHARTEVENT_OBJECT_ENDEDIT Ereignis, wenn Sie die Enter-Taste drücken. Aber es scheint, dass die Enter-Taste die einzige Möglichkeit ist, die Bearbeitung zu beenden, d.h. ein Mausklick außerhalb der Objektgrenzen beendet die Bearbeitung nicht. Das hindert mich daran, das Objekt als benutzerunfreundlich einzustufen.

Außerdem wird, wenn eine leere Zeichenfolge als Anfangswert angegeben wird, stattdessen automatisch der Text "Bearbeiten" angezeigt (und dieses Wort kann sogar bearbeitet werden), was wirklich verwirrend ist.

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

Ich habe diese Schaltfläche erstellt, um den Text darin zu bearbeiten, und ich möchte die Textzeichenfolge lesen und in eine Double- oder Int-Variable umwandeln, aber es funktioniert nicht und gibt nicht die Meldung "Der Text im Feld "Bearbeiten" des Objekts mit dem Namen" wurde geändert"aus.

Können Sie mir helfen?

Grund der Beschwerde: