mql5语言的特点、微妙之处以及技巧 - 页 239

 
Anatoli Kazharski #:

如何确定某个符号是否有数据,以便在没有数据时不会将其留在 [Market Watch] 窗口中?

SymbolInfoTick.

 
fxsaber #:

SymbolInfoTick.

我试过这个选项。不幸的是,它不起作用。如果一个符号首次添加到[Market Watch]窗口,它还没有数据,SymbolInfoTick 就会返回空值。

我还测试了CopyXXX 函数,但它们没有超时,等待服务器数据的过程持续了大约 45 秒,时间太长了。

我需要一种快速方法来确定某个字符是否不可用。我指的是这样的情况:


//---

这种符号在服务器上没有数据,需要一种方法来识别它们,这样它们就不会被添加到[市场总览]窗口,或者如果被添加到[市场总览]窗口,也不会从列表中移除。

附注:也许有某种方法可以取消从[ 市场观察]窗口列表中删除符号的锁定?

 
Anatoli Kazharski #:

我试过这个选项。不幸的是,它不起作用。如果一个符号首次添加到 [Market Watch] 窗口,它还没有数据,SymbolInfoTick 返回空值。

通过手动操作很容易获得有效的符号。

  1. 点击几下即可将所有符号添加到市场观察窗口。
  2. 几秒钟后,就能收到这些符号上的刻度。
  3. 单击鼠标即可按时间排序。
  4. 使用 Del 键删除所获列表中的一个尾部。
所有这些操作最多需要半分钟。
 
Anatoli Kazharski #:

我试过这个选项。不幸的是,它不起作用。如果一个符号首次添加到 [Market Watch] 窗口,它还没有数据,SymbolInfoTick 返回空值。

我还测试了CopyXXX 函数,但它们没有超时,等待服务器数据的过程持续了大约 45 秒,时间太长了。

我需要一种快速方法来确定某个字符是否不可用。我指的是这样的情况:


//---

这些符号在服务器上没有数据,需要一种方法来识别它们,以便它们不会被添加到[市场观察]窗口中,或者如果被添加到窗口中,也不会从列表中移除。

附注:也许有办法取消从[市场 观察]窗口列表中删除符号的锁定?

我已经为这个问题困扰了大约 6 年,我请求开发人员把这里的事情处理得井井有条。

遗憾的是,这个问题一直没有得到解决,目前,当任何人第一次访问金融工具时,都会出现终端挂起的情况。

 
Anatoli Kazharski #:

如何确定某个符号是否有数据,以便在没有数据时不会将其留在 [Market Watch] 窗口中?

我在一个循环中使用这种检查:

在此之后当 Expert Advisor 处于图表上时, 我无法手动将符号从[Market Watch]窗口中逐个或一次全部 删除:


尝试检查最后一次报价的时间。

SymbolInfoInteger(name, SYMBOL_TIME);

如果为 0,则没有数据。

我刚刚通过打开的图表进行了检查。

2024.01.05 10:38:43.783 !00 (GBPUSD,H1) USDCAD 2024.01.05 09:38:51
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) NZDUSD 2024.01.05 09:38:51
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) USDCAD 2024.01.05 09:38:51
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) EURGBP 2024.01.05 09:38:49
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) GBPUSD 2024.01.05 09:38:49
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) POZ3 1970.01.01 00:00:00
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) EDH4 1970.01.01 00:00:00
2024.01.05 10:38:43.783 !00 (GBPUSD,H1) BRZ3 1970.01.01 00:00:00
 
可以通过在服务器之间切换来获取更多数据。我不知道这是否可以通过代码来实现。
 
Nauris Zukas #:
通过在服务器之间切换可以获得额外的数据。我不知道是否可以通过代码来实现。

如果你说的 "服务器之间 "是指 "经纪商之间",那么几乎不可能,除非你尝试使用配置文件。

但如果我真的需要在一个经纪商的不同服务器之间切换(Open 有很多服务器,Finam 有两个),我会通过 iptables/nftables 和我的 bash 脚本来实现。但对我来说这更容易,因为我用的是 Linux。

 
JRandomTrader #:

如果 "服务器之间 "是指 "经纪人之间"。


.

 
Nauris Zukas #:


是的,原则上是可以的。

但是,由于无法从 MQL 程序中找出服务器的名称和 IP 地址,您必须通过切换服务器并检查连接到哪个 IP 地址来手动找出它们。

然后可以更改防火墙配置,禁止连接到某些服务器(这里需要重新劫持数据包,而不是丢弃数据包以避免超时),迫使 MT 切换到另一个服务器。

再说一遍,在 Linux 下做到这一点并不难,但我无法想象在 Windows 下如何做到这一点。

 
Alexey Viktorov #:

试着查看最后一次引用的时间。

如果为 0,则没有数据。

我刚刚根据开放图表进行了检查。

这也适用于类似情况:

我试过这个选项。不幸的是,它并不适合。如果一个符号是第一次添加到 [Market Watch] 窗口,那么它还没有数据, SymbolInfoTick 返回的值为空

如果勾选很少出现,所有此类符号都将被排除。

fxsaber#:

手动获取工作符号很容易。

  1. 点击几下即可将所有符号添加到市场观察中。
  2. 几秒钟后就会收到这些符号的刻度。
  3. 单击鼠标即可按时间排序。
  4. 使用 Del 键删除所获列表中的一个尾部。
所有这一切最多需要半分钟。

不,您需要的是全自动。

弗拉基米尔-帕斯图沙克#:

我已经和这个问题斗争了 6 年,我要求开发人员把秩序放在这里。

不幸的是,这个问题并没有得到解决,目前还存在这样的情况:当任何人第一次访问金融工具时,终端就会挂起。

我只是在调用以下函数时才注意到这个问题:

  • Bars()
  • iBars()
  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_BARS_COUNT)

//---

终端开发人员

1. 排除在交易服务器上添加无数据符号的可能性。

2.2. 使[市场观察]窗口中的符号删除阻止功能失效,如果是错误,则进行修复。现在只能通过重启终端来实现。

3.3. 对于CopyXXX 等功能,增加一个可选参数,用于设置超时(从服务器等待数据的最长时间)。

我现在无法重现这个问题。到目前为止,它能正常工作,没有延迟。但似乎在某些情况下会出现这种情况。

4. 修复在下列情况下使用Bars()、iBars()、SeriesInfoInteger(symbol, PERIOD_M1, SERIES_BARS_COUNT) 函数时出现的无限等待错误:

  • 与服务器无连接
  • 符号上无数据

试图从图表中删除程序可能会导致终端挂起数分钟。

5.5. 修复了在未连接服务器的情况下使用函数时出现的无限等待错误:

  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_FIRSTDATE)
  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_LASTBAR_DATE)
  • SeriesInfoInteger(symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE)

在这种情况下,您还可以添加一个额外的可选参数来设置超时(从服务器等待数据的最长时间)。

//---

附注:到目前为止,我已经确定了使用CopyXXX 等函数检查数据的变体。但我会观察上述问题是否会再次出现。