mql4语言的特点、微妙之处以及技巧

 
本主题将讨论使用mql4语言 的无记录工作方式,解决某些问题的例子。最好是这个关于维护的分支更接近于常见问题,而不是讨论。我建议所有有经验的程序员分享他们的解决方案和编程技巧,特别是帮助中没有描述的功能的覆盖。
 
好吧,让我首先开始。

要关闭一个订单,你根本不需要定义订单类型 和该类型对应的价格。只要写上OrderClosePrice()就可以了。

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/
 

帮助中还有许多不准确的地方。以SetIndexBuffer()为例。帮助中的问题是什么?

"参数

指数

[in]指示器缓冲区 编号。编号从0开始。这个数字必须小于#property indicator_buffers中声明的值。"(这种说法不正确)

#属性indicator_buffers指定了要显示的缓冲区数量。也许帮助的意思是,虽然我没有检查过,但用于计算的缓冲区不需要由SetIndexBuffer()给出一个数字。但我所检查的是,如果用于计算的缓冲区用SetIndexBuffer() 给出一个数字,它的值可以通过iCustom()检索。

 
我不明白。
 

由于开发人员正在访问这个主题 - 有一个关于 "微妙和技巧 "的问题。

格式化打印的例子:PrintFormat("Bid=%.5f", Bid)

问题:有没有办法,而不是一个固定的精度(这里是5),在格式描述中指定一个条件,使精度取决于_Digits?要做到没有 "预处理",如PrintFormat("Bid=%s",DoubleToString(Bid, _Digits))

 

在MQL4中,同样的代码可以得到不同的结果,这取决于#property strict的状态。而这时编译在这两种情况下都是成功的。因此,如果执行是 "漫无边际 "的,你可以在错误的地方(严格)寻找原因很长时间。

 
Alexander Puzanov:

问题:不采用 固定精度(这里是5),是否可以在格式描述中指定一个条件,使精度取决于_Digits?

没有,例子可在https://www.mql5.com/ru/docs/common/printformat
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Описание проблемы

我在MQL4中编写一个指标。我面临着DRAW_HISTOGRAM样式的一个未记录的特征。

为了在图表上显示这些值,我需要两个缓冲区:用于直方图的上部数值和下部数值。在映射指示器阵列缓冲区时,如果样式的缓冲区将有0和1、2和3、4和5等值,则一切显示正常。然而,如果样式缓冲区被分配了以OTHER开始的值,即1和2,3和4,5和6,直方图线将不能正确地显示在图表中,尽管数据窗口中的值是正确的。

请在文档中加入对这一特殊性的提及,或对其进行修正,因为DRAW_HISTOGRAM样式描述并不总是以偶数缓冲区开始的!这是不可能的。

来自SD的。
 

关于交易、自动交易系统和交易策略测试的论坛

虫子,虫子,问题

-Aleks-, 2017.02.07 18:21

请您告诉我,在MT4专家顾问中,如果持续调用带有多个图形缓冲区的用户指标,那么每次调用都会重新计算,还是所有缓冲区都会一次性计算,您可以多次引用代码中的指标,而不会出现资源浪费的情况。我还想知道,如果代码没有完成(运行时间超过一个tick),但指标值发生了变化,会发生什么?


关于交易、自动交易系统和策略测试的论坛

虫子,虫子,问题

Slawa, 2017.02.08 08:20

所有的缓冲区都是一次性计算。悄悄地询问指标值--不会有任何重新计算

在MT4中,从专家顾问中调用的指标在该EA的流程中和其历史数据的副本上工作。你可以循环使用专家顾问,但同时你会收到在调用OnTick时计算的指标数据。直到你调用RefreshRates。RefreshRates更新专家顾问的历史数据,之后其所有数据将在指标的 第一次调用 时重新计算。

 
Alexey Viktorov:
要关闭一个订单,你不需要指定订单类型 和与此类型相对应的价格。只需写上价格OrderClosePrice()即可。

OrderClosePrice只能在相应的OrderSelect之后立即使用。因为OrderSelect为Order(const)-functions复制了一次数据,而同样的RefreshRates却无法更新它们。

例如,如果OrderClosePrice未能关闭,那么在下一次尝试之前必须再次进行OrderSelect(不需要RefreshRates)。

ZS 这条线是2005年的!以下是 开发商的详细论点。

 

这是一个耻辱...

---

这样,帖子就不会是无用的。

代替StringGetCharacter("a", 0), 你可以只写'a'--当用StringSplit将字符串解析成几个部分时经常需要这样做。

原因: