文章 "利用 CCanvas 类开发自定义指标" - 页 2

 
fxsaber:

这是好消息!你有什么想法?用自定义时间序列代替刻度线历史记录

不,在刻度线历史记录旁边画一个刻度线速率柱状图。

这样,在使用参数时,您就可以直观地确定活动时间段,或许还能发现一些规律。

 
Dennis Kirichenko:

好主题。感谢作者,我将在 canvas..... 上制作一个tick 指标。

我注意到这一点。

有一个私有 数据成员m_canvas_name,但设置其值的方法Name()公共的。我认为这违反了封装原则。我将把这个方法设为私有。

也许受保护?因为所有其他方法都继承了 CCanvasBase。这样就无法在它们中使用该方法了。虽然我不知道,但也许您在总体结构中做了其他改动。

 
Alexander Fedosov:

也许是受保护的?因为所有其他方法都继承了 CCanvasBase。这样你就不能在它们中使用这个方法了。虽然我不知道,但也许你在总体结构上做了其他改动。


所以是的,受保护

然后是这里:

bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }
//+------------------------------------------------------------------+
//| 自定义指标去初始化功能
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ind.Delete();
   ChartRedraw();
  }

指标为何如此复杂?我认为有必要对画布本身进行清理。我会在 DeleteCanvas() 方法中 添加ChartRedraw()。

 
fxsaber:

如果您有草图,请发送截图/视频。我自己也发布过这样一个指标,但它没有被人们接受。虽然我还没有找到更好的方案。在 kanvas 上看到其他解决方案很有意思。


我正在为 FORTS 制作一个。我是按照常规格式制作的,但在测试器中,从 EA 主体调用时效果很差。现在我将把所有代码转移到 EA 中...

 
Dennis Kirichenko:

是的,没错。

那这里

为什么指标如此复杂?在我看来,有必要对画布本身进行清理。我会 在 DeleteCanvas() 方法中 添加ChartRedraw()。

是的,这样可以减少不必要的线条。我们让画布变得整洁,然后在那里进行重绘。

 

这并不是真正的方法:

//+------------------------------------------------------------------+
//|| 删除图形资源|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }

为什么要用三元运算符?- 你可以直接做啊

//+------------------------------------------------------------------+
//|| 删除图形资源|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return ObjectDelete(0,m_canvas_name);
  }

我是这样做的:

//+------------------------------------------------------------------+
//|| 删除图形资源|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   if(ObjectFind(0,m_canvas_name)>-1)
      if(ObjectDelete(0,m_canvas_name))
        {
         ChartRedraw();
         return true;
        }
   return false;
  }


但画布有自己的删除方法 CCanvas::Destroy()。

我们为什么还要添加其他东西呢?

 

我在垂直缩放方面遇到一个问题。

我想在 RTS 上制作一个刻度线图,其中 Y 轴的最大值为 97784.0,最小值为 97756.0。

我在代码中这样做了:

//--- 更新图表
double min_y=NormalizeDouble(min_pr-0.2*diff,_Digits);
double max_y=NormalizeDouble(max_pr+0.2*diff,_Digits);
ticks_ind.YMin(min_y);
ticks_ind.YMax(max_y);
ticks_ind.SetArrayValue(prices);


结果如下

https://www.mql5.com/ru/charts/7227612/rts-9-17-m1-ao-otkritie-broker

最小值显示正确,但随后出现了一些啸叫。

显然,CLineGraph::VerticalScale() 方法并不像我想象的那样经过微调,或者更糟糕的是,它不应该经过微调。

График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
  • www.mql5.com
Символ: RTS-9.17. Период графика: M1. Брокер: АО ''Открытие Брокер''. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2017.06.19 15:22 UTC.
 
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
  • www.mql5.com
Стандартная библиотека / Научные графики / CGraphic - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Anatoly,谢谢你的建议,我会使用它的。很遗憾,这个想法变成了不友好的代码...