La tela è forte! - pagina 28

 
Evgeny Potapov:

Grazie! Questa opzione sembra abbastanza realistica!

Grazie per la sua domanda, perché rispondendo ho capito una cosa molto importante che non sapevo.
Sarei sorpreso se qualcuno ne fosse a conoscenza.

Se ridimensionate una tela o la sua posizione usando ObjectSetInteger, non avete bisogno di ridisegnarla.

  • Anche se ridimensioniamo il kanvas generato e poi lo ridimensioniamo di nuovo, i dati del kanvas vengono mantenuti dal disegno originale.
  • Se si aumenta la dimensione del kanvas sagomato, i dati spariranno, ma riappariranno quando lo si ridimensiona alla sua dimensione originale.
  • Quando si ridimensiona o si cambia la posizione del kanvas non è nemmeno necessario fare Update() o ChartRedraw(), sarà aggiornato con un nuovo tick o un cambio di finestra.

Questo indicatore lo dimostra. La tela viene generata solo una volta. Ma la sua dimensione e la sua posizione possono essere cambiate, e l'array di valori viene mantenuto. Basta muovere il mouse sullo schermo

#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(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
File:
 
è possibile salvare su video?
 
Andrey Dik:
puoi salvare in un video?
è possibile
 
Nikolai Semko:
è possibile

Fico! speriamo non creando un milione di immagini e poi assemblandole in un video in qualche editor video))

se non ti dispiace, per favore, approfondisci

 
Andrey Dik:

Fico! speriamo non creando un milione di immagini e poi assemblandole in un video in qualche editor video))

se non ti dispiace, per favore, approfondisci

No, certo che no.
Lo farà.

 
Nikolai Semko:

No, certo che no.
È una seccatura.

non hai bisogno del codice, dammi un suggerimento su come farlo.

 
Nikolai Semko:
  • Quando si ridimensiona o si cambia la posizione del canvas, non c'è nemmeno bisogno di fare Update() o ChartRedraw(), sarà aggiornato con un nuovo tick o un cambio di finestra.

Bene, il terminale chiama ChartRedraw() da solo secondo questi eventi;)

 
Andrey Dik:

nessun codice necessario, suggerimento su come farlo

Ci sono molte opzioni a seconda del tipo di video che si vuole catturare. Cosa succede nella finestra in tempo reale con il puntatore del mouse, indicatori, oggetti, GUI? O qualcos'altro?

 
Qual è la vera utilità di questo chip? Aiuta a trovare modelli sul grafico dei prezzi che aiuterebbero il trading?
 
Andrey Khatimlianskii:

Beh, il terminale stesso chiama ChartRedraw() su questi eventi;)

Lo capisco, ma non volevo entrare nei dettagli.
Ho attirato la vostra attenzione su questo perché il chartRedraw() non ridisegna l'oggetto canvas, viene ridisegnato solo duranteUpdate(). E se usate ObjectSetInteger per ridisegnare l'oggetto canvas è sufficiente forzare ChartRedraw() o aspettare il cambiamento del grafico o l'arrivo di un nuovo tick, quando ChartRedraw() si verifica.

Motivazione: