文章 "可视化!类似于 R 语言 "plot (绘图)" 的 MQL5 图形库"

 

新文章 可视化!类似于 R 语言 "plot (绘图)" 的 MQL5 图形库已发布:

在研究交易逻辑时, 图形形式的直观表达是非常重要的。科学界中流行的一些编程语言 (如 R 和 Python) 拥有可视化的特殊 "plot (绘图)" 功能。它能够以直观方式绘制线, 点分布和直方图。在 MQL5 中, 您可以使用 CGraphics 类完成相同的操作。

正如我们在上图中所见, 当使用 0.7 步长时, 我们简单地忽略了一个断点。结果就是, 结果曲线的真实双曲线函数几乎什么也没做。

当使用函数时, 也许会发生除零错误。有两种方式来处理这个问题:

  • 在 metaeditor.ini 里禁用除零检查
    [Experts]
    FpNoZeroCheckOnDivision=1
  • 或分析函数中使用的方程并返回这种实例的有效值。使用宏来处理的示例可在附带的 3Functions.mq5bat.mq5 文件里找到。



作者:MetaQuotes Software Corp.

 
干得不错!谢谢。我已经打算修正 CircleAA 算法
顺便说一句,CircleWu 函数可以简化和加速:

void CCanvas::CircleWu(const int x,const int y,const double r,const uint clr,const uint style=UINT_MAX)
  {
   if(r<=0)
      return;
//--- 初步计算
   double r2=r*r;
   double quarter=round(r*M_SQRT1_2);
//--- 设置线条样式
   uint prev_style=m_style;
   if(style!=UINT_MAX)
      LineStyleSet(style);
   uint mask=1<<m_style_idx;
//--- 绘制
   for(int dx=0; dx<=quarter; dx++)
     {
      double dy=sqrt(r2-dx*dx);
      double alpha1=dy-floor(dy);
      double alpha2=1-alpha1;
      if((m_style&mask)==mask)
        {
         PixelTransform4(x,y,dx,(int)(dy)+1,clr,alpha1);
         PixelTransform4(x,y,dx,(int)(dy),clr,alpha2);
         PixelTransform4(x,y,(int)dy+1,dx,clr,alpha1);
         PixelTransform4(x,y,(int)dy,dx,clr,alpha2);
        }
      mask<<=1;
      if(mask==0x1000000)
         mask=1;
     }
  
//--- 设置前一行的样式
   if(style!=UINT_MAX)
      m_style=prev_style;
  }
 
Nikolai Semko:
干得不错!谢谢。我已经打算修正 CircleAA 算法 顺便说一句,CircleWu 函数可以简化和加速:

感谢您的建议,我们会进行修改!
 

您可以随时更改图形本身及其每个函数的属性。例如,为图形轴添加标题、更改曲线名称并启用样条曲线逼近模式:

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
  {
   CGraphic graphic;
   graphic.Create(0,"Graphic",0,30,30,780,380);
   double x[]={-10,-4,-1,2,3,4,5,6,7,8};
   double y[]={-5,4,-10,23,17,18,-9,13,17,4};
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
   curve.Name("Example");                 
   curve.LinesIsSmooth(true);             
   graphic.XAxis().Name("X - axis");      
   graphic.XAxis().NameSize(12);          
   graphic.YAxis().Name("Y - axis");      
   graphic.YAxis().NameSize(12);
   graphic.YAxis().ValuesWidth(15);
   graphic.CurvePlotAll();
   graphic.Update();
   DebugBreak();
  }

 У меня метод называется LinesSmooth LineIsSmooth нету. Продолжаю изучать дальше :)

 

 
Orangetree:

您可以随时更改图形本身及其每个函数的属性。例如,为图形轴添加标题、更改曲线名称并启用样条曲线逼近模式:

  {
   curve.LinesIsSmooth(true);             

 У меня метод называется LinesSmooth LineIsSmooth нету. Продолжаю изучать дальше :)

 

该方法后来被重新命名。谢谢,已在文章中更正
 

如何才能在图表上重新绘制曲线时,同时更新刻度?

curve5.Update(resultPrices);
    
graphicfirst.Redraw(); и Update()


曲线本身已更新,但带有旧价格的刻度仍然保留,而且图表会移动到画布边界之外

我找到了,我需要执行 CalculateMaxMinValues() :)

 
Maxim Dmitrievsky:
您能告诉我如何正确重绘已创建的图表吗?例如,当更改数组中的值时?Redraw() 和 Update() 没有效果

下午好,您是如何重绘图表的?

如果您只需要更改某条曲线的数据,这里有一个工作示例:

#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| 脚本程序启动功能|
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 数据 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};
//--- 数据 2
   double x2[]={-10,-10,10,10};
   double y2[]={-10,10,-10,10};
//--- 图形
   CGraphic graph;
   graph.HistoryNameWidth(80);
   graph.Create(0,"Graph",0,30,30,830,430);
//--- 点数
   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);
  }
附注:论坛上有一个关于图形库的主题,其中已经提出了这个问题。
 
Roman Konopelko:

下午好,您具体是如何重绘图形的?

如果您只需要更改某条曲线的数据,这里有一个工作示例:

附注:论坛上有一个关于图形库的主题,其中已经提出了这个问题。
谢谢,我已经弄明白了,我做的是完全一样的事情,只是在一个数组上...... 你只需要为图形重新计算 graph.CalculateMaxMinValues(),然后刻度就更新了
 
Maxim Dmitrievsky:
您只需对图形 重新计算 graph.CalculateMaxMinValues(),然后比例就会更新
如果调用参数为 true 的CGraphic::Redraw(const bool rescale=false) 方法,缩放比例将自动重新计算(无需单独调用CalculateMaxMinValues)。
 
Roman Konopelko:
如果调用参数为 true 的 CGraphic::Redraw(const bool rescale=false) 方法,缩放比例将自动重新计算(无需单独调用CalculateMaxMinValues)。

对,明白了。)
 

是否有可能在图表上绘制两个或更多刻度--类似于尺子,以厘米和英寸为单位进行划分,只有在使用该点绘制图表时才给出数值?