Собственно вопрос в сабже. Недавно заметил появление новой папки MQL5\Include\Canvas. В ней располагаются классы для работы с графикой. В документации по этим классам пока пусто. Особенно заинтересовали классы HistogramChart и LineChart. Пытался создать линейный график примерно таким образом:
Ничего не вышло.
Без какой-либо документации исследовать сложно.
Разработчики или просто люди с опытом: приведите если нетрудно несколько примеров работы с этими классами. Какие возможности в них реализованы? Как быстро их заюзать? В общем колитесь знающие люди:)
Как оказалось ChartCanvas пока еще очень сырая библиотека. Ошибки сыплются как тараканы.
Вот первая: если попытаться построить линейный график (LineChart), содержащий больше точек для построения чем ширина окна в пикселях произойдет следующее:
Такое происходит из-за особенностей работы алгоритма с округлением:
//| Draws lines |
//+------------------------------------------------------------------+
void CLineChart::DrawData(const uint index)
{
double value=0.0;
//--- check
CArrayDouble *data=m_values.At(index);
if(data==NULL)
return;
int total=data.Total();
if(total<=1)
return;
//--- calculate
int dx=m_data_area.Width()/(total-1);
int x=m_data_area.left+1;
int y1=0;
int y2=(int)(m_y_0-data[0]*m_scale_y);
//--- draw
for(int i=1;i<total;i++,x+=dx)
{
y1=y2;
//x = (int)MathRound(per_dx*(i-1));
//int dx=(int)MathRound(per_dx*i);
double val=data[i];
if(val==EMPTY_VALUE)
continue;
if(m_accumulative)
value+=val;
else
value=val;
y2=(int)(m_y_0-value*m_scale_y);
if(m_filled)
{
...
}
else
{
LineAA(x,y1,x+dx,y2,(uint)m_colors[index],STYLE_SOLID);
}
}
}
dx в данном случае всегда будет равен нулю, если количество значений total больше ширины окна width. Итерация в этом случае не будет менять x и он всегда останется равным нулю.
Правильное решение следующее: необходимо прямо внутри цикла рассчитать значение предыдущей и текущей точек и построить линию между ними:
//| Draws lines |
//+------------------------------------------------------------------+
void CPointsChart::DrawData(const uint index)
{
double value=0.0;
//--- check
CArrayDouble *data=m_values.At(index);
if(data==NULL)
return;
int total=data.Total();
if(total<=1)
return;
//--- calculate
int dx=m_data_area.Width()/(total-1);
double per_dx = ((double)m_data_area.Width())/(total-1);
int x=m_data_area.left+1;
int y1=0;
int y2=(int)(m_y_0-data[0]*m_scale_y);
//--- draw
for(int i=1;i<total;i++)
{
y1=y2;
int px = m_data_area.left + 1 + (int)MathRound(per_dx*(i-1));
x = m_data_area.left + 1 + (int)MathRound(per_dx*i);
double val=data[i];
if(val==EMPTY_VALUE)
continue;
if(m_accumulative)
value+=val;
else
value=val;
y2=(int)(m_y_0-value*m_scale_y);
if(m_filled)
{
...
}
else
{
LineAA(px,y1,x,y2,(uint)m_colors[index],STYLE_SOLID);
}
}
}
В этом случае сработает автомасштабирование и график начнет отображаться верно:
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Собственно вопрос в сабже. Недавно заметил появление новой папки MQL5\Include\Canvas. В ней располагаются классы для работы с графикой. В документации по этим классам пока пусто. Особенно заинтересовали классы HistogramChart и LineChart. Пытался создать линейный график примерно таким образом:
Ничего не вышло.
Без какой-либо документации исследовать сложно.
Разработчики или просто люди с опытом: приведите если нетрудно несколько примеров работы с этими классами. Какие возможности в них реализованы? Как быстро их заюзать? В общем колитесь знающие люди:)