La nuova sintassi MQL4 - pagina 6

 
SDC:

Gli errori del compilatore quando metto il percorso dell'icona nella directory_dati_terminale, l'errore dice che non può aprire il file in una cartella del negozio virtuale anche se non ho specificato una cartella nel negozio virtuale. Ho specificato una cartella nella terminal_data_directory.

L'unico modo che ho trovato per farlo funzionare è stato mettere il file nella stessa cartella del codice sorgente e non specificare affatto un percorso, solo #proprietà icona "MyIcon.ico"


Ciao, nel caso qualcuno abbia problemi con #property icon "\Images\MyIcon.ico", si dovrebbe considerare la dimensione dell'icona 96x96 px o superiore. Anche io ho riscontrato l'errore, ma ora funziona.
 

Ho notato che il compilatore esegue un casting che non mi aspetterei si verificasse.

Ho il seguente codice:

dove la classe dell'oggetto chiave è MT4String, mentre la funzione getKey() restituisce una classe più generica. Lo stesso caso si verifica con l'oggetto pulsante. Il casting esplicito è omesso.

Il codice originale era così:

In JAVA, sarebbe necessario un casting esplicito, ma il compilatore MQL4 funziona correttamente anche con questa sintassi.

Questo casting implicito è una caratteristica valida anche in C++? O è un bug?

 

Non sono un esperto di C++ ma andare da una classe base a una classe figlia si chiama downcasting e secondo questa pagina sembra che il downcasting debba essere esplicito anche in C++. (come Java) ?

Dato che MQL4 permette il downcasting implicito, è una "caratteristica" o un bug :)

Se è una "caratteristica" probabilmente significa che il compilatore non avvertirà il codificatore di un potenziale errore, quindi non è una grande caratteristica. Sia C++ che Java richiedono il downcasting esplicito per un motivo?

Inoltre, in MQL4, non c'è un modo integrato per controllare la classe di un oggetto (ad esempio instanceOf ecc.), quindi significa che un errore di esecuzione non può essere evitato, a meno che non si implementa un proprio controllo di 'tipo'...


Animal a;

Dog d;

...

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

 d = a;

}
 
ydrol:

Non sono un esperto di C++ ma andare da una classe base a una classe figlia si chiama downcasting e secondo questa pagina sembra che il downcasting debba essere esplicito anche in C++. (come Java) ?

Dato che MQL4 permette il downcasting implicito, è una "caratteristica" o un bug :)

Se è una "caratteristica" probabilmente significa che il compilatore non avvertirà il codificatore di un potenziale errore, quindi non è una grande caratteristica. Sia C++ che Java richiedono il downcasting esplicito per un motivo?

Inoltre, in MQL4, non c'è un modo integrato per controllare la classe di un oggetto (ad esempio instanceOf ecc.), quindi significa che un errore di esecuzione non può essere evitato, a meno che non si implementa un proprio controllo di 'tipo'...




Sì, apprezzerei anche instanceof o ".class", ma per quanto ho notato non è disponibile nemmeno nel C++. Anche il debugger MQL4 non conosce il tipo dell'oggetto guardato. Non mi interessa molto, perché la funzione OOP in MQL4 è implementata sorprendentemente bene, e se questo fosse l'unico bug, allora direi evviva. Ero solo curioso di sapere se stava seguendo qualche modello esistente, ma sembra che sia piuttosto un bug.

 

trading con un clic

nel vecchio MT4 uso un file dll per creare EA one click trading

posso digitare il parametro... LOT, TP SL direttamente sulla casella di testo bianco

quando faccio clic su comprare o vendere ... il mio EA leggere il testo di input nella casella.

Nel nuovo MT4 vedo la funzione pulsante ... ma non riesco a trovare la funzione per creare e leggere una casella di testo come quella

 
WDholic:

nel vecchio MT4 uso un file dll per creare EA one click trading

posso digitare il parametro... LOT, TP SL direttamente sulla casella di testo bianco

quando faccio clic su comprare o vendere ... il mio EA leggere il testo di input nella casella.

Nel nuovo MT4 vedo la funzione pulsante ... ma non riesco a trovare la funzione per creare e leggere una casella di testo come quella

Per l'input da tastiera c'è l'oggetto tipo OBJ_EDIT. Si attiva l'evento CHARTEVENT_OBJECT_ENDEDIT se si preme il tasto Enter. Ma sembra che il tasto Invio sia l'unico modo per terminare l'editing, ad esempio cliccando con il mouse fuori dai confini dell'oggetto non termina l'editing. Questo mi impedisce di distribuire l'oggetto come user unfriendly.

Inoltre, se viene fornita una stringa vuota come valore iniziale, allora appare invece il testo automatico "Edit" (e questa parola può anche essere modificata), il che è davvero confuso.

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

Ho creato questo pulsante per modificare il testo al suo interno e vorrei leggere e convertire la stringa di testo in una variabile double o int ma non funziona e non stampa il "Il testo nel campo Edit dell'oggetto con nome" è stato cambiato "

potete aiutarmi?