文章 "使用 CGraphic 开发库实现一个剥头皮市场深度" - 页 4

 
"Each such class has a common parent, the CNode class, which performs only one function, i.e. stores the type of the basic primitive. 
Its only protected constructor requires type specification during element creation." 

CNode 类不存储基本基元的类型,而 CEIChart 通过m_obj_type 成员存储。

感谢 Vasiliy

 

在终端的新版本中(大约从 2170 版开始),文章来源("编写剥头皮者的玻璃")出现了问题。
特别是主文件"MarketBook.mq5"在编译过程中 产生了严重错误:

事件 "--意外标记,可能类型丢失? MBookBtn.mqh 57 12

事件 " --函数 已定义且类型不同 MBookBtn.mqh 57 12

请告诉我问题出在哪里以及如何解决?


附注:现在检查了 2015 年旧文章 中的"MarketBook.mq5"。结果发现该项目也出现了同样的错误

Show' - unexpected token, probably type is missing? MBookFon.mqh 47 11
'Show' -function already defined and has different type MBookFon.mqh 47 11

 
avento:

在终端的新版本中(大约从 2170 版开始),文章来源("编写剥头皮者的玻璃")出现了问题。
特别是主文件"MarketBook.mq5"在编译过程中 产生了严重错误:

事件 "--意外标记,可能类型丢失? MBookBtn.mqh 57 12

事件 " --函数 已定义且类型不同 MBookBtn.mqh 57 12

请告诉我问题出在哪里以及如何解决?


语言在发展,要求也越来越严格。

让我们看看文件 "MBookBtn.mqh",CMBookBtn 类的声明 - 函数Event 声明为 void

//+------------------------------------------------------------------+
//|| 该类表示图形顶部的按钮,点击时
//| 显示一个带有刻度线图和订单表的面板。
//| 再次按下按钮可隐藏面板。
//+------------------------------------------------------------------+
class CMBookBtn : public CElButton
  {
private:

   CMBookArea        m_book_area;
   bool              m_showed_book;
public:
                     CMBookBtn();
   void              SetMarketBookSymbol(string symbol);
   void              Refresh();
   void              Event(int id,long lparam,double dparam,string sparam);
   void              Clear(void);
   virtual void      OnShow(void);
  };

现在我们看看类中的函数本身:

函数已经定义,且类型不同

第二个错误显示:"'Event' - 函数已定义且 类型不同 MBookBtn.mqh 57 12"--也就是说,函数被声明为 void 类型,而这里却没有指定类型。


解决方法

//+------------------------------------------------------------------+
//|| 拦截鼠标对按钮的点击。如果按钮在
//| 点击处于按下状态 - 显示面板。如果处于 || 状态
//| 向下按 - 隐藏面板|
//+------------------------------------------------------------------+
void  CMBookBtn::Event(int id,long lparam,double dparam,string sparam)
  {

- 只需 在类主体中的函数前添加 void 即可


现在编译 ...Indicators\MarketBookArticle\MarketBook.mq5 - 没有错误,运行它:玻璃正常工作。

 
Lucas:
当我复制并粘贴整段代码进行编译时,编译出错。有人知道解决办法吗?

卢卡斯,如果错误与 CMBookBtn 类中的意外标记 有关,那么在调用 CMBookBtn::Event 函数时必须在前面加上void


这就是我们目前遇到的情况。

 
弗拉基米尔-卡尔普托夫 非常感谢你如此详尽的答复!
 

嗨,瓦西里,感谢您的美文。我是 MQL5 领域的新手,在尝试本地运行您的代码时遇到了难题。我相信这是一个非常愚蠢的问题,但我无法解决它

当我尝试从 MarketBook.mq5 中编译您的代码时,出现了如下错误。

您能帮我解决这个问题吗?

 
这就是我遇到的错误。您能帮帮我吗?
附加的文件:
Error.jpg  365 kb
 

您好。

请问是否可以在 MarketBook.mqh 类中固定--记住找到的指数的时间?

void Calculation(void)
   {
      // 为请求方
      int begin = (int)m_book.InfoGetInteger(MBOOK_LAST_ASK_INDEX);
      int end = (int)m_book.InfoGetInteger(MBOOK_BEST_ASK_INDEX);
      //m_ask_best_index
      for(int i = begin; i <= end && begin !=-1; i++)
      {
         if(m_book.MarketBook[i].volume > m_max_ask_volume)
         {
            m_max_ask_index = i;
            m_max_ask_volume = m_book.MarketBook[i].volume;
         }
         m_sum_ask_volume += m_book.MarketBook[i].volume;
      }
      // 投标方
      begin = (int)m_book.InfoGetInteger(MBOOK_BEST_BID_INDEX);
      end = (int)m_book.InfoGetInteger(MBOOK_LAST_BID_INDEX);
      for(int i = begin; i <= end && begin != -1; i++)
      {
         if(m_book.MarketBook[i].volume > m_max_bid_volume)
         {
            m_max_bid_index = i;
            m_max_bid_volume = m_book.MarketBook[i].volume;
         }
         m_sum_bid_volume += m_book.MarketBook[i].volume;
      }
      m_calculation = true;
   }

在这个方法中,我们要找到 Ask 和 Bid 两边最大成交量 所在的价格指数。

我还想知道我们是在什么终端时间得到这个指数的。


堆栈结构

struct MqlBookInfo 
  { 
   ENUM_BOOK_TYPE   type;            // 来自 ENUM_BOOK_TYPE 枚举的请求类型 
   double           price;           // 价格 
   long             volume;          // 音量 
   double           volume_real;     // 音量更准确 
  };


给了我们 4 个参数,但其中没有时间。


谁能告诉我如何记住找到的指数的时间?

 
Konstantin Seredkin:

你好

请告诉我,是否有可能在 MarketBook.mqh 类中记住找到索引的时间?

在这个方法中,我们要找到 Ask 和 Bid 方最大成交量 所在的价格指数。

我还想知道我们是在什么终端时间得到这个指数的。


玻璃的结构


为我们提供了 4 个参数,但它没有时间。


有人能告诉我如何记住找到的索引的时间吗?

继承该结构并添加一个附加字段,在填写时添加刻度时间

 
Konstantin Seredkin:

你好

请告诉我,是否有可能在 MarketBook.mqh 类中记住找到索引的时间?

在这个方法中,我们要找到 Ask 和 Bid 方最大成交量 所在的价格指数。

我还想知道我们是在什么终端时间得到这个指数的。

玻璃的结构

为我们提供了 4 个参数,但其中没有时间。

谁能告诉我们如何记住找到的时间索引?

没有时间,因为无法学习 MQL5 中报价到达的时间。最多只能记住 OnBookEvent 事件到达时刻的时间,因此请记住它。记住找到堆栈顶部的时间也毫无意义,您需要的是价格堆栈的到达时间,而不是找到其最大索引的时间。