错误、漏洞、问题 - 页 2796

 
Mihail Matkovskij:

你在这个论坛上就没有别的事情可做吗,阿列克谢,除了歪曲我的帖子,让它们看起来像是代表我向开发商提出的要求...?我想知道你如此奇怪的 "热情 "的原因是什么?你宁可在适当的主题中帮助新手解决问题,而不是在这里胡作非为......!

但是,你还是清楚地写了 "错误"。这表明平台上有一个报告的缺陷,而不是说你没有把文件读到逻辑上的结论。

 
Artyom Trishkin:

但是,你还是清楚地写了 "错误"。这表明平台上有一个报告的缺陷,而不是说你没有把文件读到逻辑上的结论。

嗯,是的,我做到了。我读了ObjectDelete函数 描述中的说明,但不认为这是问题所在......谁不知道呢...

但这一切都在绕圈子。更确切地说,是在兜圈子,说我写错了,或者说是混在一起了......但由于某些原因,没有人说过如何解决这个错误......。当然,除了建议的ObjectsDeleteAll函数,我将不得不重做整个项目,这是我最不想看到的

 
Mihail Matkovskij:

是的,我弄糊涂了。我读了ObjectDelete函数 描述中的说明,但我认为这不是问题所在......。谁不这样做呢?

它发生了...

 

Mihail Matkovskij:

...由于某些原因,没有人说过如何解决这个bug...当然,除了建议的ObjectsDeleteAll函数,我将不得不重做整个项目,这是我最不想看到的

尽量在图形对象的名称中使用前缀--这是识别对象的正常做法。使用前缀来检查垃圾,并同时清除垃圾。

在对象名称中添加前缀需要重做整个项目

你是以程序化的方式写作吗?好吧,在那里改变创建对象名称的功能也不是那么难。

 
Artyom Trishkin:

尽量在图形对象的名称中使用前缀--这是识别对象的正常做法。使用前缀来检查垃圾,并同时清除垃圾。

为对象名称添加前缀需要重做整个项目?

好吧,如果没有其他选择,我就试试。

阿尔乔姆-特里什金

你是以程序化的方式写作吗?改变创建对象名称的函数并不难。

一个西西弗的任务?:)


感谢拉希德-乌马罗夫 帮助我找到指标错误的原因!
 
Mihail Matkovskij:

你在这个论坛上就没有别的事情可做吗,阿列克谢,除了歪曲我的帖子,让它们看起来像是代表我向开发商提出的要求...?我想知道你如此奇怪的 "热情 "的原因是什么?你宁可在适当的主题中帮助新手解决他们的问题,而不是在这里胡作非为...!

这就是我试图帮助你的原因。我是想帮助你,解释你的错误。试试另一个删除图形对象 的选项,一切都会好起来。而你所说的所有虫子都会消失。你不必扭曲你的话,我会引用你的话。

 
Alexey Viktorov:

这就是我试图帮助你的原因。我正在向你解释你的错误之处。尝试另一个选项,删除图形对象,一切都会好起来。而你所说的所有虫子都会消失。没有必要歪曲你的话,你说了,我引用了。

我想帮助你,同时无端指责,别忘了补充。我问是什么促使你有如此狂热的热情,但由于某些原因,你没有回答我!你为什么要回避答案呢,阿列克谢?

 
Mihail Matkovskij:

我在努力帮助你的同时,也在毫不掩饰地指责你,别忘了补充。我问是什么原因导致了这种狂热的热情,但由于某些原因,你没有回答我!你为什么要逃避回答呢,阿列克谢?

你早就应该闭嘴了,我也不会继续。

这里是我坦率的尝试,没有任何指责的暗示。

这是一个关于交易、自动交易系统和交易策略测试的论坛。

错误、虫子、问题

Alexey Viktorov, 2020.07.11 17:12

循环的持续时间怎么会超过执行OnDeinit所需的时间?

毕竟,你的例子中的所有对象都有 "趋势 "前缀,为什么不使用它而拒绝循环呢?

int  ObjectsDeleteAll(
   long           chart_id,   // идентификатор графика
   const string     prefix,   // префикс имени объекта
   int       sub_window=-1,   // индекс окна
   int      object_type=-1    // тип объекта для удаления
   );

答案是什么呢?阅读你的答案。
 
Alexey Viktorov:

你早就该闭嘴了,我也不会继续。

А...这就是对我的指控的原因!我明白了...:)

Alexey Viktorov:
你有什么反应?阅读你的答案。

一切都在那里。唯一的问题是,我最初拒绝使用这一功能。而且这一定让你很尴尬。好吧,我很抱歉,那么...:)

 

在你的例子中首先替代了ObjectDeleteAll函数

//+------------------------------------------------------------------+
//|                                           DeleteChartObjects.mq5 |
//|                                      Copyright 2020, © Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, © Cyberdev."
#property version   "1.00"
#property indicator_chart_window

#property indicator_plots 0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

#include <ChartObjects\ChartObjectsLines.mqh>
#include <Arrays\ArrayObj.mqh>

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- input parameters
input int      nBars = 100000;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int customN_Bars = 0;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
CArrayObj listOfTrendLines;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  int totalBars = iBars(NULL, PERIOD_CURRENT);
  customN_Bars = (nBars < totalBars) ? nBars : totalBars;
//---
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]
) {
  CChartObjectTrend * trend;
  int delta = rates_total - customN_Bars;
  int shift;
  int i;
  for(i = 0; i < customN_Bars; i++) {
    shift = delta + customN_Bars - i - 1;
    trend = new CChartObjectTrend();
    if(trend.Create(0, "trend"+(string)i, 0, time[shift], low[shift], time[shift], high[shift]))
      listOfTrendLines.Add(trend);
    else
      delete trend;
  }
  return(rates_total);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  
  ObjectsDeleteAll(0, "trend", 0, OBJ_TREND);
  
  CChartObjectTrend * trend;
  
  int i = listOfTrendLines.Total() - 1;
  for(; i >= 0; i--) {
    trend = dynamic_cast <CChartObjectTrend *> (listOfTrendLines.At(i));
    
    if(CheckPointer(trend) == POINTER_INVALID)
      continue;
    
    delete trend;
  }
}
//+------------------------------------------------------------------+

然后进入指标。

Artyom Trishkin:

为对象名称添加前缀需要重做整个项目?

事实证明,在我的 项目 使用ObjectDeleteAll 很容易。要删除所有的对象,我只需要改变3次前缀,并调用ObjectDeleteAll 3次。该图表因此而清晰。MQL5语言有很多微妙之处。但同时,它又是一种非常周密的语言。

感谢所有帮助我解决这个问题的人!

原因: