Quando eu tento usar o CGraphic.Criar, eu recebo uma praça 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
Não há erros nem em "Especialistas" nem em "Diário".
Procurando aplicações para novas funções - em particular para a biblioteca Grahic (gráficos científicos).
Por exemplo, selecione uma área em um gráfico usando um objeto retângulo e execute o roteiro:
Para não programadores, o retângulo deve ser chamado de RECTÂNGULO.
Pergunta - o que é mostrado no eixo X? Marquei 2 barras M1, contei o número de carrapatos, não cabe, os segundos também não correspondem.
Você não fez o Redraw() antes do Update()
Feito, desenha uma moldura gráfica, eixos. Não há um gráfico em si.
Além disso, é assim que se desenha.
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();
....
***
Feito, desenha uma moldura gráfica, eixos. Não há um gráfico em si.
Também complementado, ele desenha desta forma.
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();
....
***
Obrigado!
Versão de trabalho (versão "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(); // удаляет с чарта график и уничтожает графический ресурс
}
//+------------------------------------------------------------------+
A classe CGraphic tem um desenho muito infeliz (ou mal concebido) com sua tela.
Em sua forma atual, é puramente para fins de demonstração. É de pouca utilidade para outros fins. Como é impossível trabalhar com a posição e tamanho do desenho em seu próprio objeto - m_canvas ocupa sem escrúpulos todo o objeto gráfico.
E devido ao fato de que m_canvas é privado, é impossível herdar e mudar algo de sua própria natureza.
Em geral, favor modificá-lo.
para que a tela esteja disponível ao herdar ou para que seja possível trabalhar com esta m_canvas sem objeto real no gráfico e depois retirar a construção feita a seu próprio critério.
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+="...";
}
Encontrei um bug - infinito enquanto loop quando m_history.name_width é pequeno
Como desabilitar totalmente esta História no lado certo?
No que me diz respeito:
GetX | Escreve as coordenadas X para todos os pontos da curva em uma matriz |
Eu deveria obter as coordenadas "x" - coordenadas em pixels - de todos os pontos desenhados no gráfico em uma matriz?
Verificar:
//| 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(); // удаляет с чарта график и уничтожает графический ресурс
}
//+------------------------------------------------------------------+
O gráfico é desenhado:
E aqui está uma impressão da matriz - ela acabou por conter os dados para os quais o gráfico foi desenhado, mas não as coordenadas "x" em pixels:
Tenho que obter as coordenadas "x" - coordenadas em pixels - de todos os pontos desenhados no gráfico em uma matriz?
Eu não disse nada sobre "pixels".
Você só apresentou uma matriz em Y. Então x é um simples número ordinal. GetX está correto.

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Procurando aplicações para novas funções - em particular para a biblioteca Grahic (gráficos científicos).
Como exemplo, selecionamos uma área em um gráfico usando um objeto retângulo e executamos o roteiro:
//| 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();
}
}
//+------------------------------------------------------------------+
Como resultado, vemos um gráfico traçado por carrapatos, por Ask: