Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1032

 

¿Es posible duplicar un objeto Ccanvas?


Creo un objeto con Ccanvas y en el proceso tengo que crear duplicados. A veces 10-20 y a veces 100-200.

Una vez que el objeto está definitivamente dibujado. ¿Hay alguna forma de duplicarlo?

 
Sergey Likho:

¿Es posible duplicar un objeto Ccanvas?


Creo un objeto con Ccanvas y en el proceso tengo que crear duplicados. A veces 10-20 y a veces 100-200.

Una vez que el objeto está definitivamente dibujado. ¿Hay alguna forma de duplicarlo?

CCanvas *canv = nuevo CCanvas
Pero no se trata de duplicar uno ya existente. Está creando uno nuevo y un puntero a él.
 
Artyom Trishkin:
CCanvas *canv = nuevo CCanvad

Me refería a un objeto gráfico.

   CCanvas obj;
   obj.CreateBitmapLabel(0,1,name,x,y,x_size,y_size,COLOR_FORMAT_ARGB_NORMALIZE);
   obj.FillRectangle(0,0,x_size,y_size,ColorToARGB(Color,Alpha));
   obj.Update(false);


Как сделать 10 копий с измененными координатами?
 
Sergey Likho:

Me refería a un objeto gráfico.

Te lo he enseñado. Si no se sabe de antemano cuántos objetos hay que crear, entonces sólo mediante new.
Si se conoce el número, entonces
obj1, obj2, obj3,...,objN
 
Igor Makanu:

Podría equivocarme, pero tu enlace será el hilo del autor, pero tienes que hojear todo el hilo, Igor parece haber publicado códigos un poco crudos, y luego a veces reescribía lo que necesitaba mejorar, aunque de nuevo podría equivocarme - hojeé este hilo hace unos 5-6 años, ya no lo recuerdo

No se equivoca. Recientemente he hojeado todo el hilo del autor. Me llevó unos 2-3 días. En el tema del autor en vista de la lejanía de la escritura algunas de sus características ya no son relevantes (o así me pareció).Leer absolutamente todo y muy actual e irrelevante poco. Y como has notado, tenía errores que aparecían después de 2-3, o incluso más páginas, cuando alguien decidía usar su función, encontraba el error y lo corregía y simplemente decía que había un error, o simplemente lo señalaba. Así que incluso 10 páginas más tarde puede volver a aparecer la misma función, corregida o mejorada (ha pasado el tiempo y ha querido mejorarla).

Así que si alguien ha sacado sólo el tema más importante y relevante, sólo puedes dar las gracias y ahorrar mucho tiempo.

 
¿Cómo puedo pasar un puntero a una función (es decir, escribir una función que tome un puntero a una función como argumento) como parámetro? Lo he hecho antes en mql4, pero he perdido una copia del archivo donde estaba este ejemplo.
 
Seric29:
¿Cómo pasar un puntero a una función (la función toma un puntero a la función como argumento) como parámetro? Lo he hecho antes con mql4 pero he perdido una copia del archivo de ejemplo.

¿MQL ha soportado alguna vez los punteros de función? No lo creo. Una solución es envolver la función en una clase y pasar el puntero al objeto.

 
Sergey Popov:

Hola a todos.

Quiero escribir una función en mi EA que prohíba las operaciones en las primeras 2 horas después del inicio de las operaciones.

Pero me encuentro con el hecho de que iTime(Symbol(),1440, 0) no devuelve correctamente la hora de apertura de la vela del día.

Más concretamente: el 26.12.2019 el mercado abrió a las 06:00:00, pero iTime determina las 00:00:00.

¿Cómo puedo calcular exactamente la hora de apertura del día?

SymbolInfoSessionTrade me ayudará a averiguar el tiempo de negociación. No sé si refleja los cambios para Navidad y otras fiestas.

 
Aleksey Mavrin:

¿MQL ha soportado alguna vez los punteros de función? No lo creo. Una solución es envolver la función en una clase y pasar un puntero al objeto.

Lo hace. Esto se hace usando el especificador typedif read help pero el esquema es diferente al de c++. Encontré un foro donde una persona escribió este código pero no guardé el archivo y reinicié el sistema, por supuesto el archivo se borró. Pero la ayuda muestra un ejemplo sencillo y yo tenía un ejemplo por el que preguntaba.

 
Aleksey Mavrin:

¿MQL ha soportado alguna vez los punteros de función? No lo creo. Una solución es envolver la función en una clase y pasar el puntero al objeto.

Puedes, código para reproducir:

#property copyright "Copyright 2019, IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
typedef void(*TFuncvoidPTR)(void);
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   TFuncvoidPTR f_ptr[3];
   f_ptr[0] = f_1;
   f_ptr[1] = f_2;
   f_ptr[2] = f_3;
   for(int i=0;i<ArraySize(f_ptr);i++)
   {
      printf("Вызываю фунцию № %i ",i);
      f_ptr[i]();
   }

}
//+------------------------------------------------------------------+
void f_1() {Print("Это вызов функции : ",__FUNCTION__);}
void f_2() {Print("Это вызов функции : ",__FUNCTION__);}
void f_3() {Print("Это вызов функции : ",__FUNCTION__);}

2019.12.30 18:30:55.518 Script tst EURUSD,H1: eliminado

2019.12.30 18:30:55.511 tst EURUSD,H1: uninit reason 0

2019.12.30 18:30:55.511 tst EURUSD,H1: Esta es la llamada a la función: f_3

2019.12.30 18:30:55.511 tst EURUSD,H1: Llamando a la función número 2

2019.12.30 18:30:55.511 tst EURUSD,H1: Esto es llamar a la función : f_2

2019.12.30 18:30:55.511 tst EURUSD,H1: Llamando a la función #1

2019.12.30 18:30:55.511 tst EURUSD,H1: Esto es llamar a la función : f_1

2019.12.30 18:30:55.511 tst EURUSD,H1: Llamando a la función no. 0

2019.12.30 18:30:55.511 tst EURUSD,H1: inicializado

2019.12.30 18:30:55.496 Script tst EURUSD,H1: cargado con éxito

Razón de la queja: