文章 "MQL5 简介:如何编写简单的EA 交易和自定义指标"

 

新文章 MQL5 简介:如何编写简单的EA 交易和自定义指标已发布:

相比 MQL4,MetaTrader 5 客户端的 MetaQuotes 编程语言 5 (MQL5) 具有许多新的发展潜力和更高的性能。本文将帮助您熟悉这一新的编程语言。文中给出了编写EA 交易和自定义指标的简单示例。我们还会涉及到 MQL5 语言的一些细节,这些细节对于理解示例是必要的。

文章细节和 MQL5 语言的完整说明可在 MetaTrader 5 中包含的 MQL5 参考中找到。MQL 5 内置的“帮助”内容足以帮助您学习本语言。本文对于那些熟悉 MQL4 以及那些刚刚涉足交易系统和指标编程的初学者而言均可提供帮助。


MQL5 入门

MetaTrader 5 交易平台允许您以手动或自动模式对金融工具和交易进行技术分析。MetaTrader 5 与之前的版本 MetaTrader 4 有所不同,尤其是交易、持仓和订单概念得到改进。

  • 持仓 - 一种市场承诺,是买入或卖出金融工具数量的合同。
  • 订单 - 在一定条件下买入或卖出一定量的金融工具的订单。
  • 交易- 经纪人执行订单而引起开仓、持仓修改或平仓的事实。

客户端具有内置编程语言 MQL5,可用于编写具有不同目的的多种类型的程序:

  • EA 交易 - 一种根据指定算法进行交易的程序。“EA 交易”允许您在交易系统上实施自动交易(无需交易人员即可执行交易操作)。“EA 交易”可执行交易操作,进行开仓和平仓,以及管理挂单。
  • 指标 - 一种以图表形式呈现数据的程序,便于分析。
  • 脚本 - 一种可一次执行某些操作序列的程序。

“EA 交易”、“指标”和“脚本”可调用 MQL5 标准库的函数及 DLL 函数,包括操作系统库。位于其他文件中的代码可包含于以 MQL5 编写的程序文本中。

要编写程序(“EA 交易”、“指标”或“脚本”),您可以启动 MetaTrader 5 客户端,从 Tools(工具)菜单选择 MetaQuotes Language Editor(MetaQuotes 语言编辑器),或按 F4 键。

作者:Denis Zyatkevich

 
我无法启动指标调试器,例如 MACD 或自定义移动平均线。按 F5 键时,"编译 "按钮变为 "取消 "按钮,几分之一秒钟后屏幕闪烁,一切恢复到初始状态。调试 "选项卡不会出现。在调试脚本 "AccountInfo "时,调试器正常工作,Build 257。
 
指标调试 目前尚未实现。
 

胜利日快乐!

能给我点建议吗?

Expert Advisor 包含一个交替搜索所有未结头寸的循环。在循环中使用PositionGetDouble(POSITION_SL)函数。从 POSITION_SL 参数的描述中可以看出,该参数可用于获取未结头寸的止损水平。

问题 1: 如果未结头寸是由于触发了几个具有不同止损水平的挂单而形成的,PositionGetDouble(POSITION_SL) 函数将显示什么值?

问题 2: 如果未结头寸是由于触发了多个具有不同止损水平的挂单而形成的,那么获取这些止损水平数据的最佳方法是什么?

如果以前讨论过这个问题,请提供链接。

Документация по MQL5: Торговые функции / PositionGetDouble
Документация по MQL5: Торговые функции / PositionGetDouble
  • www.mql5.com
Торговые функции / PositionGetDouble - Документация по MQL5
 
Yedelkin:

胜利日快乐!

问题 1:如果未结头寸是由于触发了多个具有不同止损水平的挂单而形成的,PositionGetDouble(POSITION_SL)函数 会显示什么值?
您检查过函数的返回值吗?
 
sergeev:
你检查过函数的返回值吗?

没有。因为我不知道在检查(测试)某个函数时必须观察到的所有重要初始条件。另外,在学习一门新的编程语言时,我对使用科学 "戳 "法的可能性持否定态度。

解释。由于专门介绍智能交易系统的文章数量很少,而且没有关于 MQL5 的教科书,因此普通用户在实施自己的交易策略时,只能依靠网上的资料,包括这篇(非常有用的)文章。

正如您所理解的,我的问题涉及理论和应用 方面,而这些方面在当前版本的 MQL5 参考指南以及有关 MQL5 Expert Advisors 的可用文章中都没有反映出来。

在这种情况下,我认为向知识渊博的人(语言开发人员和文章作者)询问有关MQL5 函数 的某些理论和应用 方面的问题要合理得多,而不是进行实验、在特定条件下 "检查函数返回什么 "以及类似的业余行为。

我同意,知识渊博的人对 "应该是什么 "的回答比 "你检查过函数返回什么吗 "这样的反问(在我不了解函数功能的特殊性的情况下)看起来更理想。

 

找到答案了。在《客户端终端用户指南》中:

...Уровни Тейк Профит и Стоп Лосс устанавливаются для позиции по последнему ордеру (рыночному или сработавшему отложенному).
Иными словами, стоп уровни в каждом последующем ордере по одной позиции заменяют предыдущие. 
...Срабатывание ордеров Тейк профит и Стоп Лосс приводит к полному закрытию позиции.  

奇怪。由于每种金融工具只能有一个未结头寸,因此原则上无法通过止损来部分平仓

附注: 在发现 MT5 固有的这一特殊性后,如果未结头寸是由于触发了多个具有不同止损水平的挂单 而形成的,则无需检查 PositionGetDouble(POSITION_SL)函数返回的值。

 
Yedelkin:

找到答案了。在客户端的《用户手册》中:

奇怪。由于每种金融工具只能有一个未结头寸,因此原则上无法通过止损来部分平仓

附注: 在发现 MT5 固有的这一特殊性后,如果未结头寸是由于触发了多个具有不同止损水平的挂单而形成的,则无需检查 PositionGetDouble(POSITION_SL)函数返回的值。

可以使用 "izpodvypodvert vypert vypert podvypert "函数,该函数将根据给定工具的交易量将止盈按级别分成挂单。

但我个人认为这个功能没有必要,因为我熟悉的官方交易终端 没有锁定功能。

 
CoreWinTT:

can be made as a function "from-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub-sub" ...

是的,我已经为这个问题伤透了脑筋。有三种选择)

- 针对 MT5 的特殊性,创造性地重新设计现有方案;

- 或者创建一类子子子孙孙函数;

- 或避免在订单中使用止损和止盈,最初使用相反方向的订单捆绑操作。

没关系,我们会解决的!:)

 

关于ArraySetAsSeries 函数 在智能交易系统中的位置问题。

ArraySetAsSeries 函数放在 OnTick() 函数中,紧随 CopyTime、CopyHigh 和 CopyLow 函数之后。

将 ArraySetAsSeries 函数放在 OnInit() 函数中是否有任何障碍,还是数组应始终在复制后才进行索引?

Документация по MQL5: Операции с массивами / ArraySetAsSeries
Документация по MQL5: Операции с массивами / ArraySetAsSeries
  • www.mql5.com
Операции с массивами / ArraySetAsSeries - Документация по MQL5
 
Yedelkin:

关于 ArraySetAsSeries 函数在 EA 中的位置问题。

ArraySetAsSeries 函数放在 OnTick() 函数中,紧随 CopyTime、CopyHigh 和 CopyLow 函数之后。

将 ArraySetAsSeries 函数放在 OnInit() 函数中是否有任何障碍,还是数组应始终在复制后才进行索引?

对于指示器缓冲区,应使用SetIndexBuffer

注意

链接后,动态数组 缓冲区[]的 索引将与普通数组一样,即使被链接的数组预先设置为按时间序列 索引。如果需要更改指标数组元素的访问顺序,则必须在使用 SetIndexBuffer() 函数绑定数组后应用ArraySetAsSeries() 函数。

智能交易系统的情况也类似,请查看