来自一个 "傻瓜 "的问题 - 页 162

 
Karlson:
DBL_MAX 将在那里。
:-)
 

为什么残缺的南德不回来了,尽管残缺已经被移除?

   int       indicator_handle=iCustom(
   NULL,
   PERIOD_CURRENT,
   "Examples\\ZigzagColor"
   );
   Print(indicator_handle);
   bool  a=IndicatorRelease(
   indicator_handle//,
   );
   Print(a);
   Print(indicator_handle);

第一次打印是10,第二次打印是真的,第三次打印又是10。一分钟放一单--还是10单。

我认为它应该是-1(INVALID_HANDLE)。我想错了吗?

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Прочие константы - Документация по MQL5
 
Silent:

为什么残缺的南德不回来了,尽管残缺已经被移除?

第一次打印是10,第二次打印是真的,第三次打印又是10。一分钟放一单--还是10单。

我认为它应该是-1(INVALID_HANDLE)。我是不是想错了?

被删除的指标不会立即被物理删除,而是在暂停后(也许是几分钟),以防同一程序或其他程序重新打开它们(缓存选项)。

在大多数情况下,这是很方便的。 只有在循环读取一大组指标的缓冲区(大到不能一次全部装入内存)时才会出现问题。

//只有在这种情况下,在程序中释放指标才有意义。

//所有其他使用IndicatorRelease()函数的变体都是 "错误的",因为指标在工作完成时被释放了。

因此,悖论是:这个功能是无用的,因为缓存完全扼杀了所有符合要求的用例。

在这种情况下,雷纳特曾经表示承诺要做一个 "瞬间释放 "的变体,但显然他仍然很忙。;)

--

这算是答案的第一部分(没有这部分,第二部分就无法理解了)。

而现在关于INVALID_HANDLE。在我看来,释放动态对象的函数,以及删除操作符,并没有给指针本身分配INVALID_HANDLE 这个值;它们只是删除句柄所指向的对象。只有内存分配函数(new操作符也是如此)在失败的情况下才会强行给指针分配INVALID_HANDLE 值,所以检查指针有效性的正确方法是CheckPointer() 函数,它实际上是通过系统的句柄表寻找一个对象,如果找到对象则返回句柄类型,如果没有则返回0。

希望现在处理指针(句柄)的逻辑更清楚一点。以及你的例子中的结果。那里的一切都正确:指标是一个组访问对象,它在第一次吹口哨时没有被物理删除(所以即使是CheckPointer() 也会返回非零),更不用说希望在将指针变量传递给IndicatorRelease()后在指针变量中获得INVALID_HANDLE 值的故障了

 

MetaTrader 5中的订单、头寸和交易 这篇文章中举了一个例子:"每个交易都是基于一个特定的订单,但一个订单可以产生多个交易例如,一个买入10手的订单可以通过几个连续的交易来执行部分执行"。我的理解是,如果我想建立一个例如10手的头寸,那么在历史上可能会出现几个交易。在我的策略中,1和2的位置在同一方向,我的专家顾问(MT4)以1.0手开仓,然后第三手,然后2.0手。在MT5中,可能会出现在历史上打开第一个头寸的情况,例如出现2个或多个交易。2个或更多的交易可能出现在历史上。当希望打开第2个位置时,专家顾问将滚动浏览历史,发现它将是第3个位置。而且它将打开错误的地段。这有点让人讨厌。

也许有人知道如何解决这个问题或给我一个链接。

 
MetaDriver:

谢谢你,这正是你所需要的。

// nelp by nelp for dummies - 这就是文章中需要的内容。

 

我试图创建一个指标,使用两个不同的时间段,例如M5(屏幕上的当前时间段)和H1。如何在这些不同的时间段内实现价格同步?例如,当在M5上计算指标的最后值时,我想自动从同一时间的H1抽出价格(即ArraySetAsSeries后两个时间段的零条对应于当前的最后时间,如OnTick,但不是屏幕上的最新条)。 如果没有这种可能性,我们应该手动检查条形时间,我们应该为指标添加一个同步函数,如onTick。

我已经尝试在测试器中进行测试--这是件好事。为什么最后的计算值没有保存在屏幕上?

 
gpwr:

我试图创建一个指标,使用两个不同的时间段,例如M5(屏幕上的当前时间段)和H1。如何在这些不同的时间段内实现价格同步?例如,当在M5上计算指标的最后值时,我想自动从同一时间的H1抽出价格(即ArraySetAsSeries后两个时间段的零条对应于当前的最后时间,如OnTick,但不是屏幕上的最新条)。 如果没有这种可能性,我们应该手动检查条形时间,我们应该为指标添加一个同步函数,如onTick。

我已经尝试在测试器中进行测试--这是件好事。为什么以前的计算值没有保存在指标中?

使用函数CopyXXXX()的其中一个重载

调试时,要检查数据是按哪个方向复制的(如果复制的数据超过1个)。

Обращение по начальной дате и количеству требуемых элементов

int  CopyRates(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   datetime         start_time,        // с какой даты
   int              count,             // сколько копируем
   MqlRates         rates_array[]      // массив, куда будут скопированы данные
   );
 
 
Urain:

使用CopyXXXX()的其中一个重载

调试时,要检查数据是按哪个方向复制的(如果复制的数据超过1个)。

明白了。谢谢你。
 

你好!

请告诉我在前一天的当前分钟图表上绘制最大和最小值的指标代码?

SPS!

 

好久不见了=)。

比方说。有一些时间点。例如,D'03.07.2005 13:48:12'。

我怎样才能找出包括这个时间段在内的(某个时期的)酒吧的时间?

如果有一个类似的功能就好了。

datetime УзнатьВремяБараПоВремениПользователя (datetime времяПользователя, ENUM_TIMEFRAMES периодБаров) 

...而且,如果当时没有交易,它将返回一个负值。

嗯,吐出来吧,有这样的功能吗?