for (int i = 0; i < Orders.length; i++) {
Order O = Orders.getByIndex(i);
if (O.symbol == "EURUSD" && O.magicNumber = 12345) {
}
}
但事实并非如此。相反,你这样做的方式在MQL4和MQL5之间基本上是相同的。
for (int i = 0; i < OrdersTotal(); i++) {
if (OrderGetTicket(i)) {
if (OrderGetString(ORDER_SYMBOL) == "EURUSD" && OrderGetInteger(ORDER_MAGIC) == 12345) {
}
}
}
一个大项目的例子是Metaquotes创建的MQL5 Wizard。它允许你在5分钟内创建一个EA,只需一些用户输入。它是基于mql5标准库,它提供了建立EA所需的所有元素。同样的向导可能可以用程序化的方式完成,但在我看来,这将是一个更困难的事情。然后你还得维护这些代码。但这些标准库很难理解,因为它没有很好的文档和描述。我创建了一个主题来集中所有关于这个主题的内容(mql5 wizard not oop)。
***Ps:(我不想忘记这一点)。当然,我们大多数人都不喜欢不知道我们正在使用的代码中的内容。或者,我们会沉迷于试图理解别人的代码,否则我们可能不会使用它。然而,从我们的角度来看,mql4中的大多数本地函数(例如OrderSend())都是对象。我们看不到他们的代码,但是我们接受它。我相信这种对其他库的接受是一个从事大型项目的专业oop_programmer必须接受和建立的。否则,你就只能重新创造车轮了。
我相信你描述的是一个程序流程。我不认为这就是OOP背后的大思想。(我认为)OOP试图解决以下问题。我是一个OOP的初学者,但我正在形成我的世界观。
1) 你的函数是独立于全局变量的吗?换句话说,你的函数是独立的对象吗?封闭性
2) 你的函数是否隐藏了像局部变量名这样的细节?它是否简化了屏幕上的代码量?抽象性
3) 它是否有能力创建自己的复制件来进行修改?比如创建自己的数据类型的能力?继承性。
4)它是否有能力在运行中改变?例如:该函数能否处理integer_array以及double_arrays?多态性。
OOP帮助建立EA的方法类似于EA Builder帮助非编程人员建立专家顾问的方法。你只需抓住你最喜欢的订单会计功能 -> 数据功能 -> 事件跟踪功能 -> 成交量定义功能 -> 交易标准定义功能 -> 交易功能 -> 错误处理功能。然后,你就有了一个专家顾问。你多年来开发的所有交易标准定义功能都可以很容易地被调换进来或调换出去。
以我为例,如果你想修改我的专家顾问,你需要研究我的全局变量在哪里被应用,以及其他什么功能依赖于它(如你的状态或状态数组)。OOP使它变得像Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2)一样简单,这就是整个专家。
这使得别人更容易使用你的库,而且通常对别人有用的东西在未来的某个时候也对你有用。如果不出意外的话,就把独立的对象放在流水线上 :)
我对MQL5进行了一些探索,在我写的代码中不需要使用任何OOP。
类和OOP在MQL5中是一个可有可无的附加功能。平台框架本身并不使用它们。例如,你可能期望平台会有一个类似订单集合的东西,其中包含一个订单对象的列表,让你编写类似下面的代码。
但事实并非如此。相反,你这样做的方式在MQL4和MQL5之间基本上是相同的。
(你可能还期望你写的任何EA是一个派生自ExpertAdvisor类的类,该类在其声明中具有虚拟的OnTick和OnInit函数。但事实也并非如此。MQL5框架从根本上说仍然是非OOP,但你可以选择在任何有用的任务中自己使用OOP。)
因此,你可以通过一系列的辅助函数继续在MQL5上使用MQL4代码,例如string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);}。这方面唯一的缺陷是时间序列的访问,因为在MQL5中的组织方式非常不同。像https://www.mql5.com/en/articles/81 中的iOpenMQL4()这样的函数确实可以工作,但对于重复使用来说,它是非常缓慢和低效的。
(如果有人仍然关心,启动这个主题的错误报告仍然适用于build 535。https://forum.mql4.com/56885/page20#861740 也是如此,尽管看起来MetaQuotes在修复这个问题上有过一次失败的尝试)。
。
我同意RaptorUK的观点,mql5.com上关于OOP的文档至少是不完善的。但不幸的是,我不知道一个关于OOP的好的参考资料。我所读到的不是太抽象就是太基本,把梨和苹果作为对象的例子,把水果作为类。
OOP编程只有在你有大项目时才有用。一个大项目不一定是一个EA,你的项目可以是建立一系列带有指标的EA,等等......那么重用代码就很好,而OOP主要是关于代码重用,它帮助你建立一个结构,可以很容易地在其他程序中重用。不幸的是,我现在没有时间去深入研究这个问题。但我计划写一些这方面的文章。
一个大项目的例子是Metaquotes创建的MQL5 Wizard。它允许你在5分钟内创建一个EA,只需一些用户输入。它是基于mql5标准库,它提供了建立EA所需的所有元素。同样的向导可能可以用程序化的方式完成,但在我看来,这将是一个更困难的事情。然后你还得维护这些代码。但这些标准库很难理解,因为它没有很好的文档和描述。我创建了一个主题来集中所有关于这个主题的内容(mql5 wizard not oop)。
我相信你描述的是一个程序流程。我不认为这就是OOP背后的大思想。(我认为)OOP试图解决以下问题。我是一个OOP的初学者,但我正在形成我的世界观。
1) 你的函数是独立于全局变量的吗?换句话说,你的函数是独立的对象吗?封闭性
2) 你的函数是否隐藏了像局部变量名这样的细节?它是否简化了屏幕上的代码量?抽象性
3) 它是否有能力创建自己的复制件来进行修改?比如创建自己的数据类型的能力?继承性。
4)它是否有能力在运行中改变?例如:该函数能否处理integer_array以及double_arrays?多态性。
OOP帮助建立EA的方法类似于EA Builder帮助非编程人员建立专家顾问的方法。你只需抓住你最喜欢的订单会计功能 -> 数据功能 -> 事件跟踪功能 -> 成交量定义功能 -> 交易标准定义功能 -> 交易功能 -> 错误处理功能。然后,你就有了一个专家顾问。你多年来开发的所有交易标准定义功能都可以很容易地被调换进来或调换出去。
以我为例,如果你想修改我的专家顾问,你需要研究我的全局变量在哪里被应用,以及其他什么功能依赖于它(如你的状态或状态数组)。OOP使它变得像Accounting(Option_3); Display(Option_1); Caption(Option_5); TradingSys(Option_7); VolumeSize(Option2); OrderType(Option_2)一样简单,这就是整个专家。
这使得别人更容易使用你的库,而且通常对别人有用的东西在未来的某个时候也对你有用。如果不出意外的话,就把独立的对象放在流水线上 :)
类和OOP在MQL5中是一个可有可无的附加功能。平台框架本身并不使用它们。例如,你可能期望平台会有一个类似订单集合的东西,其中包含一个订单对象的列表,让你编写类似下面的代码。
但事实并非如此。相反,你这样做的方式在MQL4和MQL5之间基本上是相同的。
(你可能还期望你写的任何EA是一个派生自ExpertAdvisor类的类,该类在其声明中具有虚拟的OnTick和OnInit函数。但事实也并非如此。MQL5框架从根本上说仍然是非OOP,但你可以选择在任何有用的任务中自己使用OOP。)
因此,你可以通过一系列的辅助函数继续在MQL5上使用MQL4代码,例如string OrderSymbol() {return OrderGetString(ORDER_SYMBOL);}。这方面唯一的缺陷是时间序列的访问,因为在MQL5中的组织方式非常不同。像https://www.mql5.com/en/articles/81 中的iOpenMQL4()这样的函数确实可以工作,但对于重复使用来说,它是非常缓慢和低效的。
OOP目前相当普遍,它将吸引更多真正的编码员加入MQL。但我相信,类似于记事本的编辑器会击退他们中的大多数。