La toile est cool ! - page 28

 
Evgeny Potapov:

Merci ! Cette option semble tout à fait réaliste !

Merci pour votre question, car en y répondant, je me suis rendu compte d'une chose très importante que j'ignorais.
Je serais surpris si quelqu'un était au courant de tout ça.

Si vous redimensionnez un canevas ou sa position à l'aide d'ObjectSetInteger, vous n'avez pas besoin de le redessiner.

  • Même si nous redimensionnons le kanvas généré, puis le redimensionnons à nouveau, les données du kanvas sont conservées par le dessin original.
  • Si vous augmentez la taille du kanvas façonné, les données disparaissent, mais réapparaissent lorsque vous le redimensionnez à sa taille initiale.
  • Lorsque vous redimensionnez ou modifiez la position du kanvas, il n'est même pas nécessaire de faire Update() ou ChartRedraw(), il sera mis à jour avec un nouveau tick ou un changement de fenêtre.

Cet indicateur le démontre. Le canevas est généré une seule fois. Mais sa taille et son emplacement peuvent être modifiés, et le tableau de valeurs est conservé. Il suffit de déplacer la souris sur l'écran

#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(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
Dossiers :
 
est-il possible d'enregistrer en vidéo ?
 
Andrey Dik:
pouvez-vous enregistrer dans une vidéo ?
vous pouvez
 
Nikolai Semko:
vous pouvez

cool ! j'espère que ce n'est pas en créant un million d'images et en les assemblant ensuite en une vidéo dans un quelconque éditeur vidéo...))

si vous n'y voyez pas d'inconvénient, veuillez préciser...

 
Andrey Dik:

cool ! j'espère que ce n'est pas en créant un million d'images et en les assemblant ensuite en une vidéo dans un quelconque éditeur vidéo...))

si vous n'y voyez pas d'inconvénient, veuillez préciser...

Non, bien sûr que non.
Il le fera.

 
Nikolai Semko:

Non, bien sûr que non.
C'est un problème.

vous n'avez pas besoin du code, donnez-moi un indice sur la façon de le faire.

 
Nikolai Semko:
  • Lorsque vous redimensionnez ou changez la position du canevas, vous n'avez même pas besoin de faire Update() ou ChartRedraw(), il sera mis à jour avec un nouveau tick ou un changement de fenêtre.

Eh bien, le terminal appelle ChartRedraw() de lui-même en fonction de ces événements;)

 
Andrey Dik:

pas besoin de code, un conseil pour le faire

Il existe de nombreuses options en fonction du type de vidéo que vous souhaitez capturer. Que se passe-t-il dans la fenêtre en temps réel avec le pointeur de la souris, les indicateurs, les objets, l'interface graphique ? Ou quelque chose d'autre ?

 
Quelle est la véritable utilité de cette puce ? Est-il utile de trouver des modèles sur le graphique des prix qui aideraient à négocier ?
 
Andrey Khatimlianskii:

Eh bien, le terminal lui-même appelle ChartRedraw() sur ces événements;)

Je comprends, mais je ne voulais pas entrer dans les détails.
J'ai attiré votre attention sur ce point car la fonction chartRedraw() ne redessine pas l'objet canvas, il n'est redessiné que pendant lafonction Update(). Et si vous utilisez ObjectSetInteger pour redessiner l'objet canvas, il suffit de forcer ChartRedraw() ou d'attendre le changement de graphique ou l'arrivée d'un nouveau tick, lorsque ChartRedraw() se produit.