Discusión sobre el artículo "Otras clases en la biblioteca DoEasy (Parte 70): Ampliación de la funcionalidad y actualización automática de la colección de objetos de gráfico"

 

Artículo publicado Otras clases en la biblioteca DoEasy (Parte 70): Ampliación de la funcionalidad y actualización automática de la colección de objetos de gráfico:

En este artículo, ampliaremos la funcionalidad de los objetos de gráfico, organizaremos la navegación por los gráficos, crearemos capturas de pantalla, y también guardaremos plantillas y las aplicaremos a los gráficos. Asimismo, implementaremos la actualización automática de la colección de objetos de gráfico, sus ventanas y los indicadores en ellas.

Queda por probar la creación de capturas de pantalla del gráfico actual. Cada vez que presionemos el botón, se creará una captura de pantalla del gráfico con un tamaño determinado. Primera pulsación: captura de pantalla 800x600, segunda pulsación: captura de pantalla 750x562, tercera pulsación: captura de pantalla en el tamaño de gráfico actual:


Después de crear tres capturas de pantalla en diferentes resoluciones (sobre las cuales la biblioteca ha creado las entradas correspondientes en el diario),

CChartObj::ScreenShot800x600: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.25.png (800 x 600)
CChartObj::ScreenShot750x562: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.28.png (750 x 562)
CChartObj::ScreenShotWndSize: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.29.png (726 x 321)

también miramos el contenido de la carpeta en la que se guardan estas capturas de pantalla.
Antes de tomar las capturas de pantalla, hemos movido el cursor por diferentes lugares de las dos ventanas del gráfico actual, y en los comentarios del gráfico se puede ver el tiempo, el precio, el número de subventana y las coordenadas X e Y del cursor en píxeles. La coordenada Y del cursor tiene dos valores. El primer valor muestra la coordenada Y respecto a las coordenadas iniciales de la ventana principal del símbolo, mientras que el segundo valor mostrado (entre paréntesis) indica el valor de la coordenada Y respecto al borde superior de la ventana donde se encuentra el cursor.

Autor: Artyom Trishkin

 

Orden Limitada, usando el botón DeletePending, da muchos eventos OnChartEvent idénticos, mientras que debería haber diferentes

O mediante Bulk Operations Delete Limit Orders también da muchos eventos idénticos.

Si cierra manualmente, los eventos son secuenciales.


2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.055 -
2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090285  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 4718715 (123), G1: 8, G2: 4
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:58.395 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090282  at price 1.19640, sl 1.19490, tp 1.19790, Magic number 10223739 (123), G1: 12, G2: 9
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:58:00.613 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090287  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 6357115 (123), G1: 1, G2: 6
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.669 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090286  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 393339 (123), G1: 6
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
 
BillionerClub OnChartEvent idénticos, pero debería haber diferentes.

O mediante Bulk Operations Delete Limit Orders da muchos eventos idénticos

Si cierras manualmente, los eventos son secuenciales.

No entiendo lo que quieres decir...
 
Artyom Trishkin OnChartEvent.
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {


//--- Si trabaja en el probador, salga
//if(MQLInfoInteger(MQL_TESTER))
// volver;
   int idx=id-CHARTEVENT_CUSTOM;
//--- Extraer de lparam (1) los milisegundos del tiempo del evento, (2) la causa, (3) la fuente del evento, y (4) establecer el tiempo exacto del evento.
   ushort msc=engine.EventMSC(lparam);
   ushort reason=engine.EventReason(lparam);   ushort source=engine.EventSource(lparam);
   long time=::TimeCurrent()*1000+msc;
//--- Tratamiento de los eventos comerciales
   if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE)
     {
      //--- Obtener la lista de todos los eventos comerciales
      CArrayObj *list=engine.GetListAllOrdersEvents();
      if(list==NULL)
         return;
      //--- obtener el índice del evento respecto al final de la lista
      //--- en el probador el offset se pasa por el parámetro lparam al manejador de eventos
      //--- no en el tester - cada evento es enviado uno a la vez y manejado en OnChartEvent()
      int shift=(engine.IsTester() ? (int)lparam : 0);
      CEvent *event=list.At(list.Total()-1-shift);

Así lo he corregido, parece que funciona.


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
 
BillionerClub OnChartEvent

Así es como lo he arreglado, parece que funciona.


¿Te refieres a que la librería envía eventos erróneos al manejador de eventos?
 
Artyom Trishkin #:
¿Te referías a que la librería envía los eventos equivocados al manejador de eventos?

Sí, a eso me refería. Creo que lo he arreglado, pero no estoy seguro de la solución, ya que no entiendo muy bien dónde estarían los inconvenientes.


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
      if(event==NULL)
      {
      event=list.At(list.Total()-1-shift);
      if(event==NULL)return;
      }
 
BillionerClub #:

Sí, a eso me refería. Lo he corregido, pero no estoy seguro de la solución, ya que no entiendo muy bien dónde estarían los inconvenientes.


Gracias, voy a echar un vistazo