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

 
Konstantin Seredkin:

我在问题中写的字难道没有任何意义吗?

您的示例

该代码由该主题的作者在类https://www.mql5.com/zh/articles/3336 的描述中发布。

所以这个问题至少不应该向我提出...

这些话对我来说没有任何意义,只有一点--你没有研究过这个例子的代码。

您给出了一个通过以下方式删除的示例

m_book_market.SetMarketBookSymbol(Symbol())

如果我们打开这个方法,就会看到一个订阅传递的股票。

bool CMarketDepth::SetMarketBookSymbol(string symbol) {
   m_sell_deals = 0;
   m_buy_deals  = 0;
   ArrayResize(market_book, 0);
   m_available = false;
   m_best_ask_index = -1;
   m_best_bid_index = -1;
   m_depth_total = 0;

   bool _selelect = SymbolSelect(symbol, true);
   if(_selelect)
      m_symbol = symbol;
   else {
      if(!SymbolSelect(m_symbol, true) && SymbolSelect(Symbol(),true))
         m_symbol = Symbol();
   }

   if(_selelect)
      if(!MarketBookAdd(m_symbol))
         printf("%s - %d: [ %s ] 无法打开玻璃!!", __FUNCTION__, __LINE__, m_symbol);

   this.Refresh();
//---
   return _selelect;
}

但不是订阅删除 )) 订阅删除是通过函数完成的:

MarketBookRelease

Обеспечивает закрытие стакана цен по указанному инструменту, а также отменяет подписку на получение извещений об изменении указанного стакана.

bool  MarketBookRelease(
   string  symbol      // 字符名
   );

Параметры

symbol

[in]  Имя символа.

Возвращаемое значение

Значение true в случае успешного закрытия, иначе false.

Примечание

Обычно эта функция должна вызываться из функции OnDeinit() в том случае, если в функции OnInit() была вызвана соответствующая функция MarketBookAdd(). Либо должна вызываться из деструктора класса, если в конструкторе этого класса вызывается соответствующая функция MarketBookAdd().
 
TheXpert:

一定是复制粘贴。就是这样。作者可能在浏览器中编写了部分代码。

而不是

CMarketBook MarketBook.mqh

写入

CMarketBook MarketBook;

这是给你的同名人出的一个难题 )) 他不喜欢读代码,而是等待现成的答案 ))

 
Konstantin:

这对我的同名人来说是个棘手的问题 )) 他不喜欢读代码,而是等待现成的答案 ))

这正是我一直在做的事情,最初我是按照你的示例来移除玻璃的,这实际上是在使用帮助中的玻璃时所需要的。

但当我使用这种方法时、

if(!MarketBookRelease(Symbol()))
   {
   if(Debug){Print("Error MarketBookRelease ",m_symbol.Name());}}

会出现以下错误


P|S发现了问题所在,原来如果在类的构造函数中使用了这个方法,就没有必要在OnDeinit中使用它。


我收回我的问题,你可以给我一颗糖。

 
Konstantin Seredkin:

如果不在类中使用析构函数

该构造正常工作

但也许我只是不知道如何使用析构函数,或者析构函数的实现方式有问题,因此不能正常工作。

订阅函数是广播式的,它保证在 OnDeinit 时删除所有订阅,如果代码中对象过多且删除延迟,则可能没有足够的时间分配给 OnDeinit 处理,这意味着某些对象不会被删除。

在这种情况下,你可以寻找代码中的问题,这是更正确的做法,因为问题显然存在,而且总有一天会让你吃不了兜着走;或者直接在 OnDeinit 中删除它们,然后忘掉它。

ps.

Konstantin Seredkin:

我一直都是这么做的。

很明显,你没有解析这个示例,或者你从一开始就写了一段错误的代码,比如,把它拆开,我会笑的 ))

有了这样一个对象CMarketBook MarketBook.mqh编译器 就能编译代码了吗? 你创建了一个 对象 MarketBook .mqh编译器忽略了这一亵渎,但你在 使用对象 MarketBook 时,在OnInit阶段会出现错误,因为你 没有这样一个对象。我立刻注意到了这一点,因为这个示例显然是行不通,所以我问了你一个问题,但你尽职尽责地把一切都归咎于类的开发者和他的示例....

要么提供一个可以重现这个错误的工作代码示例,要么像你现在这样一次性解释清楚所有问题,而不需要多余的代码,这样你也可以节省时间。

Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
Использование аналитических объектов - Графики котировок, технический и фундаментальный анализ - MetaTrader 5
  • www.metatrader5.com
Определение трендов, построение каналов, выявление циклов и уровней поддержки/сопротивления — все эти и многие другие задачи решаются при помощи аналитических объектов. Всего в торговой платформе доступно 46 таких инструментов. Среди них имеются геометрические фигуры, различные каналы, инструменты Ганна, Фибоначчи, Эллиотта и многое другое. В...
 
Konstantin:

订阅函数是广播式的,它保证在 OnDeinit 时删除所有订阅,如果代码中的对象过多,且删除延迟,则可能没有足够的时间分配给 OnDeinit 处理,这意味着有些对象不会被删除。

在这种情况下,你可以在代码中查找问题(这是比较正确的做法,因为很明显存在问题,而且总有一天会给你带来麻烦),或者直接在 OnDeinit 中删除它们,然后忘掉它。

ps.

你显然没有解析这个示例,或者从一开始就写了一段错误的代码,好像你想让我取笑它似的 )).

有了这样一个对象CMarketBook MarketBook.mqh编译器 就能编译代码了吗? 嗯,你创建了一个对象MarketBook .mqh编译器错过了这一亵渎,但你 使用的是对象 MarketBook,在 OnInit 阶段会出现错误,因为你没有创建这样一个对象,我马上就给了你。我立刻注意到了这一点,因为这个例子显然是行不通,所以我问了你一个问题,但你尽职尽责地把一切都推卸给了类的开发者....

你要么提供一个可以重现这个错误的工作代码示例,要么就像现在这样一次性解释清楚所有内容,而不需要多余的代码,这样你也可以节省时间。

你只是在故弄玄虚,我才不管作者在示例中做了什么,犯了什么错误,你必须是个彻头彻尾的白痴才会意识不到这只是个错误。

问题完全不同。

在他的示例中,有初始化--调用玻璃,然后通过 Refresh() 方法更新,但没有通过

MarketBookRelease

//+------------------------------------------------------------------+
//|MarketBook.mq5
//| 版权所有 2017, MetaQuotes Software Corp.
//|http://www.mql5.com | |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots 0
#include "GlobalMarketBook.mqh"
#include "MBookBtn.mqh"
#include "EventNewTick.mqh"

CMBookBtn MButton;
CEventNewTick EventNewTick;
double fake_buffer[];
//+------------------------------------------------------------------+
//| 自定义指示器初始化函数
//+------------------------------------------------------------------+
int OnInit()
  {
   MarketBook.SetMarketBookSymbol(Symbol());
//--- 指示器缓冲区映射
   SetIndexBuffer(0,fake_buffer,INDICATOR_CALCULATIONS);
// 如果用户更改了面板运行的图表、
// 您需要隐藏然后重新打开面板。 
   MButton.Hide();
   MButton.Show();
//---
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| MarketBook 更改事件|
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
   if(symbol!=MarketBook.GetMarketBookSymbol())
      return;
   MarketBook.Refresh();
   MButton.Refresh();
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| 图表事件|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // 事件标识符 
                  const long& lparam,   // 长类型事件参数
                  const double& dparam, // 事件参数为双类型
                  const string& sparam  // 字符串类型的事件参数
                  )
  {
   MButton.Event(id,lparam,dparam,sparam);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
//| 自定义指标迭代函数
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
//--- 为下一次调用返回 prev_calculated 的值
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| 删除|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   MButton.Hide();
   if(!MarketBookRelease(Symbol()))
   {
   Print("Error MarketBookRelease ",Symbol());}
  }
//+------------------------------------------------------------------+

OnDeinit 或相同的实现来删除,而是在类的析构函数中。

这就是为什么我问作者一个问题,在他看来使用他的类杀死玻璃杯更正确,因为在主要示例和类本身中都缺少这项工作,如果能在之前实现就好了,我并不是说有什么不好等,只是在我看来缺少了这一点。

我的问题是向作者提出的,而且是正常提出的,为什么要问和讨论我的问题,并喋喋不休地说我读了什么,我想从谁那里得到什么等等。我自己能够理解我代码中的一切,这正是我所做的....。问题完全不同。

在代码的上方,我用黄色添加了在我看来应该出现在所附指标中的内容。

 
Konstantin Seredkin:

你只是在故弄玄虚,我不管作者在例子中做了什么,印错了什么,你必须是个彻头彻尾的白痴,才会意识不到这只是个错别字。

问题完全不同。

在他的例子中,有初始化--调用 glass,然后通过 Refresh() 方法更新,但没有通过

OnDeinit 或相同的实现来删除,而是在类的析构函数中。

这就是为什么我问作者一个问题,在他看来,使用他的类杀死玻璃是更正确的做法,因为在他的主要示例和类本身中都缺少这项工作。

问题是向作者提出的,也是正常的,为什么要花几页纸来询问和讨论我的问题和蛊惑人心的东西,比如我读到了什么,我想从某人那里得到什么,等等。问题完全不同

在上面的代码中,我用黄色添加了在我看来应该出现在所附指标中的内容。

这里没有 "心灵感应",您在原始问题中给出的示例并没有重现您所写的问题,此外,所有机制都存在于类中,解决方案已提供给您,但我只看到了责难,争议已结束。

 
Konstantin:

这里没有心灵感应者,你在原问题中举的例子也没有再现你所写的问题,此外,所有的机制在课堂上都存在,解决办法也给了你,但我除了责备之外什么也没看到,争论已经结束了。

- 首先,我的问题中根本没有问题。

- 其次,我并没有责备任何人,我只是向作者提出了一个简单的问题,以澄清我的猜测......而你在每条信息中都对我的代码提出了一些可笑的指责和问题,而这些代码根本不是我写的,而是以文章中对该类的描述为例。

帮助中说

析构 函数是一个特殊函数,当一个类的对象被销毁 时会自动调用。析构函数的名称写成类名,并加上斜杠(~)。无论是否存在析构函数,字符串、动态数组和需要去初始化的对象都会被去初始化。如果存在析构函数,这些操作将在调用析构函数后执行。

该类中没有析构函数会关闭价格玻璃的方法

MarketBookRelease

此外,在指标本身的

void OnDeinit(const int reason)

中也没有,我被问到一个简单的问题--如何正确地使价格玻璃去初始化

我希望得到这个问题的答案、

- 不要发明任何东西,类本身会关闭一切,即使类中没有声明析构函数。

- 添加

void OnDeinit(const int reason)
  {
   if(!MarketBookRelease(Symbol()))
   {Print("Error MarketBookRelease ",Symbol());}
  }

或者在类中添加一个析构函数。

public:
    ~CMarketBook(void);
//--
//--

CMarketBook::~CMarketBook(void)
{
   if(!MarketBookRelease(m_symbol)){
   printf(__FUNCTION__ + "Error MarketBookRelease ",m_symbol);} 
}

你会很高兴的......然后你就开始大放厥词,指责我在别人的代码中写了一些错误的地方,说我的代码无法编译,这一点我不用你也知道,我读不懂....。在俄语中,你把我当成了一只鹿。

 
完美 !非常  完美!干得好
 
MetaQuotes Software Corp.:

新文章《使用 CGraphic 库实施市场深度扫描》已发布:

作者: Vasiliy Sokolov瓦西里-索科洛夫

谢谢,这是个很棒的工具,非常容易修改。

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