La nueva sintaxis de MQL4 - página 6

 
SDC:

El compilador da un error cuando pongo la ruta del icono en el directorio terminal_data_directory, el error dice que no se puede abrir el archivo en una carpeta del almacén virtual a pesar de que no he especificado una carpeta en el almacén virtual. Especifico una carpeta en el directorio terminal_data_directory.

La única forma en que pude conseguir que funcionara fue poner el archivo en la misma carpeta que el código fuente y no especificar una ruta en absoluto, sólo #propiedad icono "MiIcono.ico"


Hola por si alguien tiene problemas con el icono #property "\Images\MyIcon.ico", debería considerar el tamaño del icono 96x96 px o superior. Yo también he experimentado el error, pero ahora funciona.
 

Me he dado cuenta de que el compilador realiza un casting que no esperaba que ocurriera.

Tengo el siguiente código:

donde la clase del objeto llave es MT4String, mientras que la función getKey() devuelve una clase más genérica. El mismo caso es con el objeto botón. Se omite el casting explícito.

El código original tenía este aspecto:

En JAVA sería necesario un casting explícito, pero el compilador de MQL4 también trabaja con esta sintaxis correctamente.

¿Es este casting implícito una característica, que también es válida en C++? ¿O es un error?

 

No soy un experto en C++ pero pasar de una clase base a una clase hija se llama downcasting y según esta página parece que el downcasting debe ser explícito también en C++. (como en Java) ?

Como MQL4 permite implícita downcasting es una "característica" o un error :)

Si es una "característica" probablemente significa que el compilador no advertirá al codificador de un error potencial, por lo que no es una gran característica. Tanto C++ como Java requieren un downcasting explícito por una razón?

Además, en MQL4, no hay manera de comprobar la clase de un objeto (por ejemplo instanceOf etc) por lo que significa un error en tiempo de ejecución no se puede evitar a menos que implementar su propio "tipo" de verificación ...


Animal a;

Dog d;

...

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

 d = a;

}
 
ydrol:

No soy un experto en C++ pero pasar de una clase base a una clase hija se llama downcasting y según esta página parece que el downcasting debe ser explícito también en C++. (como en Java) ?

Como MQL4 permite implícita downcasting es una "característica" o un error :)

Si es una "característica" probablemente significa que el compilador no advertirá al codificador de un error potencial, por lo que no es una gran característica. Tanto C++ como Java requieren un downcasting explícito por una razón?

Además, en MQL4, no hay manera de comprobar la clase de un objeto (por ejemplo instanceOf etc) por lo que significa un error en tiempo de ejecución no se puede evitar a menos que implementar su propio "tipo" de verificación ...




Sí, yo también agradecería instanceof o ".class", pero por lo que he visto no está disponible ni siquiera en el C++. Incluso el depurador MQL4 no sabe el tipo del objeto observado. No me importa mucho, porque la característica OOP en MQL4 está implementada sorprendentemente muy bien, y si este fuera el único error, entonces diría hurra. Solo tenía curiosidad, por si seguía algún patrón existente, pero parece que era más bien un bug.

 

comercio en un clic

en la antigua MT4 utilizo un archivo dll para crear EA one click trading

Puedo escribir el parámetro... LOT, TP SL directamente en esos cuadros de texto blanco

cuando hago clic en comprar o vender .. mi EA leer el texto de entrada en la caja.

En la nueva MT4 veo la función del botón... pero no puedo encontrar la función para crear y leer un cuadro de texto como ese

 
WDholic:

en la antigua MT4 utilizo un archivo dll para crear EA one click trading

Puedo escribir el parámetro... LOT, TP SL directamente en esos cuadros de texto blanco

cuando hago clic en comprar o vender .. mi EA leer el texto de entrada en la caja.

En la nueva MT4 veo la función del botón... pero no puedo encontrar la función para crear y leer un cuadro de texto como ese

Para la entrada del teclado existe el tipo de objeto OBJ_EDIT. Dispara el evento CHARTEVENT_OBJECT_ENDEDIT si se presiona la tecla Enter. Pero parece que la tecla Enter es la única manera de terminar la edición, por ejemplo, haciendo clic con el ratón fuera de los límites del objeto no termina la edición. Esto me impide desplegar el objeto como no amigable para el usuario.

Además, si se suministra una cadena vacía como valor inicial, entonces aparece el texto automático "Editar" en su lugar (y esta palabra incluso puede ser editada), lo cual es realmente 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);
}

He creado este botón para editar el texto dentro de él y me gustaría leer y convertir la cadena de texto en una variable double o int pero no funciona y no imprime el "El texto en el campo Editar del objeto con nombre" ha sido cambiado "

¿me pueden ayudar?

Razón de la queja: