При попытке использовать метод CGraphic.Create получаю квадрат Малевича:
//| 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-3120M @ 2.50GHz, 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
Ни в "Экспертах", ни в "Журнале" ошибок нет.
Ищу применения для новый функций - в частности для библиотеки Grahic (научные графики).
Для примера, выделяем область на графике при помощи объекта прямоугольник и запускаем скрипт:
Дополню для непрограммистов, надо этот прямоугольник назвать RECTANGLE.
Вопрос - а что показывается по оси X? Выделил 2 бара М1, посчитал кол-во тиков, не подходит, секунды тоже не совпадают.
Вы не сделали Redraw() перед Update()
Сделал, рисует рамку графика, оси. Самого графика нет.
Еще дополнил, так рисует.
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();
....
***
Сделал, рисует рамку графика, оси. Самого графика нет.
Еще дополнил, так рисует.
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();
....
***
Спасибо!
Работающий вариант (version "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(); // удаляет с чарта график и уничтожает графический ресурс
}
//+------------------------------------------------------------------+
у CGraphic класса очень неудачная (или непродуманная) проектировка со своим канвасом.
В текущем виде он чисто демонстрационный. Для других целей малонеприменим. Так как невозможно работать с позицией и размером отрисовки на своём объекте - m_canvas беспардонно занимает весь граф.объект.
А из-за того, что m_canvas приват - то отнаследовать и изменить что-то по своему невозможно.
Вобщем - разрабы, доделайте его пожалуйста.
чтоб канвас был либо доступен при наследовании, либо была возможность работать с этим m_canvas без реального объекта на чарте с последующим забиранием сделанного построения на своё усмотрение.
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+="...";
}
Обнаружил багу - бесконечный цикл while при небольшой m_history.name_width
Как вообще отключить эту History справа?
Насколько я понимаю:
GetX | Записывает координаты X для всех точек кривой в массив |
я должен получить в массив координаты "x" - координаты в пикселях, всех отрисованных точек на графике?
Проверяем:
//| 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(); // удаляет с чарта график и уничтожает графический ресурс
}
//+------------------------------------------------------------------+
График нарисован:
А вот распечатка массива - в ней оказались данные по которым был построен график, но не координаты "x" в пикселях:
я должен получить в массив координаты "x" - координаты в пикселях, всех отрисованных точек на графике?
речи вроде про "пиксели" не шла.
Вы подали только массив Y. Значит по Х - это простой порядковый номер. Выдал GetX верно.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ищу применения для новый функций - в частности для библиотеки Grahic (научные графики).
Для примера, выделяем область на графике при помощи объекта прямоугольник и запускаем скрипт:
//| 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();
}
}
//+------------------------------------------------------------------+
В итоге видим график построенный по тикам, по Ask: