El lienzo es genial. - página 28

 
Evgeny Potapov:

Gracias. Esta opción parece bastante realista.

Gracias por tu pregunta, porque al responderla me he dado cuenta de una cosa muy importante que no sabía.
Me sorprendería que alguien lo supiera.

Si cambias el tamaño de un lienzo o su posición usando ObjectSetInteger, no necesitas redibujarlo.

  • Incluso si redimensionamos el kanvas generado y luego lo volvemos a redimensionar, los datos del kanvas son retenidos por el dibujo original.
  • Si aumenta el tamaño del kanvas con forma, los datos desaparecerán, pero volverán a aparecer cuando lo redimensione a su tamaño original.
  • Cuando se redimensiona o se cambia la posición del kanvas ni siquiera es necesario hacer Update() o ChartRedraw(), se actualizará con un nuevo tick o cambio de ventana.

Este indicador lo demuestra. El lienzo se genera una sola vez. Pero su tamaño y ubicación pueden cambiarse, y la matriz de valores se mantiene. Sólo tienes que mover el ratón por la pantalla

#property indicator_chart_window

#define protected public  // увы, это необходимо, чтобы расширить наши возможности 
#include <Canvas\Canvas.mqh> 
#undef protected
CCanvas C;
int OnInit()
  {
   if(!C.CreateBitmapLabel(0,0,"_Canvas",100,100,600,400,COLOR_FORMAT_ARGB_NORMALIZE))
      Print("Error creating canvas: ",GetLastError());
   DrawCanvas(600,400);
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   C.Destroy();
  }
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double& price[])       
  {
    return prev_calculated;               
  }

void OnChartEvent(const int id,          
                  const long& lparam,   
                  const double& dparam, 
                  const string& sparam) 
  {
   if (id==CHARTEVENT_MOUSE_MOVE)  DrawCanvas((int)lparam,(int)dparam);
  }
//+------------------------------------------------------------------+
void DrawCanvas(int x, int y)
{
 static bool first=true;
 //Comment(string(x)+"   " +string(y));
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XDISTANCE,x/5);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YDISTANCE,y/5);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_XSIZE,x);
 ObjectSetInteger(C.m_chart_id,C.m_objname,OBJPROP_YSIZE,y);  
 if(first) // канвас формируется только один раз
 {
   C.Erase();
   C.FillCircle(100,100,70,ColorToARGB(clrViolet,200));
   C.FillCircle(300,200,100,ColorToARGB(clrLightBlue,100));
   C.Rectangle(140,50,250,150,ColorToARGB(clrAqua));
   C.Update(); 
   first=false;
 }
 ChartRedraw(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
Archivos adjuntos:
 
¿es posible guardar en vídeo?
 
Andrey Dik:
¿se puede guardar en un vídeo?
puedes
 
Nikolai Semko:
puedes

Espero que no sea creando un millón de imágenes y luego montándolas en un vídeo en algún editor de vídeo).

si no le importa, por favor, explíquese

 
Andrey Dik:

Espero que no sea creando un millón de imágenes y luego montándolas en un vídeo en algún editor de vídeo).

si no le importa, por favor, explíquese

No, claro que no.
Lo hará.

 
Nikolai Semko:

No, por supuesto que no.
Es una molestia.

no necesitas el código, dame una pista de cómo hacerlo.

 
Nikolai Semko:
  • Cuando se redimensiona o cambia la posición del lienzo, ni siquiera es necesario hacer Update() o ChartRedraw(), se actualizará con un nuevo tick o cambio de ventana.

Bueno, el terminal llama a ChartRedraw() por sí mismo según estos eventos ;)

 
Andrey Dik:

no se necesita código, pista de cómo hacerlo

Hay muchas opciones dependiendo del tipo de vídeo que quieras capturar. ¿Qué sucede en la ventana en tiempo real con el puntero del ratón, los indicadores, los objetos, la interfaz gráfica de usuario? ¿O algo más?

 
¿Cuál es la verdadera utilidad de este chip? ¿Sirve para encontrar patrones en el gráfico de precios que ayuden a operar?
 
Andrey Khatimlianskii:

Bueno, el propio terminal llama a ChartRedraw() en estos eventos ;)

Lo entiendo, pero no quería entrar en detalles.
Te he llamado la atención porque el chartRedraw() no redibuja el objeto canvas, sólo se redibuja duranteUpdate(). Y si se utiliza ObjectSetInteger para redibujar el objeto canvas basta con forzar ChartRedraw() o esperar el cambio de gráfico o la llegada de un nuevo tick, cuando se produce ChartRedraw().

Razón de la queja: