Обсуждение статьи "Визуализируй это! Графическая библиотека в MQL5 как аналог plot из R" - страница 3

 
Roman Konopelko:

Добрый день!

Для подобных целей в библиотеке реализован режим CustomPlotFunction, пример использования как раз реализует примерно то что вам интересно.

P.S. Более подробно о нем написано на форуме .


Отлично, спасибо :)
 

Is there a way to plot the X axis labels as a datetime series?

 
Pablo Rego:

Is there a way to plot the X axis labels as a datetime series?

Example:

#include <Graphics/Graphic.mqh>
double arrX[];
double arrY[];
//---
string TimeFormat(double x,void*data)
  {
   return(TimeToString((datetime)arrX[ArraySize(arrX)-(int)x-1]));
  }
//+------------------------------------------------------------------+
void OnStart()
  {
   MqlRates rates[];
   CopyRates(Symbol(),Period(),0,100,rates);
   ArraySetAsSeries(rates,true);
   int size=ArraySize(rates);
   ArrayResize(arrX,size);
   ArrayResize(arrY,size);
   for(int i=0; i<size;++i)
     {
      arrX[i]=(double)rates[i].time;
      arrY[i]=rates[i].close;
     }
   CGraphic graphic;
   graphic.Create(0,"Rates",0,30,30,780,380);
   CCurve *curve=graphic.CurveAdd(arrY,CURVE_LINES,"Close");
   CAxis *xAxis=graphic.XAxis();
   xAxis.AutoScale(false);
   xAxis.Type(AXIS_TYPE_CUSTOM);
   xAxis.ValuesFunctionFormat(TimeFormat);
   xAxis.DefaultStep(20.0);
   curve.Visible(true);
   graphic.Redraw();
   graphic.Update();
  }

Result:


 

А есть возможность отрисовки меток по оси X в обратном (реверсном) порядке?

Чтобы видеть индексы тайм-серии например.

 
Dennis Kirichenko:

А есть возможность отрисовки меток по оси X в обратном (реверсном) порядке?

Чтобы видеть индексы тайм-серии например.

Быстрого решения в виде вызова одной функции, которая провернет все сделает сама нет. Как и в вам нужно самому создать свою функцию для отрисовки значений и предать её в метод ValuesFunctionFormat.
 

Подскажите, можно ли задать прозрачность фона, может быть в базовом классе что-то подправить? сходу не нашел

 
Maxim Dmitrievsky:

Подскажите, можно ли задать прозрачность фона, может быть в базовом классе что-то подправить? сходу не нашел


Только если внести изменение в класс CGraphic (только прямое редактирование - это неправильно, нужно наследование, здесь пример исключительно для быстроты)

//+------------------------------------------------------------------+
//| Create graphic                                                   |
//+------------------------------------------------------------------+
bool CGraphic::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
  {
//--- check object name  
   if(ObjectFind(chart,name)>=0)
      return(false);
//--- preliminary calculation
   int width=x2-x1;
   int height=y2-y1;
   if(width>0 && height>0)
     {
      m_width=width;
      m_height=height;
      //--- create object
      if(!ObjectCreate(chart,name,OBJ_BITMAP_LABEL,subwin,0,0))
         return(false);
      //--- customize object
      if(!ObjectSetInteger(chart,name,OBJPROP_XDISTANCE,x1) || 
         !ObjectSetInteger(chart,name,OBJPROP_YDISTANCE,y1))
        {
         ObjectDelete(chart,name);
         return(false);
        }
      //--- attach object
      if(!m_canvas.Attach(chart,name,width,height,COLOR_FORMAT_ARGB_NORMALIZE))
        {
         ObjectDelete(chart,name);
         return(false);
        }
     }
//--- success
   return(true);
  }

После этого можно управлять цветом:

   CGraphic graphic;
   graphic.Create(0,"Graphic",0,10,10,680,360);

   graphic.BackgroundColor(ColorToARGB(clrRed,150));
   graphic.GridBackgroundColor(ColorToARGB(clrBlue,150));

:

Пример

 
Vladimir Karputov:

Только если внести изменение в класс CGraphic (только прямое редактирование - это неправильно, нужно наследование, здесь пример исключительно для быстроты)

После этого можно управлять цветом:

:



спасибо, с наследованием разберусь :)

 

А как сделать что бы при смене инпутов в эксперте (REASON_PARAMETERS) график не выдавал ошибку и рефрешился с новыми параметрами?  Если переключать тф или менять символы то все ок, если меняю параметры то ошибка  invalid pointer. В параметрах меняется количество кривых и именно на них поинтеры некорректные.

если не понятно могу пример привести )

 
Roman Konopelko:

Добрый день, как конкретно вы пытались перерисовать график?

Если вам необходимо просто изменить данные для конкретной кривой, то вот пример:

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
voidOnStart()
  {
//--- data 1
   double x1[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y1[]={-5,4,-10,23,17,18,-9,13,17,4};
//--- data 2
   double x2[]={-10,-10,10,10};
   double y2[]={-10,10,-10,10};
//--- graphic
   CGraphic graph;
   graph.HistoryNameWidth(80);
   graph.Create(0,"Graph",0,30,30,830,430);
//--- Points  
   CCurve *curve=graph.CurveAdd(x1,y1,CURVE_LINES);
   graph.CurvePlot(0);
   graph.Update();
   Sleep(1000);
   curve.Update(x2,y2);
   graph.Redraw(true);
   graph.Update();
   Sleep(1000);
  }
P.S. На форуме есть тема относительно библиотеки Graphics, в ней уже поднимался данный вопрос.

В скрипте это понятно, а как обновить в советнике? например вот код, создает на каждом тике случайный график:

#include <Graphics\Graphic.mqh>

 double Xg[10]={0,1,2,3,4,5,6,7,8,9};
 double Yg[10]={0,0,0,0,0,0,0,0,0,0};

//------------------------------------------  
int OnInit()
  {
   graf(); //рисуем график
//---
   return(INIT_SUCCEEDED);
  }
//------------------------------------------ 
void OnTick()
  {  
   for(int i=0; i<=9; i++){
    Yg[i]=(int)MathRand()/1000;  
   }
   ObjectDelete(0,"Graph");//удаляю график, понимаю что не тот подход но по другому не получается
   graf(); //рисуем график по новому
  }
//-------------------------------------------------------------
void graf(){
   CGraphic graph;
   graph.HistoryNameWidth(80);
   graph.Create(0,"Graph",0,30,30,830,430);

   CCurve *curve=graph.CurveAdd(Xg,Yg,CURVE_LINES);
   graph.CurvePlotAll();
   graph.Update(true);
}
//-------------------------------------------------------------

не могу сообразить как обновить данные не удаляя графика. Подскажите, пожалуйста кто в курсе.