Test CGraphic - domande e suggerimenti
Quando cerco di usare il CGraphic.Crea, ottengo un quadrato di Malevich:
//| RECTANGLE_to_csv.mq5 |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.001"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input string rectangle_name="RECTANGLE"; // rectangle name
input int sleeping=15000; // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int result_find=ObjectFind(0,rectangle_name);
Print("result_find: ",result_find);
if(result_find!=-1)
{
datetime from = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,0);
datetime to = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,1);
MqlTick tick_array_range[]; // массив для приема тиков
ResetLastError();
CopyTicksRange(Symbol(),tick_array_range,COPY_TICKS_INFO,(ulong)from*1000,(ulong)to*1000);
Print("Error: ",GetLastError());
if(GetLastError()!=0)
return;
double arr_ask[];
int size=ArraySize(tick_array_range);
ArrayResize(arr_ask,size);
for(int i=0;i<size;i++)
arr_ask[i]=tick_array_range[i].ask;
m_graphic.Create(0,"Deals",0,30,30,500,300);
m_graphic.CurveAdd(arr_ask,1);
Print("Цвет фона перед \"Update\": ",m_graphic.BackgroundColor());
m_graphic.Update();
Print("Цвет фона после \"Update\": ",m_graphic.BackgroundColor());
Sleep(sleeping);
m_graphic.Destroy();
}
}
//+------------------------------------------------------------------+
2016.12.11 09:06:02.531 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 4882 / 8077 Mb, HDD: 357683 / 476372 Mb, GMT+02:00
2016.12.11 09:06:02.531 Terminal C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
Non ci sono errori né in "Experts" né in "Journal".
Cercando applicazioni per nuove funzioni - in particolare per la libreria Grahic (grafici scientifici).
Per esempio, selezionate un'area su un grafico usando un oggetto rettangolo ed eseguite lo script:
Per i non programmatori, il rettangolo dovrebbe essere chiamato RETTANGOLO.
Domanda - cosa viene mostrato sull'asse X? Ho segnato 2 barre M1, ho contato il numero di tick, non ci sta, anche i secondi non corrispondono.
Non avete fatto Redraw() prima di Update()
Fatto, disegna una cornice del grafico, gli assi. Non c'è un grafico in sé.
Anche aggiunto, questo è il modo in cui è disegnato.
m_graphic.Create(0,"Deals",0,30,30,500,300);
CCurve* curve = m_graphic.CurveAdd(arr_ask,CURVE_LINES);
curve.Color(clrBlack);
curve.Visible(true);
Print("Цвет фона перед \"Update\": ",m_graphic.BackgroundColor());
m_graphic.Redraw();
m_graphic.Update();
....
***
Fatto, disegna una cornice del grafico, gli assi. Non c'è un grafico in sé.
Anche integrato, disegna in questo modo.
m_graphic.Create(0,"Deals",0,30,30,500,300);
CCurve* curve = m_graphic.CurveAdd(arr_ask,CURVE_LINES);
curve.Color(clrBlack);
curve.Visible(true);
Print("Цвет фона перед \"Update\": ",m_graphic.BackgroundColor());
m_graphic.Redraw();
m_graphic.Update();
....
***
Grazie!
Versione di lavoro (versione "1.003"):
//| RECTANGLE_to_csv.mq5 |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.003"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input string rectangle_name="RECTANGLE"; // rectangle name
input int sleeping=15000; // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
ResetLastError();
int result_find=ObjectFind(0,rectangle_name);
if(result_find<0)
{
Print("ObjectFind Error: ",GetLastError());
return;
}
datetime from = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,0);
datetime to = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,1);
MqlTick tick_array_range[]; // массив для приема тиков
ResetLastError();
CopyTicksRange(Symbol(),tick_array_range,COPY_TICKS_INFO,(ulong)from*1000,(ulong)to*1000);
if(GetLastError()!=0)
return;
double arr_ask[];
int size=ArraySize(tick_array_range);
ArrayResize(arr_ask,size);
for(int i=0;i<size;i++)
arr_ask[i]=tick_array_range[i].ask;
m_graphic.Create(0,"Deals",0,30,30,500,300); // создает графический ресурс, привязанный к объекту чарта
CCurve *curve=m_graphic.CurveAdd(arr_ask,1); // создает и добавляет кривую (CCurve) на график
curve.Visible(true); // отображает кривую
m_graphic.Redraw(); // redraw grahic
m_graphic.Update(); // отображает на экране сделанные изменения
Sleep(sleeping);
m_graphic.Destroy(); // удаляет с чарта график и уничтожает графический ресурс
}
//+------------------------------------------------------------------+
La classe CGraphic ha un design molto sfortunato (o mal concepito) con la sua tela.
Nella sua forma attuale, è puramente a scopo dimostrativo. È di scarsa utilità per altri scopi. Poiché è impossibile gestire la posizione e la dimensione del disegno sul proprio oggetto - m_canvas occupa ingiustamente l'intero oggetto grafico.
E a causa del fatto che m_canvas è privato, è impossibile ereditare e cambiare qualcosa di proprio.
In generale, si prega di modificarlo.
in modo che la tela sia disponibile quando si eredita o che sia possibile lavorare con questo m_canvas senza oggetto reale sul grafico e poi togliere la costruzione fatta a propria discrezione.
m_canvas.FontSizeSet(m_history.name_size);
if(m_canvas.TextWidth(name)>m_history.name_width)
{
while(m_canvas.TextWidth(name+"...")>m_history.name_width)
name=StringSubstr(name,0,StringLen(name)-1);
name+="...";
}
Trovato un bug - ciclo while infinito quando m_history.name_width è piccolo
Come faccio a disabilitare del tutto questa Storia sul lato destro?
Per quanto mi riguarda:
GetX | Scrive le coordinate X per tutti i punti della curva in un array |
Dovrei ottenere le coordinate "x" - coordinate in pixel - di tutti i punti disegnati sul grafico in un array?
//| RECTANGLE_to_csv.mq5 |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.000"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input int m_width=500; // ширина
input int m_height=300; // высота
input int sleeping=15000; // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
double arr_example[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
m_graphic.Create(0,"Example",0,30,30,m_width,m_height); // создает графический ресурс, привязанный к объекту чарта
CCurve *curve=m_graphic.CurveAdd(arr_example,1); // создает и добавляет кривую (CCurve) на график
curve.Visible(true); // отображает кривую
m_graphic.Redraw(); // redraw grahic
double arr_get_x[];
curve.GetX(arr_get_x); // записываем координаты X для всех точек кривой в массив
ArrayPrint(arr_get_x); // распечатываем массив
m_graphic.Update(); // отображает на экране сделанные изменения
Sleep(sleeping);
m_graphic.Destroy(); // удаляет с чарта график и уничтожает графический ресурс
}
//+------------------------------------------------------------------+
Il grafico è disegnato:
Ed ecco una stampa dell'array - è risultato contenere i dati per i quali il grafico è stato disegnato, ma non le coordinate "x" in pixel:
Devo ottenere le coordinate "x" - coordinate in pixel - di tutti i punti disegnati sul grafico in un array?
Non ho parlato di "pixel".
Hai presentato solo una matrice Y. Quindi x è un semplice numero ordinale. GetX è corretto.

- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Cercare applicazioni per nuove funzioni - in particolare per la libreria Grahic (grafici scientifici).
Come esempio, selezioniamo un'area su un grafico usando un oggetto rettangolo ed eseguiamo lo script:
//| RECTANGLE_to_csv.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"
#property script_show_inputs
#include <Graphics/Graphic.mqh>
//---
input string rectangle_name="RECTANGLE"; // rectangle name
input int sleeping=15000; // sleep (milliseconds)
//---
CGraphic m_graphic;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
//---
int result_find=ObjectFind(0,rectangle_name);
Print("result_find: ",result_find);
if(result_find!=-1)
{
datetime from = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,0);
datetime to = (datetime)ObjectGetInteger(0,rectangle_name,OBJPROP_TIME,1);
MqlTick tick_array_range[]; // массив для приема тиков
ResetLastError();
CopyTicksRange(Symbol(),tick_array_range,COPY_TICKS_INFO,(ulong)from*1000,(ulong)to*1000);
Print("Error: ",GetLastError());
if(GetLastError()!=0)
return;
double arr_ask[];
int size=ArraySize(tick_array_range);
ArrayResize(arr_ask,size);
for(int i=0;i<size;i++)
arr_ask[i]=tick_array_range[i].ask;
GraphPlot(arr_ask,1);
m_graphic.Destroy();
Sleep(sleeping);
ObjectsDeleteAll(0,"Graphic",0,OBJ_BITMAP_LABEL);
ChartRedraw();
}
}
//+------------------------------------------------------------------+
Come risultato, vediamo un grafico tracciato da tick, da Ask: