文章 "在 MetaTrader 5 中实施多货币模式" - 页 3

 
Lizar:

十六进制逻辑在任何地方都是一样的。您可以在这里 了解数字系统。在这里,您可以阅读有关位置数字系统的内容,还可以参考 16 进制和二进制。那里还有更多系统间转换的例子。

所有位操作都适用于二进制系统。关于 MQL5 中的位操作,请参见此处

当你已经知道自己在说什么时,阅读这些文章会很有帮助:)

例如,您在枚举中使用了前缀 "0x"。据我所知,这意味着写的是十六进制数,而表达式"(flag_event & CHARTEVENT_NEWBAR_M1)!=0"使用的是 "比特 AND "操作。您写道,位操作是针对二进制系统的。那么 & 运算符(用于二进制系统)与十六进制数有什么关系?

另一个问题:如果我理解正确,表达式"(flag_event & CHARTEVENT_NEWBAR_M1)!=0"等同于表达式"flag_event !"= CHARTEVENT_NEWBAR_M1"。是这样吗?如果是这样,为什么要使用位运算?

 

Вы же пишите, что побитовые операции предназначены для двоичной системы

反正 CPU 内的数字都是二进制的。

因此,即使您在脑海中 "看到 "255 或 FF,并将其与 8 或 0x00000100 进行比较,也不会有任何区别。


耶德尔金

还有一个问题,如果我理解正确的话,表达式"(flag_event & CHARTEVENT_NEWBAR_M1)!=0"等同于表达式"flag_event !"= CHARTEVENT_NEWBAR_M1"。是这样吗?如果是这样,为什么要使用位运算?

是的,在这种情况下正是这个意思,但位运算的应用范围更广,而且比单纯的比较运算更通用,尤其是在处理常量时使用位运算已成为一种经典行为。
 
sergeev:

反正 CPU 内的数字都是二进制的。

因此,即使您在脑海中 "看到 "255 或 FF,并将其与 8 或 0x00000100 进行比较,也不会有任何区别。

区别在于术语。但我从你的话中了解到,这对程序员来说并不重要。

sergeev:

是的,在这种情况下正是这个意思,但位运算的应用范围更广,比单纯的比较更通用,尤其是在处理常量时使用位运算已经成为一种经典行为。

我明白了!那么,如果我对位运算有点不熟悉,我就可以放心地使用比较运算符重写表达式了吗?谢谢您的解释!

 
Yedelkin:

当你已经知道文章的内容时,再读这些文章就很不错了:)

例如,您在枚举中使用了前缀 "0x"。据我所知,这意味着写的是十六进制数,而表达式"(flag_event & CHARTEVENT_NEWBAR_M1)!=0"使用的是"比特 AND 运算"。您写道,位操作是为二进制系统准备的。那么 & 运算符(用于二进制系统)与十六进制数字有什么关系?

所有这些系统只是以不同的方式直观地表示数字,因此如果一个数字是十,那么它在任何地方都是十。对于计算器来说,所有的数字,不管我们用什么系统来写,都要转换成二进制。即使是我写的这些字母,也会转换成二进制。在其他系统中,给数字贴标签主要是为了提高清晰度或出于习惯。有些人这样做是为了看起来更聪明。在这种情况下,使用十六进制数字是为了书写紧凑,嗯,也是为了更清晰。当你知道十六进制数是如何形成的时候,你就会明白了。

另一个问题:如果我理解正确的话,表达式"(flag_event & CHARTEVENT_NEWBAR_M1)!=0"等同于表达式"flag_event ! "= CHARTEVENT_NEWBAR_M1"。是这样吗?如果是这样,为什么还要使用位运算?

不,情况并非总是如此。这取决于在 flag_event 中写入的内容。如果只有 CHARTEVENT_NEWBAR_M1 被写入 flag_event,那么 flag_event = CHARTEVENT_NEWBAR_M1。如果CHARTEVENT_NEWBAR_M1|CHARTEVENT_NEWBAR_M5写入 flag_event ,则 flag_event != CHARTEVENT_NEWBAR_M1。但在这两种情况下,条件 (flag_event & CHARTEVENT_NEWBAR_M1)!=0都将满足

如果在flag_event 写入 CHARTEVENT_NEWBAR_M5,则 flag_event != CHARTEVENT_NEWBAR_M1。 但是 (flag_event & CHARTEVENT_NEWBAR_M1)=0.

要理解这些技巧,你需要了解数字系统和位运算。否则,你就死定了。

 
Yedelkin:

我明白了!也就是说,如果使用位运算对我来说有点不寻常,我是否可以安全地使用比较运算符重写表达式?谢谢您的解释!

您总是可以替换它,但可能需要额外的计算。在这种情况下一定要小心:)。
 
Lizar:
您可以随时更换它,但可能需要额外的计算。在这种情况下一定要小心:).

好的!还有一个问题。在书写十六进制数时,您使用了 2 的度数。 使用 2 的度数是否有意义,还是只是习惯问题?例如,是否可以使用这样的组合:0x00000003、0x00000009 等?

 
Yedelkin:

好的还有一个问题。在书写十六进制数字时,您使用了 "2 "的度数,那么使用 "2 "的度数有什么意义吗?也就是说,是否可以使用这样的组合:0x00000003、0x00000009 等?

这是因为使用了位操作。在 spy 中,我将多个数字(事件)加到一个数字中(在 flag_event 中),而在 EA 中,我从一个数字中取出多个数字,以查看 spy 发送了哪些事件。反之亦然。

哦,我没看清楚。是的,你可以这样做,只是我可能没有足够的一个数字来容纳所有事件。之所以使用二进制,是因为我使用的是二进制表示数字,而用十六进制书写。每一位代表一个不同的事件。

 
先生们,向你们致敬)真正的杰作。简单而优雅、功能强大的解决方案。非常感谢,康斯坦丁,祝贺你 :-)
 

默认情况下,price[rates_total-1] 等于最后一个未完成条形图的收盘价,而最后一个未完成条形图的收盘价又等于最后一个买入价。

如果想强制获取卖出价,可以将这一行替换为以下内容。


作者,很抱歉,也许我还没读完,但这个函数是否不仅能将价格事件传递给智能交易系统,还能将例如

指标的事件 或来自其他工具的组合/变化,也就是说,就像那里已经接收到信号一样。如果可以,如何实现?

谢谢您的答复。

 
artall:

默认情况下,price[rates_total-1] 等于最后一个未完成条形图的收盘价,而最后一个未完成条形图的收盘价又等于最后一个买入价,也就是说,默认情况下,我们总是从间谍中获取买入价。

如果想强制获取卖出价,可以用下面的内容替换这一行。


作者,对不起,也许我还没读完,但这个函数是否不仅可以向智能交易系统传递价格事件,还可以传递其他事件,如

指标的事件或来自其他工具的组合/变化,也就是说,就像那里已经接收到信号一样。如果可以,如何实现。

谢谢您的回答。


为此,最好使用指标本身,在适当位置嵌入标准函数EventChartCustom