关于OOP(面向对象的编程)的问题 - 页 2 123456789...11 新评论 Vadim Zhunko 2014.04.07 13:01 #11 VOLDEMAR: 像往常一样,我想学习,但一定会有一些人除了耍嘴皮子外,没有别的话可说......。 我写了一个简单的例子,把它拆开,我不知道如何用OOP写得更有能力 ...这只是一个例子,如果你知道如何正确地写一个类似的代码和OOP,那么请写出来,以便我和其他人可以学习... OOP从寻找一个对象开始。如果没有对象,就没有OOP。 通常,一个对象是一些资源、数据。 你只需要写,看别人怎么写。然后你会自己想出办法。你也可以阅读教科书。互联网上有很多这样的人。 Vladimir Pastushak 2014.04.07 13:40 #12 Zhunko: OOP从寻找一个对象开始。如果没有对象,就没有OOP。 通常,一个对象是一些资源、数据。 你只需要写,看别人怎么写。然后你会自己想出办法。你也可以阅读教科书。互联网上有很多这样的人。 请推荐几本教科书 ...在您看来,最简单和最有用的是... Slava 2014.04.07 14:10 #13 VOLDEMAR: 请推荐几个教程 ...在您看来,最简单和最有用的是... 格雷迪-布赫"面向对象的分析和设计。带有C++应用的例子"。 Ire Paul(有时拼写为Ira Paul)《C++中的面向对象编程》。 Александр 2014.04.07 23:00 #14 1) 与OOP无关,但应该增加交易操作错误处理程序(OrderSend(),OrderDelete(),OrderModify())。 为了使其与OOP相关--将其作为一个虚拟类方法(在子类中覆盖它,增加其他代码的处理)。 2) 所有在子类中的类方法的工作方式都与现在不同--让它们变成虚拟的。 第一个候选人是openorders()。 其缺点是,在虚拟方法中,你不能改变参数的数量和类型。 从正面看,"旧的"Buy、Sel、BuyStop 等将能够调用 "新的"(在子类中改变的)openorders()。 3)让我们一次拥有更美好的名字。例如,用OpenOrders 代替openorders。 4)如果术语是叫什么,那么你就用类似的术语。 如果卖出=卖出,那么你就叫它卖出或卖出(即SellStop 而不是SelStop)。 5)你必须把所有的常数(500等)从类中删除。 让它们从变量中提取或作为方法的参数设置。 现在你记住了大约500个嵌入openorders(),但以后你会忘记它,或者会用这些类写很多猫头鹰,要改变一些东西就会很困难。 最难解决的是建筑错误。 而这是你现在正在创造的骨架(如果它不只是一个练习)。 6)不要把所有东西都放在一个班里。 做一个clOrder 类,并 把SetSL、CloseOrder、GetSL、GetProfit、SetTP、GetTP 等粘在一起。 在clTrade 类中,添加一个数组/订单列表,一个符号和符号属性(TICKETSIZE,POINT,TICKETVALUE, MINLOT, MAXLOT, STOPSTEP, LOTSTEP, LOTSIZE ,等等)。 如果你附加了Ask和Bid(作为一个符号的属性),别忘了在OnTick() 中刷新它们。 在RefreshRates() 中,做一个绑定,以便在更新МТ变量后调用Ask和Bid属性(我也检查了订单的状态,谁开仓,谁平仓。已关闭的将从订单列表中删除)。 你可以添加时间表(首先,做一个类)和追踪止损(也做一个单独的类)。 PS: 我在周末做了这一切(我做了交易库),但这次我决定不使用类(只有结构,结构的数组和与之相关的函数)。 还有每天的时间表(因为阿尔卑斯山上的黄金每天从0:00到1:00都有休息)。在交易的最后2分钟,时间表检查器关闭所有交易并取消所有订单。 而在交易的最后一小时--它关闭亏损的交易,取消订单,修剪盈利的订单。我还做了一个追踪止损。一种类型,但由于参数不同,它适合于不同的符号。 该计划如下 - 符号(有自己的字段),订单(有自己的字段),时间表(有自己的字段)和一个专家顾问,有自己的字段(Magik等),指的是一个符号,有一个订单列表和一个时间表列表。 层次结构的顶端是顾问名单(符号+魔法组合必须是唯一的)。 Questions on OOP (Object 基于交易模块创建多个 EA 交易 Александр 2014.04.07 23:52 #15 VOLDEMAR: 请推荐一些教程...在您看来,最简单和最有用的是... 现在CodeBase中出现了使用OOP编写的例子。从VOLDEMAR 来看,例如)))) 实际上,你的https://www.mql5.com/ru/code/11159,是启发我为结构重写我的贸易库的原因。 我已经决定对类进行等待 - 我不认为在MQL中使用它们有什么意义。 Lev Vimer 2014.04.09 06:02 #16 我不太明白,现在是否可以使用标准 贸易类? 还是只有在MQL5中才是标准的,而在新的MetaEditor中只是从那里接手了? Vladimir Pastushak 2014.04.09 10:11 #17 EverAlex: 现在CodeBase中出现了使用OOP编写的例子。从VOLDEMAR 来看,例如)))) 实际上,你的https://www.mql5.com/ru/code/11159,是启发我为结构重写我的贸易库的原因。 我已经决定对类进行等待--到目前为止,我还没有看到在MQL中使用它们的意义。 是的,我写了这个,但除了把函数转移到一个类中,我还没有理解其他的东西。 Александр 2014.04.09 19:31 #18 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是没有用的。最多,它将隐藏数据不受外部变化的影响(这也不坏)。 Vadim Zhunko 2014.04.09 20:33 #19 EverAlex: 3) OOP的3个原则。 1)封装。即在对象本身中存储变量、伪变量(被称为 "对象属性 "或简称 "属性")。也就是说,如果一个类被正确声明,它的数据不能 2)继承性。当一个祖先类被创建时,它继承了祖先类的所有字段和方法(有一个字段和方法的私有 类型,在祖先类中无法看到,但我们在此暂时省略)。 3)多态性。我在上面的几篇文章中写道--当在子类中重塑函数 openorders() 时,将安全地调用旧的函数 Buy(),等等。 多态性的一个例子是计算各种形状的几何图形的面积。 对圆来说,它的计算方式是一种,对正方形来说是另一种。但无论如何,通过调用 Figura.GetSquare(),我们将得到一个 从基类继承的特定 形状的面积(除非我们忘记声明Square())。 第四条在哪里!?摘要在哪里!?当之无愧地被遗忘 :-( Алексей Тарабанов 2014.04.09 20:43 #20 Zhunko: 第四条在哪里!?摘要在哪里!?当之无愧地被遗忘 :-( 加。 123456789...11 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
像往常一样,我想学习,但一定会有一些人除了耍嘴皮子外,没有别的话可说......。
我写了一个简单的例子,把它拆开,我不知道如何用OOP写得更有能力 ...这只是一个例子,如果你知道如何正确地写一个类似的代码和OOP,那么请写出来,以便我和其他人可以学习...
OOP从寻找一个对象开始。如果没有对象,就没有OOP。
通常,一个对象是一些资源、数据。
你只需要写,看别人怎么写。然后你会自己想出办法。你也可以阅读教科书。互联网上有很多这样的人。
OOP从寻找一个对象开始。如果没有对象,就没有OOP。
通常,一个对象是一些资源、数据。
你只需要写,看别人怎么写。然后你会自己想出办法。你也可以阅读教科书。互联网上有很多这样的人。
请推荐几本教科书 ...在您看来,最简单和最有用的是...
请推荐几个教程 ...在您看来,最简单和最有用的是...
格雷迪-布赫"面向对象的分析和设计。带有C++应用的例子"。
Ire Paul(有时拼写为Ira Paul)《C++中的面向对象编程》。
1) 与OOP无关,但应该增加交易操作错误处理程序(OrderSend(),OrderDelete(),OrderModify())。
为了使其与OOP相关--将其作为一个虚拟类方法(在子类中覆盖它,增加其他代码的处理)。
2) 所有在子类中的类方法的工作方式都与现在不同--让它们变成虚拟的。
第一个候选人是openorders()。
其缺点是,在虚拟方法中,你不能改变参数的数量和类型。
从正面看,"旧的"Buy、Sel、BuyStop 等将能够调用 "新的"(在子类中改变的)openorders()。
3)让我们一次拥有更美好的名字。例如,用OpenOrders 代替openorders。
4)如果术语是叫什么,那么你就用类似的术语。
如果卖出=卖出,那么你就叫它卖出或卖出(即SellStop 而不是SelStop)。
5)你必须把所有的常数(500等)从类中删除。
让它们从变量中提取或作为方法的参数设置。
现在你记住了大约500个嵌入openorders(),但以后你会忘记它,或者会用这些类写很多猫头鹰,要改变一些东西就会很困难。
最难解决的是建筑错误。
而这是你现在正在创造的骨架(如果它不只是一个练习)。
6)不要把所有东西都放在一个班里。
做一个clOrder 类,并 把SetSL、CloseOrder、GetSL、GetProfit、SetTP、GetTP 等粘在一起。
在clTrade 类中,添加一个数组/订单列表,一个符号和符号属性(TICKETSIZE,POINT,TICKETVALUE, MINLOT, MAXLOT, STOPSTEP, LOTSTEP, LOTSIZE ,等等)。
如果你附加了Ask和Bid(作为一个符号的属性),别忘了在OnTick() 中刷新它们。
在RefreshRates() 中,做一个绑定,以便在更新МТ变量后调用Ask和Bid属性(我也检查了订单的状态,谁开仓,谁平仓。已关闭的将从订单列表中删除)。
你可以添加时间表(首先,做一个类)和追踪止损(也做一个单独的类)。
PS: 我在周末做了这一切(我做了交易库),但这次我决定不使用类(只有结构,结构的数组和与之相关的函数)。
还有每天的时间表(因为阿尔卑斯山上的黄金每天从0:00到1:00都有休息)。在交易的最后2分钟,时间表检查器关闭所有交易并取消所有订单。
而在交易的最后一小时--它关闭亏损的交易,取消订单,修剪盈利的订单。我还做了一个追踪止损。一种类型,但由于参数不同,它适合于不同的符号。
该计划如下 - 符号(有自己的字段),订单(有自己的字段),时间表(有自己的字段)和一个专家顾问,有自己的字段(Magik等),指的是一个符号,有一个订单列表和一个时间表列表。
层次结构的顶端是顾问名单(符号+魔法组合必须是唯一的)。
请推荐一些教程...在您看来,最简单和最有用的是...
现在CodeBase中出现了使用OOP编写的例子。从VOLDEMAR 来看,例如))))
实际上,你的https://www.mql5.com/ru/code/11159,是启发我为结构重写我的贸易库的原因。
我已经决定对类进行等待 - 我不认为在MQL中使用它们有什么意义。
还是只有在MQL5中才是标准的,而在新的MetaEditor中只是从那里接手了?
现在CodeBase中出现了使用OOP编写的例子。从VOLDEMAR 来看,例如))))
实际上,你的https://www.mql5.com/ru/code/11159,是启发我为结构重写我的贸易库的原因。
我已经决定对类进行等待--到目前为止,我还没有看到在MQL中使用它们的意义。
是的,我写了这个,但除了把函数转移到一个类中,我还没有理解其他的东西。
是的,我写了这个,但除了将函数转移到一个类中,我还没有理解其他的东西。
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是没有用的。最多,它将隐藏数据不受外部变化的影响(这也不坏)。
3) OOP的3个原则。
1)封装。即在对象本身中存储变量、伪变量(被称为 "对象属性 "或简称 "属性")。也就是说,如果一个类被正确声明,它的数据不能
2)继承性。当一个祖先类被创建时,它继承了祖先类的所有字段和方法(有一个字段和方法的私有 类型,在祖先类中无法看到,但我们在此暂时省略)。
3)多态性。我在上面的几篇文章中写道--当在子类中重塑函数 openorders() 时,将安全地调用旧的函数 Buy(),等等。
多态性的一个例子是计算各种形状的几何图形的面积。
对圆来说,它的计算方式是一种,对正方形来说是另一种。但无论如何,通过调用 Figura.GetSquare(),我们将得到一个 从基类继承的特定 形状的面积(除非我们忘记声明Square())。
第四条在哪里!?摘要在哪里!?当之无愧地被遗忘 :-(
加。