新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 829

 

有一个这样的格式问题:有这样的代码

int P=3。

如果(P==5){那么就有必要进入图书馆并计算一些东西}。

在这种情况下,P=3,即条件是假的。 问题是,编译器会进入库中并空闲地运行代码,还是编译器会读取 当前文件中的代码?我会解释我为什么要这样问。好吧,看,假设我们写下以下的格式条件

int Y=4。

如果(Y==4){做一些事情}否则{做一些其他事情}。在这种情况下,我们得到以下图片Y==4,首先我们可以说,优先级运算符被执行了,但是else{do something else}块也将被检查和计算(只是计算和总是),但是没有被执行,因为优先级是一个表达式if(Y==4)。换句话说,无论真相结果如何,机器都会进行所有的计算,也就是说,无论二级运算符是否被执行,它都会在计算上耗费能量。如果我使用大的程序和库,而编译器每次都会挖掘库的代码,最终会使程序变慢。 在这种情况下,使用库的效果会如何,我是否应该使用mql4代码本身尽可能的简洁,使机器人的性能高?谁对这个问题有什么想法?

 
Pavel Soin:

你好。

假设我有两个指标,第一个有4个缓冲区,第二个有2个。我把它们放在图表上并打开数据窗口(CTRL+D)。 列表中包含6个缓冲区,从0到5。我怎样才能在MQL中从这个列表中读取缓冲区5的值呢?按要求的指标使用iCustom是不方便的。使用这个列表更方便。我知道他们是这样做的,但怎么做呢?

谁能帮帮我?

 
Seric29:

有一个这样的格式问题:有这样的代码

int P=3。

如果(P==5){那么就有必要进入图书馆并计算一些东西}。

在这种情况下,P=3,即条件是假的。 问题是,编译器会进入库中并空闲地运行代码,还是编译器会读取 当前文件中的代码?我会解释我为什么要这样问。好吧,看,假设我们写下以下的格式条件

int Y=4。

如果(Y==4){做一些事情}否则{做一些其他事情}。在这种情况下,我们得到以下图片Y==4,首先我们可以说,优先级运算符被执行了,但是else{do something else}块也将被检查和计算(只是计算和总是),但是没有被执行,因为优先级是一个表达式if(Y==4)。换句话说,无论真相结果如何,机器都会进行所有的计算,也就是说,无论二级运算符是否被执行,它都会在计算上耗费能量。如果我使用大的程序和库,而编译器每次都会挖掘库的代码,最终会使程序变慢。 在这种情况下,使用库的效果会如何,我是否应该使用mql4代码本身尽可能的简洁,使机器人的性能高?谁对这个问题有什么想法?

MetaEditor的内置调试器能很好地回答这些问题。你应该写一个具有类似条件的脚本,并在调试器中一步一步地运行。你会看到,程序不会进入它无事可做的地方。此外,这样的条件

int P = 3, Y = 4;
if(P == 5 && Y == 4)

在检查了P !=3之后,没有什么会被进一步检查。

 
下午好。你能告诉我怎样做才能在周末保持图表上的所有图形元素
 
Lomonosov1991:
下午好。你能告诉我怎样做才能在周末保持图表上的所有图形元素?
不要删除它们
 
Alexey Viktorov:

MetaEditor的内置调试器很好地回答了这些问题。写一个具有类似条件的脚本,并在调试器中一步步运行。你会看到程序如何不进入它无事可做的地方。此外,这个条件

在检查了P !=3之后,没有什么会被进一步检查。

下面是一个例子

int pp=8;if(pp==8){pp=3;}else{pp=340000000000000000000000000000;}

pp=8在这种情况下是8,但编译器对这个大数字发誓,我想把它放到一个变量里,但我不会把这个数字放到一个变量里,因为pp=8是正确的,但由于某种原因,编译器开始挖掘我写的东西,检查它是否可以,所以我们得出结论,是编译器在检查和计算,好吧,这当然是一个粗略的错误,我们可以犯不那么严重的错误,但编译器还是会检查它是否可以的。我不是说要在里面写那种东西,但编译器会检查它应该做什么,但它不会做,会算数。我试着用MQL4调试器工作,我读了这里的说明https://www.metatrader5.com/ru/metaeditor/help/development/debug,但 我甚至没有看到一个活跃的标签 "对照历史检查",尽管说明显示它应该是活跃的。

 
Seric29:

下面是一个例子

int pp=8;if(pp==8){pp=3;}else{pp=340000000000000000000000000000;}

pp=8在这种情况下是8,但编译器对我想放入变量的大数字发誓,但我不会把这个数字放入变量,因为pp=8是正确的,但由于某种原因,编译器开始挖掘我写的东西,并检查它是否可以,所以我们得出结论,是编译器检查并增加了一切,嗯,这当然是一个粗略的错误,我们可以犯不那么严重的错误,但编译器仍然会检查它是否可以。我不是说要在里面写那种东西,但编译器会检查它应该做什么,但它不会做,会算数。我试着用MQL4调试器工作,我读了这里的说明https://www.metatrader5.com/ru/metaeditor/help/development/debug,但"对照历史检查 "选项卡甚至没有激活,尽管说明表明它应该激活。我试着用真实数据检查,但在这种情况下,变量值没有显示,我没有看到任何东西,只是想知道发生了什么事。

编译器在编译时检查有效值,但在运行时不检查。阅读一下变量类型,以及这些变量的值允许在什么范围内。如果编译器没有检查这些范围,你可能会在代码执行的时候丢失数值,得到错误的计算结果。所以这种行为对程序员来说是好事。编译器总是会对可能的精度损失发出警告。

而MT4调试器对历史数据不起作用。这是MT5测试者的特权。但无论如何在历史上调试脚本是没有意义的,你可以观察我在MT4测试器中的建议。你只需要在代码的开头设置一个断点,然后一步一步地观察执行的顺序和变量的值。

 
你认为讨论反编译的代码片段可以吗?
他们至少应该重新命名这些变量。它不是那么厚颜无耻...
 
Artyom Trishkin:
你认为讨论反编译的代码片段可以吗?

他们至少应该重新命名这些变量。否则,就太无耻了......

该EA以MQL4格式在线提供。三人舞》,我只是为自己重拍。

 
Lomonosov1991:

该顾问可在网上查询。Trio Dancer,我只是为自己修改一下。

那又怎样?有一些地方,他们购买和出售赃物。
这个论坛不属于这个类别。
它在一段时间前被黑掉了(从作者那里偷来的),现在你在为自己制作。请不要在这个网站上这样做。我们这里有道德规范。