错误、漏洞、问题 - 页 2021

 

打虫子

  1. 转到Metaquotes-Demo。
  2. 只有AUDJPY在市场概览中,并打开其图表。
  3. 重新加载终端,等待正式连接--报价即将到来。
  4. 在图表上运行脚本

void OnStart()
{  
  for (int i = 0; i < 5; i++)
    Print(SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE));
}


结果如下

2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0


重新启动。

2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851


也就是说,如果不使用Sleep(),SYMBOL_TRADE_TICK_VALUE 在第一次运行时返回零。


HI 关于市场观察中的隐形符号问题。如果你试图在脚本开始前打开USDJPY图表(按回车键并输入 "USDJPY"),它将不会工作。如果运行脚本后,它的工作。虽然市场观察没有改变。

 
fxsaber:

打虫子

  1. 转到Metaquotes-Demo。
  2. 只有AUDJPY在市场概览中,并打开其图表。
  3. 重新加载终端,等待正式连接--报价即将到来。
  4. 在图表上运行脚本


结果如下


重新启动。


也就是说,如果不使用Sleep(),SYMBOL_TRADE_TICK_VALUE 在第一次运行时返回零。


HI 关于市场观察中的隐形符号问题。如果你试图在脚本开始前打开USDJPY图表(按回车键并输入 "USDJPY"),它将不会工作。如果运行脚本后,它的工作。虽然市场观察没有改变。

在脚本的开头添加这个循环

   for(int i = 0; i < SymbolsTotal(true); i++)
     Print(SymbolName(i, true));

并看看有多少符号被打印出来。

在第一次运行时,访问AUDJPY仅将AUDUSD和USDJPY添加到市场概览中,只有在第二次调用时通过这些货币对获得符号属性。在我的案例中,这就是导致OrderCalcMargin问题的原因。

 
fxsaber:

它已经被写过很多次了。由于某些原因,他们没有纠正它。

得到了服务台的答复。他们会解决这个问题。
 

大家好!

请为初学者提供帮助。

寻找价格最大值的函数被执行。如何计算并返回具有一定价格上限的BAR NUMBER的代码?

 
Alexey Viktorov:

在脚本的开头添加一个类似这样的循环

并看看有多少个字符被打印出来。

在第一次运行时,访问AUDJPY仅将AUDUSD和USDJPY添加到市场概览中,只有在第二次调用时通过这些货币对获得符号属性。在我的案例中,这就是导致OrderCalcMargin问题的原因。

我想它会解决如何做到这一点。

阿纳托利-卡扎尔斯基
我收到了服务台的答复。他们要解决这个问题。

谢谢你。

 

关于 "围绕 "OrderCalcMargin() 的错误,对SR做了一个应用。

 
Kirill Belousov:

当MQL4/5的帮助中存在着直接的矛盾 时,很难确定。

...请记住, 参数在函数中是逆向传递,也就是说,最后一个参数先被计算和传递,然后是倒数第二个参数,依次 类推。开头括号后面的参数被计算并依次传递。


.
..注意,表达式x1,...,xn的顺序 是有保证的

这里的矛盾是什么呢?它是倒退的,仅此而已。没有相反的说法。
 
Alexey Navoykov:
矛盾是什么?它是倒退的,仅此而已。没有相反的说法。

- 这两项建议分别在帮助中的不同部分。

当你读到以下内容时

"调用一个参数为x1, x2,..., xn的函数"

表达式x1,....,xn的顺序是有保证的,你想的是哪个顺序?

是关于x1,...,xn的顺序还是关于xn,....,x1的顺序?

 
Kirill Belousov:

- 这两项建议分别在帮助中的不同部分。

当你读到以下内容时

"调用一个参数为x1, x2,..., xn的函数"

表达式x1,....,xn的顺序是有保证的,你想的是哪个顺序?

顺序x1,...,xn还是顺序xn,....,x1 ?

是的,你是对的,这很让人困惑。

然而,我认为在任何情况下,将自己的算法的逻辑放在一个特定的参数 排序上都是不好的做法。当这些从右到左的计算混淆了对代码的理解时,更是如此。这就是为什么如果你想应用它,你应该只在一些非关键的地方如打印出来的地方做。

 
Kirill Belousov:

Print()中计算表达式的顺序是由右至左。算是吧...再见...还事先检查了一下 :)

MQL5参考语言 基础知识 (操作和表达式 (其他操作

带有参数x1, x2,..., xn的函数调用

请注意,表达式x1,...,xn 的顺序是保证的

它再次证明了C++关键词inline的有用性(这里有一种观点认为它应该是过时的)。
其中,内联实际上意味着程序员拒绝使用函数参数的计算顺序,如果编译器决定让一个内联函数内联,编译器可以使用正向计算顺序作为更有效的(反向计算顺序显然只对可调用函数有效)。
同时,如果编译器决定嵌入一个非内联函数,它应该使用(一般)相反的评估顺序,即使这导致了效率的损失(因为程序员在没有声明该函数为内联函数的情况下假设了这个顺序)。

inline在MQL中也是合适的,因为在MQL中计算顺序不能被明确控制