Características del lenguaje mql5, sutilezas y técnicas - página 225

 
Andrey Dik #:

¿Qué significa eso? ¿Puede ampliarlo?

Tuve tiempo de comprobarlo: sí, el truco falló, ChartID()=12345 para visual y no visual...(tal ChartID constante del probador).

Pero ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS) da un honesto -1 si no hay pantalla. Puede utilizarlo para determinar la física - si hay un lugar para la salida de algo o no. Porque hay un montón de banderas, y no sabemos lo que hay en VPS en absoluto

 

Otro matiz repentino de MQL - los métodos virtuales no se llaman desde los constructores.

en código

class Manager;
class InfoPanel {
public:
   InfoPanel(Manager *m)    { manager=NULL; if (m!=NULL) m.Attach(&this); /* m.Attach в свою очередь должен дёрнуть виртуальный OnAttach (но не будет) */ };
   ~InfoPanel()   { };
   virtual void OnAttach(Manager *m) { PrintFormat("InfoPanel attach"); if (manager!=NULL) manager.Detach(&this); manager=m;};
   virtual void OnDetach(void) { PrintFormat("InfoPanel detach"); manager=NULL;};
   virtual void Draw(void) { PrintFormat("InfoPanel draw"); };
public:
   Manager *manager;
};
class HiLow: public InfoPanel {
public:
   HiLow(Manager *m):InfoPanel(m) { } ;
   ~HiLow() { };
   virtual void OnAttach(Manager *m) { PrintFormat("HiLow attach"); InfoPanel::OnAttach(m); };
   virtual void OnDetach(void) { PrintFormat("HiLow detach"); };
   virtual void Draw(void) { PrintFormat("HiLow draw"); };
};
class Manager {
public:
   Manager()  { };
   ~Manager() { };
   void Attach(InfoPanel *pan) {
      int id=ArraySize(panels);
      ArrayResize(panels,id+1);
      panels[id]=pan;
      panels[id].OnAttach(&this);
   }
/// some code
}
////
void OnStart()
{
   Manager *man=new Manager();
   HiLow *hilow=new HiLow(man);
   man.Draw();
   man.Detach(hilow);
   delete hilow;
   delete man;
}

no se puede hacer así :-)) OnAttach de la clase padre será llamado desde el constructor ; Y durante el acceso normal - de la clase hijo.


no se puedeentender, hay que memorizarlo:-)

 
Maxim Kuznetsov #:

Otro matiz repentino de MQL - los métodos virtuales no son llamados desde los constructores.

en el código


no se puede hacer así :-)) OnAttach de la clase padre será llamado desde el constructor ; Y durante el acceso normal - de la clase hijo.


no puedesentenderlo, tienes que memorizarlo:-)

¿Por qué es imposible de entender? La inicialización de un puntero a un método de la tabla de métodos virtuales tiene lugar en el constructor. Primero se llama al constructor de la clase padre y luego al constructor de la clase sucesora. En consecuencia, cuando se ejecuta el cuerpo del constructor de la clase padre, en la tabla de métodos virtuales el puntero apunta a la dirección del método de la clase base.

PD. Esto es para el eterno cholivar sobre si deberías aprender C++. Si lo estudias, escarbando en la esencia de las cosas y no empollando, estas cosas se hacen evidentes).

 
Vladimir Simakov #:

¿Por qué es imposible de entender? La inicialización de un puntero a un método de la tabla de métodos virtuales tiene lugar en el constructor. Primero se llama al constructor de la clase padre y luego al constructor de la clase sucesora. En consecuencia, cuando se ejecuta el cuerpo del constructor de la clase padre, el puntero apunta a la dirección del método de la clase base en la tabla de métodos virtuales.

PD. Esto es para el eterno cholivar sobre si deberías aprender C++. Si lo estudias, escarbando en la esencia de las cosas y no empollando, estas cosas se hacen evidentes).

Después de los guiones, donde todo es posible, es un poco sorprendente que "un constructor no puede ser virtual" :-))

 
Maxim Kuznetsov #:

después de los scripts, donde todo es posible, es un poco sorprendente que "un constructor no pueda ser virtual" :-)

Para tu "problema", existe una solución: https: //habr.com/ru/post/64369/.

PS. No es exactamente lo mismo, por supuesto, pero como una dirección general de pensamiento

Виртуальный конструктор
Виртуальный конструктор
  • 2009.07.13
  • habr.com
Все мы знаем, что в C++ нет такого понятия как виртуальный конструктор , который бы собирал нужный нам объект в зависимости от каких-либо входных параметров на этапе выполнения. Обычно для этих целей используется параметризованный фабричный метод (Factory Method) . Однако мы можем сделать «ход конем» и сымитировать поведение виртуального...
 
Maxim Kuznetsov #:

después de los scripts, donde todo es posible, es un poco sorprendente que "un constructor no pueda ser virtual" :-)

¿inesperado?

Imagina que se llamara a HiLow::OnAttach. Si hubiera nuevos campos en HiLow y OnAttach los leyera, habría "uso de variables no inicializadas" (porque el constructor de HiLow no ha empezado a ejecutarse todavía).

 

POSITION_TIME_UPDATE es relevante sólo en el cambio del lote de una posición. Por ejemplo, el cierre parcial de una posición en cualquier tipo de cuenta o una recarga en la compensación.

Los cambios en los niveles SL/TP no afectan a POSITION_TIME_UPDATE.

Parafraseando, POSITION_TIME_UPDATE sólo se ve afectado por las modificaciones reflejadas en el Historial de Operaciones - trades. Los niveles SL/TP no pertenecen a dichas modificaciones, por lo que no les afectan.


Sí, de hecho, es así en una cuenta real.

Pero después de construir el Asesor Experto, lo pruebo en el probador, y resulta que en el probador, las modificaciones de los niveles SL/TP afectan POSITION_TIME_UPDATE.

Aquí hay un extracto de los registros.

Aquí he resaltado en amarillo la hora de apertura de la posición, y luego (en el siguiente tick) en rojo la hora de modificación (colocación) de SL y TP a la misma. Luego compruebo los tiempos POSITION_TIME y POSITION_TIME_UPDATE usando la impresión -son diferentes.

LQ      0       11:54:55.049    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:00   CTrade::OrderSend: market buy 0.20 AUDCAD [done at 0.95325]
CL      0       11:54:55.049    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:00   FnPositionOpen: Тикет открытой сделки: 6; Тикет открытого ордера: 7
PD      0       11:54:55.049    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:00   Order #7  State: ORDER_STATE_FILLED
JN      0       11:54:55.063    Trade   2021.05.10 12:00:01   position modified [#7  buy 0.2 AUDCAD 0.95325 sl: 0.94901 tp: 0.96150]
PM      0       11:54:55.064    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:01   CTrade::OrderSend: modify position #7  AUDCAD (sl: 0.94901, tp: 0.96150) [done]
HP      0       11:54:55.064    Trade   2021.05.10 12:00:01   sell stop 0.2 AUDCAD at 0.94901 tp: 0.94492 (0.95319 / 0.95324 / 0.95319)
HN      0       11:54:55.065    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:01   CTrade::OrderSend: sell stop 0.20 AUDCAD at 0.94901 tp: 0.94492 [done]
GR      0       11:54:55.074    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.10 12:00:02   ================ 1620648000<1620648001

Cuando la modificación de SL y TP es dentro del mismo segundo, los tiempos POSITION_TIME y POSITION_TIME_UPDATE son, por supuesto, los mismos.

RH      0       12:11:44.946    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   CTrade::OrderSend: market buy 0.20 AUDCAD [done at 0.95198]
NR      0       12:11:44.946    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   FnPositionOpen: Тикет открытой сделки: 5; Тикет открытого ордера: 5
HM      0       12:11:44.946    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   Order #5  State: ORDER_STATE_FILLED
KG      0       12:11:44.946    Trade   2021.05.07 16:00:00   position modified [#5  buy 0.2 AUDCAD 0.95198 sl: 0.94537 tp: 0.96496]
CJ      0       12:11:44.947    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   CTrade::OrderSend: modify position #5  AUDCAD (sl: 0.94537, tp: 0.96496) [done]
KK      0       12:11:44.956    Trade   2021.05.07 16:00:00   sell stop 0.2 AUDCAD at 0.94537 tp: 0.93890 (0.95195 / 0.95199 / 0.95195)
OE      0       12:11:44.957    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   CTrade::OrderSend: sell stop 0.20 AUDCAD at 0.94537 tp: 0.93890 [done]
RK      0       12:11:44.957    eMAEnvelopeTrade (AUDCAD,M30)   2021.05.07 16:00:00   ================ 1620403200<1620403200
 
Andrey Kaunov #:
en el comprobador, los cambios en los niveles SL/TP afectan a POSITION_TIME_UPDATE

¡Gracias por la información!

 
fxsaber #:

El campo ORDER_TIME_SETUP_MSC cambia cuando las órdenes se ejecutan parcialmente.

Como consecuencia, DEAL_TIME_MSC puede ser menor que ORDER_TIME_SETUP_MSC de su orden.

Ejemplo.


 
¿Podría decirme cómo compilar todos los archivos del directorio?