关于OOP(面向对象的编程)的问题 - 页 2

 
VOLDEMAR:

像往常一样,我想学习,但一定会有一些人除了耍嘴皮子外,没有别的话可说......。

我写了一个简单的例子,把它拆开,我不知道如何用OOP写得更有能力 ...这只是一个例子,如果你知道如何正确地写一个类似的代码和OOP,那么请写出来,以便我和其他人可以学习...

OOP从寻找一个对象开始。如果没有对象,就没有OOP。

通常,一个对象是一些资源、数据。

你只需要写,看别人怎么写。然后你会自己想出办法。你也可以阅读教科书。互联网上有很多这样的人。

 
Zhunko:

OOP从寻找一个对象开始。如果没有对象,就没有OOP。

通常,一个对象是一些资源、数据。

你只需要写,看别人怎么写。然后你会自己想出办法。你也可以阅读教科书。互联网上有很多这样的人。


请推荐几本教科书 ...在您看来,最简单和最有用的是...
 
VOLDEMAR:

请推荐几个教程 ...在您看来,最简单和最有用的是...

格雷迪-布赫"面向对象的分析和设计。带有C++应用的例子"。

Ire Paul(有时拼写为Ira Paul)《C++中的面向对象编程》。

 

1) 与OOP无关,但应该增加交易操作错误处理程序(OrderSend(),OrderDelete(),OrderModify())。

为了使其与OOP相关--将其作为一个虚拟类方法(在子类中覆盖它,增加其他代码的处理)。

2) 所有在子类中的类方法的工作方式都与现在不同--让它们变成虚拟的

第一个候选人是openorders()

其缺点是,在虚拟方法中,你不能改变参数的数量和类型。

从正面看,"旧的"BuySelBuyStop 等将能够调用 "新的"(在子类中改变的)openorders()。

3)让我们一次拥有更美好的名字。例如,用OpenOrders 代替openorders

4)如果术语是叫什么,那么你就用类似的术语。

如果卖出=卖出,那么你就叫它卖出或卖出(即SellStop 而不是SelStop)。

5)你必须把所有的常数(500等)从类中删除。

让它们从变量中提取或作为方法的参数设置。

现在你记住了大约500个嵌入openorders(),但以后你会忘记它,或者会用这些类写很多猫头鹰,要改变一些东西就会很困难。

最难解决的是建筑错误。

而这是你现在正在创造的骨架(如果它不只是一个练习)。

6)不要把所有东西都放在一个班里。

做一个clOrder ,并 SetSLCloseOrderGetSLGetProfitSetTPGetTP 等粘在一起。

clTrade 类中,添加一个数组/订单列表,一个符号和符号属性(TICKETSIZE,POINT,TICKETVALUE, MINLOT, MAXLOT, STOPSTEP, LOTSTEP, LOTSIZE ,等等)。

如果你附加了Ask和Bid(作为一个符号的属性),别忘了在OnTick() 中刷新它们。

RefreshRates() 中,做一个绑定,以便在更新МТ变量后调用Ask和Bid属性(我也检查了订单的状态,谁开仓,谁平仓。已关闭的将从订单列表中删除)。

你可以添加时间表(首先,做一个类)和追踪止损(也做一个单独的类)。

PS: 我在周末做了这一切(我做了交易库),但这次我决定不使用类(只有结构,结构的数组和与之相关的函数)。

还有每天的时间表(因为阿尔卑斯山上的黄金每天从0:00到1:00都有休息)。在交易的最后2分钟,时间表检查器关闭所有交易并取消所有订单。

而在交易的最后一小时--它关闭亏损的交易,取消订单,修剪盈利的订单。我还做了一个追踪止损。一种类型,但由于参数不同,它适合于不同的符号。

该计划如下 - 符号(有自己的字段),订单(有自己的字段),时间表(有自己的字段)和一个专家顾问,有自己的字段(Magik等),指的是一个符号,有一个订单列表和一个时间表列表。

层次结构的顶端是顾问名单(符号+魔法组合必须是唯一的)。

 
VOLDEMAR:

请推荐一些教程...在您看来,最简单和最有用的是...

现在CodeBase中出现了使用OOP编写的例子。从VOLDEMAR 来看,例如))))

实际上,你的https://www.mql5.com/ru/code/11159,是启发我为结构重写我的贸易库的原因。

我已经决定对类进行等待 - 我不认为在MQL中使用它们有什么意义

 
我不太明白,现在是否可以使用标准 贸易
还是只有在MQL5中才是标准的,而在新的MetaEditor中只是从那里接手了?
 
EverAlex:

现在CodeBase中出现了使用OOP编写的例子。从VOLDEMAR 来看,例如))))

实际上,你的https://www.mql5.com/ru/code/11159,是启发我为结构重写我的贸易库的原因。

我已经决定对类进行等待--到目前为止,我还没有看到在MQL中使用它们的意义。


是的,我写了这个,但除了把函数转移到一个类中,我还没有理解其他的东西。
 
VOLDEMAR:

是的,我写了这个,但除了将函数转移到一个类中,我还没有理解其他的东西。

3(+1) OOP原则。

1)封装。即把变量、伪变量(称为 "对象属性 "或只是 "属性")存储在对象本身。也就是说,如果一个类被正确声明,它的数据就不能从外部被改变。

只有通过使用类本身的函数(被称为 "类方法 "或简称 "方法")。这不仅是为了给变量赋值,而且是为了执行与这些字段的变化有关的一些行动而需要的。

这就是在MQL中引入OOP的主要作用(在我看来),而不是移植函数(我的交易库的函数接收EA的索引作为参数之一,并与选定的EA一起工作,包括其订单阵列)。

没有人可以进入你创建的类的数据(如果没有源代码),然后抱怨你的代码有错误。

2)继承性。当一个祖先类被创建时,它继承了祖先类的所有字段和方法(有一个字段和方法的私有 类型,不能在祖先类中看到,但我们现在省略了这个)。

而在对象的设计阶段,你需要清楚地思考架构--类将如何被使用,它将包含哪些字段,它们应该如何在子类中可见,等等。

它被用于强大的系统和类库中,用于我个人在贸易任务中看不到的任务。但也许有人会需要它。例如,你可以用不同的尾随止损来制作子类。

这就是为什么--方法中没有常量,一切都必须通过适当的方法(通常以.Set 开头)或直接作为方法的参数从外部设置。这就是我对你的500美元 的意思。

3)多态性。我在上面写了几个帖子的事情--当一个重塑在子类的函数 openorders() 将自由调用旧的 Buy() 函数。

多态性的一个例子是计算不同形状的几何图形的面积。

对圆来说,它是以一种方式计算的,对正方形来说是以另一种方式计算的。但无论如何--通过调用 Figura.GetSquare(),我们将得到一个 从基类继承的特定 形状的面积(除非我们忘记声明Square())

再次需要一些资质来创建基类的架构。例如,如果忘记将Square() 声明为虚拟,就不可能以通用方式调用Square (你必须在每次调用之前检查类的类型,并准确地调用其Square 的实现)。

有些人建议把除构造函数外的所有方法都变成虚拟的(如果你在创建类时看不到它能发展成什么样子的地平线,我也持同样的观点)。最主要的是,析构器也必须是虚拟的。


更新。

================

4)抽象 (按照同志们的要求,虽然在我学习OOP的时候(1990年代),它不被认为是一个原则(因为事实上--只是从前三者衍生出来的),在文章中(见下面的链接)写到了它,但它不在文章的标题中,只有3个)。

在实际应用中,它是在创建一个 "空的 "基类(其中方法被声明,但什么都不做)。在一些语言中,一个方法可以被标记为抽象 的。 这意味着在一个子类中,它必然 是重叠的(即一个做某事的方法被添加)。

===================

PS:你可以在这里 简要地阅读,不需要太多细节,在这里


PPS:我不想冒犯任何人,但当我在《工作》中问到写一个贸易库时,只有1个人回答说他有这个库,并在使用它。

5个MQL-程序员(在Skype上)说他们不知道里面应该有什么,他们把所需的功能从他们的一个猫头鹰复制粘贴到另一个。他们甚至把 RefreshRates() 插在不改变任何东西的代码片段之间,而且执行时间不会超过几毫秒。而随后的代码并不取决于改变的Ask和Bid以及(也许)订单的类型。

因此,对于以前没有在其他编程语言中使用过OOP的MQL程序员来说,MQL中的OOP是没有用的。最多,它将隐藏数据不受外部变化的影响(这也不坏)。

 
EverAlex:

3) OOP的3个原则。

1)封装。即在对象本身中存储变量、伪变量(被称为 "对象属性 "或简称 "属性")。也就是说,如果一个类被正确声明,它的数据不能

2)继承性。当一个祖先类被创建时,它继承了祖先类的所有字段和方法(有一个字段和方法的私有 类型,在祖先类中无法看到,但我们在此暂时省略)。

3)多态性。我在上面的几篇文章中写道--当在子类中重塑函数 openorders() 时,将安全地调用旧的函数 Buy(),等等。

多态性的一个例子是计算各种形状的几何图形的面积。

对圆来说,它的计算方式是一种,对正方形来说是另一种。但无论如何,通过调用 Figura.GetSquare(),我们将得到一个 从基类继承的特定 形状的面积(除非我们忘记声明Square())

第四条在哪里!?摘要在哪里!?当之无愧地被遗忘 :-(
 
Zhunko:
第四条在哪里!?摘要在哪里!?当之无愧地被遗忘 :-(


加。