Discussione sull’articolo "Studiare la classe CCanvas. Come disegnare oggetti trasparenti" - pagina 4

 
Artyom Trishkin:
MQL4 ;)

Non sono favorevole a MQL4. Tutti gli esempi sono solo in MQL5.

//+------------------------------------------------------------------+
//|Test.mq5 |
//|Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Canvas\Canvas.mqh>
CCanvas     m_canvas;           // l'oggetto canvas
//+------------------------------------------------------------------+
//| Funzione di avvio del programma di script|
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime arr_time[];
   double   arr_open[];
   double   arr_close[];
   if(CopyTime(Symbol(),Period(),0,2,arr_time)==-1)
      return;
   if(CopyClose(Symbol(),Period(),0,2,arr_close)==-1)
      return;
   if(CopyOpen(Symbol(),Period(),0,2,arr_open)==-1)
      return;
   int x1,y1,x2,y2;
   if(!ChartTimePriceToXY(0,0,arr_time[0],arr_open[0],x1,y1))
      Print("Error ",GetLastError());
   if(!ChartTimePriceToXY(0,0,arr_time[1],arr_close[0],x2,y2))
      Print("Error ",GetLastError());
//x1 = Tempo[1];
//y1 = Open[1];
//x2 = Tempo[0];
//y2 = Close[1];
   Print("arr_time[0]=",arr_time[0],", arr_open[0]=",arr_open[0]);
   m_canvas.CreateBitmapLabel("COLOR_FORMAT_ARGB_NORMALIZE",x1,y1,MathAbs(x2-x1),MathAbs(y2-y1),COLOR_FORMAT_ARGB_NORMALIZE);
   m_canvas.Erase(ColorToARGB(clrBlue,200));
   m_canvas.Update();
   Sleep(10000);
   m_canvas.Destroy();
  }
//+------------------------------------------------------------------+
//| Ottiene la larghezza del grafico (in pixel)|
//+------------------------------------------------------------------+
int ChartWidthInPixels(const long chart_ID=0)
  {
//--- preparare la variabile per ottenere il valore della proprietà
   long result=-1;
//--- ripristinare il valore dell'errore
   ResetLastError();
//--- ricevere il valore della proprietà
   if(!ChartGetInteger(chart_ID,CHART_WIDTH_IN_PIXELS,0,result))
     {
      //--- visualizzare il messaggio di errore nel Diario degli esperti
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- restituire il valore della proprietà del grafico
   return((int)result);
  }
//+------------------------------------------------------------------+
//| Ottiene l'altezza del grafico (in pixel) ||
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
//--- preparare la variabile per ottenere il valore della proprietà
   long result=-1;
//--- ripristinare il valore dell'errore
   ResetLastError();
//--- ricevere il valore della proprietà
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      //--- visualizzare il messaggio di errore nel Diario degli esperti
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- restituire il valore della proprietà del grafico
   return((int)result);
  }
//+------------------------------------------------------------------+

E il risultato dello script:

risultato

 

Vladimir, una domanda per te che sei un esperto.

C'è un pannello a forma di tela. Sul grafico vengono disegnate le linee di tendenza. Come si fa a nasconderle dietro la tela?

Screenshot della piattaforma di trading MetaTrader

RTS Splice, H1, 2016.10.16

JSC &#39;&#39;Otkritie Broker&#39;&#39;, MetaTrader 5, Demo

RTS Splice, H1, 2016.10.16, JSC ''Otkritie Broker'', MetaTrader 5, Demo


 
Dennis Kirichenko:

Vladimir, una domanda per te che sei un esperto.

C'è un pannello a forma di tela. Sul grafico vengono disegnate le linee di tendenza. Come nasconderle dietro la tela?


Ad esempio, distruggendo il pannello e disegnandole di nuovo....
 
Sì, grazie. Finora mi è venuta l'idea di mettere semplicemente degli oggetti nello sfondo....
[Eliminato]  
Vladimir Karputov:
Grazie per l'articolo. Purtroppo, tutti i link alla documentazione in esso contenuti sono interrotti.
 
Alexey Kozitsyn:
Grazie per l'articolo. Purtroppo tutti i link alla documentazione in esso contenuti sono interrotti.

Grazie per il messaggio: la guida è stata ricostruita, da cui gli errori. Provvederemo a correggere i collegamenti.

 
Vladimir Karputov:

Tramite la classe CCanvas?

P.S. Utilizzare CCanvas.CreateBitmap:

Crea una risorsa grafica legata a un oggetto grafico.

1. Crea una risorsa grafica nella finestra principale del grafico corrente.

bool CreateBitmap(
const string nome, // nome
const datetimetime, // time
const doubleprice, // prezzo
constintlarghezza, // larghezza
const int height, // altezza
ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA// formato
);

In questo modo sarà possibile vincolare un angolo di una tela. Ma la larghezza e l'altezza saranno impostate in pixel.


Posso scrivere in russo qui?

Perché date istruzioni a uno, ma in realtà professate due pesi e due misure.

 
Alexey Kozitsyn:
Grazie per l'articolo. Purtroppo tutti i link alla documentazione in esso contenuti sono interrotti.
I link sono stati corretti. Grazie per il messaggio.
 
Alexey Petrov:
I link sono stati corretti. Grazie per il messaggio.

Rimangono degli errori.

Paragrafo introduttivo:

...

Prima di iniziare a disegnare direttamente con la classe CCanvas, è necessario imparare alcune definizioni relative alla gestione dei colori. Ad esempio, cos'è la trasparenza e cos'è un canale alfa.

...


Elemento "5.1 Creare uno script "Illusion.mq5"".

...

Disegnare un cerchio dipinto. Il cerchio verrà disegnato sopra il colore con cui abbiamo riempito la tela (canvas_XRGB_NOALPHA.Erase(ColorToARGB(colr,alpha));).

canvas_XRGB_NOALPHA.CreateBitmapLabel - Qui abbiamo creato una risorsa grafica legata all'oggetto grafico.

Riempie l'intera tela con il colore in formato ARGB con trasparenza alfa.

Testo in uscita - Tipo di elaborazione dell'immagine per questa tela. Colore del testo in formato ARGB con canale alfa pari a 255, ovvero il colore del testo in uscita.

Se vogliamo che tutto ciò che è stato disegnato venga visualizzato sullo schermo, dobbiamo aggiornare lo schermo.

Poiché abbiamo creato la risorsa grafica con un binding all'oggetto grafico ( metodo CreateBitmapLabel), cancelleremo la risorsa con il metodo Destroy().

...

 

Salve ragazzi, potete dirmi come fare per rendere il pannello informativo in modo che le icone delle offerte non siano sovrapposte.

Sembra che sia in primo piano, tutto è disegnato dietro, ma le offerte sono sovrapposte.

void CreateEdit(long             chart_id,         // id del grafico
                int              sub_window,       // numero della finestra (sottofinestra)
                string           name,             // nome dell'oggetto
                color            font_color,       // colore del carattere
                int              x_size,           // larghezza
                int              y_size,           // altezza
                int              x_distance,       // Coordinata dell'asse X
                int              y_distance,       // Coordinata dell'asse Y
                long             z_order,          // priorità
                color            background_color) // colore di sfondo 
  {
// Se l'oggetto è stato creato con successo, allora...
   if(ObjectCreate(chart_id,name,OBJ_RECTANGLE_LABEL,sub_window,0,0))
     {
      // ... impostare le sue proprietà
      ObjectSetInteger(chart_id,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);  // impostazione dell'angolo del grafico
      ObjectSetInteger(chart_id,name,OBJPROP_COLOR,font_color);         // colore del carattere
      ObjectSetInteger(chart_id,name,OBJPROP_BGCOLOR,background_color); // colore di sfondo
      ObjectSetInteger(chart_id,name,OBJPROP_XSIZE,x_size);             // larghezza
      ObjectSetInteger(chart_id,name,OBJPROP_YSIZE,y_size);             // altezza
      ObjectSetInteger(chart_id,name,OBJPROP_XDISTANCE,x_distance);     // impostare la coordinata X
      ObjectSetInteger(chart_id,name,OBJPROP_YDISTANCE,y_distance);     // impostazione della coordinata Y
      ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,false);         // l'oggetto non può essere selezionato se FALSO
      ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,z_order);           // priorità dell'oggetto
      ObjectSetInteger(chart_id,name,OBJPROP_READONLY,true);            // di sola lettura
      ObjectSetInteger(chart_id,name,OBJPROP_ALIGN,ALIGN_LEFT);         // allineamento a sinistra
      //--- visualizzazione in primo piano (false) o sullo sfondo (true) 
    ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); 
      ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,"\n");              // nessun tooltip se "\n".
     }
  }