Обсуждение статьи "Статистические распределения в MQL5 - берем лучшее из R и делаем быстрее" - страница 11

 
Stanislav Korotky:
Это только в пятерке? В четверке планируется?

Так все должно работать в MT4. Это же стандартный OBJ_BITMAP_LABEL + кастомный Resource.

Кстати, компилятор MT4 умнее MT5

// MT5 молчит, MT4 предупреждает - check operator precedence for possible error; use parentheses to clarify precedence  Canvas.mqh
m_pixels[y*m_width+x]=(r<<16|g<<8|b<<0|255<<24) &0xffffffff;


И баг выявился (в MT5 не работает, а вот в MT4 как раз работает)

#property strict

#include <Graphics/Graphic.mqh>

double Func1(double x) { return MathPow(x,2); }
double Func2(double x) { return MathPow(x,3); }
double Func3(double x) { return MathPow(x,4); }

void SaveObjects( const long chart_id = 0, const int SubWindow = -1 )
{
  const int Total = ObjectsTotal(chart_id, SubWindow, OBJ_BITMAP_LABEL);
  
  for (int i = 0; i < Total; i++)
  {
    const string Name = ObjectName(chart_id, i, SubWindow, OBJ_BITMAP_LABEL);

    string ResourceName;
    
    if (ObjectGetString(chart_id, Name, OBJPROP_BMPFILE, 0, ResourceName))
      ResourceSave(ResourceName, Name + ".bmp"); // MT5 - false, MT4 - true
  }
}

void OnStart()
  {
   GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      
   SaveObjects();
  }
 
Внесите исправление
//+------------------------------------------------------------------+
//| Update object on screen (redraw)                                 |
//+------------------------------------------------------------------+
void CCanvas::Update(const bool redraw)
  {
//--- check
   if(m_rcname==NULL)
      return;
//--- update resource and redraw
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw(this.m_chart_id);
  }
 

Здесь

//+------------------------------------------------------------------+
//| Draw Wu's polyline                                               |
//+------------------------------------------------------------------+
void CCanvas::PolylineWu(int &x[],int &y[],const uint clr,const uint style=UINT_MAX);

случаются деления на ноль.

 
Если массив имеет длину больше, чем ширина (в пикселях) графика - облом.
 

Прошу доработать CGraphic и CCurve. Слабые классы получились. И наследоваться от них почти нереально, потому что нужное - private. Долго вникал, но чтобы поправить до нормальной эксплуатации, требовалось переписывать самому классы.

Захотел сделать интерактивный тиковый график - вышло только костыльно (без переписывания классов)

#include <Graphics/Graphic.mqh>

void GetPrices( double &Bids[], double &Asks[], const int Count = 100 )
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
  
  ArrayResize(Bids, Amount);
  ArrayResize(Asks, Amount);
  
  for (int i = 0; i < Amount; i++)
  {
    Bids[i] = Ticks[i].bid;
    Asks[i] = Ticks[i].ask;
  }
}

CGraphic* Graphic = new CGraphic;
const string Name = "Graphic" +(string)(GetTickCount() + MathRand());

void OnDeinit( const int Reason )
{
  Graphic.Destroy();
  delete Graphic;
  
  ChartRedraw();
}

void GraphTicks( const double &Price1[], const double &Price2[] )
{
   Graphic.Destroy();
   delete Graphic;

   Graphic = new CGraphic;  
   Graphic.Create(0, Name, 0, 0, 0, (int)(ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) * 0.8), (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS));

   Graphic.AddCurve(Price1, CURVE_LINES);
   Graphic.AddCurve(Price2, CURVE_LINES);
  
   Graphic.PlotAllCurves();
   Graphic.Update();
}

void OnTick()
{
  double Bids[], Asks[];
  GetPrices(Bids, Asks);
  
  GraphTicks(Bids, Asks);
}

 

Нет DeleteCurve, ChangeCurve и т.д. 

 
fxsaber:

Прошу доработать CGraphic и CCurve. Слабые классы получились. И наследоваться от них почти нереально, потому что нужное - private. Долго вникал, но чтобы поправить до нормальной эксплуатации, требовалось переписывать самому классы.

Захотел сделать интерактивный тиковый график - вышло только костыльно (без переписывания классов)

#include <Graphics/Graphic.mqh>

void GetPrices( double &Bids[], double &Asks[], const int Count = 100 )
{
  MqlTick Ticks[];
  
  const int Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
  
  ArrayResize(Bids, Amount);
  ArrayResize(Asks, Amount);
  
  for (int i = 0; i < Amount; i++)
  {
    Bids[i] = Ticks[i].bid;
    Asks[i] = Ticks[i].ask;
  }
}

CGraphic* Graphic = new CGraphic;
const string Name = "Graphic" +(string)(GetTickCount() + MathRand());

void OnDeinit( const int Reason )
{
  Graphic.Destroy();
  delete Graphic;
  
  ChartRedraw();
}

void GraphTicks( const double &Price1[], const double &Price2[] )
{
   Graphic.Destroy();
   delete Graphic;

   Graphic = new CGraphic;  
   Graphic.Create(0, Name, 0, 0, 0, (int)(ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) * 0.8), (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS));

   Graphic.AddCurve(Price1, CURVE_LINES);
   Graphic.AddCurve(Price2, CURVE_LINES);
  
   Graphic.PlotAllCurves();
   Graphic.Update();
}

void OnTick()
{
  double Bids[], Asks[];
  GetPrices(Bids, Asks);
  
  GraphTicks(Bids, Asks);
}

 

Нет DeleteCurve, ChangeCurve и т.д. 

это такой короткий код получается? я почему-то думал,там простыня. а так можно сделать визуализацию стакана с заданными колвом бандов,совмещенную с лентой сделок? как я показывал пример визуализации в другом софте.
 
Stanislav Korotky:
Это только в пятерке? В четверке планируется?

Только в пятерке.

С четверкой все закончено.

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

Интерактивно рисовать что угодно можно уже много лет. Только никто (публично точно) не использует.

Код не короткий, а длинный и очень кривой (как и результат - мерцания). Библиотеку нужно серьезно дорабатывать. 

 

Да, библиотека пока как проба пера.

Приведем в порядок, разрешим наследование, добавим методы и избавимся от падений из-за неправильной индексации.

 
fxsaber:

Интерактивно рисовать что угодно можно уже много лет. Только никто (публично точно) не использует.

Код не короткий, а длинный и очень кривой (как и результат - мерцания). Библиотеку нужно серьезно дорабатывать. 

если брался за аналог именно plot из R,то там вроде только статическая графика. если есть интерактивная графика,то это точно не plot  в прямом виде. я искал что-то такое там ради интереса,но были отсылки куда-то в сторону совместной работы с ява и т.п.

типа такого

dashboardInteractive Data Visualization with D3.js

если я правильно понял,то и такой

timevis:

Create rich and fully interactive timeline visualizations. Timelines can be included in Shiny apps and R markdown documents, or viewed from the R console and RStudio Viewer. 'timevis' includes an extensive API to manipulate a timeline after creation, and supports getting data out of the visualization into R. Based on the 'vis.js' Timeline module and the 'htmlwidgets' R package.

CRAN - Package dashboard
  • cran.r-project.org
Johann Laurent.
Причина обращения: