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 protectedpublic// увы, это необходимо, чтобы расширить наши возможности #include <Canvas\Canvas.mqh>
#undef protected
CCanvas C;
intOnInit()
{
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);
}
//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
C.Destroy();
}
//+------------------------------------------------------------------+intOnCalculate (constint rates_total,
constint prev_calculated,
constint begin,
constdouble& price[])
{
return prev_calculated;
}
voidOnChartEvent(constint id,
constlong& lparam,
constdouble& dparam,
conststring& sparam)
{
if (id==CHARTEVENT_MOUSE_MOVE) DrawCanvas((int)lparam,(int)dparam);
}
//+------------------------------------------------------------------+void DrawCanvas(int x, int y)
{
staticbool 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(); // можно обойтись и без этого, но тогда перерисовка будет только с каждым тиком или изменением чарта
}
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.
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?
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.
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.
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
puoi salvare in un video?
è 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
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à.
No, certo che no.
È una seccatura.
non hai bisogno del codice, dammi un suggerimento su come farlo.
Bene, il terminale chiama ChartRedraw() da solo secondo questi eventi;)
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?
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.