mt5 ObjectDelete中是否有一个错误? - 页 3

 
Fernando Carreiro:
你用的是哪个版本?因为在最新的版本中,"ObjectDelete() "函数 似乎有一个可能的错误,可能在 "ObjectFind() "方面也有问题!

MT5: Build 1495 (2016年12月9日)

 
honest_knave:

MT5:Build 1495(2016年12月9日)。

我在Build 1491上运行你的代码,得到了类似的结果。

2016.12.11 12:31:05.739 test (EURUSD.m,H1)      ObjectFind took 20126 μs
2016.12.11 12:31:05.739 test (EURUSD.m,H1)      ObjectDelete took 247 μs
 
Fernando Carreiro:

我在Build 1491上运行了你的代码,得到了类似的结果。

一直很奇怪。也许有一个很好的解释...?
 
honest_knave:

这可能是语义问题,而不是一个错误。

ObjectDelete的目的是 "删除具有指定名称的对象"。

在运行该函数 的最后,图表上是否还有一个名为 "不存在的对象 "的对象?没有......那么这算不算成功?

换个角度看,ObjectDelete是否删除了一个叫做 "非存在对象 "的对象?没有......所以这是失败吗?

你是通过结果还是采取的行动来衡量成功?

如果运行该函数 后,被命名的对象仍然在图表上,也许会有一个错误的预期。否则,就是成功。

也许你说的是真的,但由于我们正在从MQL4迁移到MQL5,我们期望看到相同的结果,或者至少是一个明确写在引用的返回值中的结果。

通过这个第一个问题,我测试了ObjectMove函数,我也得到了TRUE的结果!这超出了你的解释,因为对象在最后是不可用的,所以true是正确的。

在一个不可用的对象上使用ObjectMove,它应该返回false!

moveResult=ObjectMove(ChartID(), "not available trend line",1,time[4950],low[4980])。

Print(__LINE__,"-moveResult=",moveResult)。

2016.12.11 17:22:39.367 Far-Test-ChangeTrendLine (EURUSD,H1) 44-moveResult=true

 
Farzin Sadeghi:

嗨,我正在用MQL5编写一个指标,但无论我把什么写成字符串名称,ObejectDelete都会返回真!即使在一个没有对象的空图表上也是如此


阅读对象函数 描述

这是一组函数,用于处理与任何指定图表有关的图形对象。

定义图形对象属性的函数,以及用于创建和沿图表移动对象的ObjectCreate()ObjectMove() 操作,实际上是 用于向图表发送命令。如果这些函数被成功执行,该命令就会被纳入图表事件的公共队列中。在 处理图表事件队列时,图形对象的属性的视觉变化被实现。

这意味着 "删除此对象 "的命令被成功接受。你可以通过GetLastError()控制你的命令的结果。试试吧--哪段代码被退回了?
 
Rashid Umarov:

阅读对象函数 描述

这意味着 "删除此对象 "的命令被成功接受。你可以通过GetLastError()来控制你的命令的结果。试试吧--返回的代码是什么?

我把代码改成了这样。

int ObjCount = ObjectsTotal(ChartID(),/*0=main subwindow*/0,/*all objectTypes*/-1)。

ResetLastError()。

bool deleteResult=ObjectDelete(ChartID(), "非现有对象")。

Print(__LINE__,"-",deleteResult," | ObjCount=",ObjCount," | LastError=",GetLastError() )。

这里是结果。

2016.12.12 12:38:43.373 Far-TestObjectDelete (EURUSD,H1) 38-true | ObjCount=0 | LastError=0

ERR_SUCCESS

0

该操作成功完成


所以它没有返回错误,例如它不能访问该对象。但在MT4中,它确实返回错误。

 
Farzin Sadeghi:

错了!错了!错了!错了!错了!错了!错了!错了!错了!错了

0

该操作成功完成


所以它不会返回错误,例如它不能访问该对象。但在MT4中,它确实返回错误。

好的。我发现在MQL5中,在这种情况下我们不会引发任何错误,因为这些操作是异步的。 所以你有两个选择。

  • 在删除之前自己检查 对象是否存在
  • 在任何情况下尝试删除它,不要担心对象不存在。
 
Rashid Umarov:

好的。我发现在MQL5中,在这种情况下我们不会引发任何错误,因为这些操作是异步的。 所以你有两个选择。

  • 在删除之前自己检查对象是否存在
  • 在任何情况下都尝试删除它,如果对象不存在,不要担心。
这样一来,在MQL5中检查 ObjectDelete或ObjectMove的结果就没有用了!把它固定在MQL4中的方式不是更好吗?
 
Rashid Umarov:

好的。我发现在MQL5中,在这种情况下我们不会引发任何错误,因为这些操作是异步的。 所以你有两个选择。

  • 在删除之前自己检查对象是否存在
  • 在任何情况下都要尝试删除它,不要担心对象不存在。

在这种情况下怎么会返回false?

ObjectDelete()文档说

返回值

如果删除成功,返回真,否则返回假。

文档应该更清楚,它没有说 "如果命令被接受就返回true"。

如果我们想确定一个对象是否被删除,我们将不得不检查它 删除命令 是否存在,这是不可能的。

Documentation on MQL5: Object Functions / ObjectDelete
Documentation on MQL5: Object Functions / ObjectDelete
  • www.mql5.com
Object Functions / ObjectDelete - Reference on algorithmic/automated trading language for MetaTrader 5
 
Alain Verleyen:

在这种情况下,它怎么会返回false?

ObjectDelete()文档说

文档应该更清楚,它没有说 "如果命令被接受就为真"。

我们将以这种方式进行修复

返回值

如果命令 被放置在图表事件的公共队列中 ,则返回真 ,否则返回假。