MQL5中的OOP问题 - 页 29

 
Dmitry Fedoseev:

是的,这里还有一个不断出现的问题,没有一个明确的答案。当你需要继承自己的类时--怎么做比较好,是继承它还是为你的类写一个新的扩展版本。

这一切都取决于你最终想要什么的总体想法,我认为

如果你打算在其他地方使用这个类,你需要让它在没有继承的情况下变得完整。

在我的例子中,CError类可以获得GetLastError(),取消描述并返回错误的值(int)。 我打算到处使用它,无论如何,它只有一个构造函数,在静态变量中定义语言和返回错误文本的案例

但还有一个有用的方法 - bool ServerDisable(); - 它定义了服务器的可用性(多平台MT4/МТ5代码),非常好的功能,它似乎需要在代码的其他地方,但我想,我将使用它的交易操作都一样 - 我把它放在COrder类中

.....

如果我想把它用于拖尾?.... - 有很多想象的空间,但最终它将被用作COrder中的一个对象--它还能被用在哪里?


我认为,一切看起来都很麻烦,用链接器包含服务函数库更容易,而且编译器不会自己将未使用的部分包含到可执行文件中。

整个类将是相当紧凑的程序性风格,我展示了一个打开订单的函数的例子,它可以在静态常量中存储订单量https://www.mql5.com/ru/forum/85652/page17#comment_12805083

 
Dmitry Fedoseev:

保持在限制范围内真的很重要吗?如果保持在限制范围内很重要,你也可以写函数。

我是在你的信息中回答的,你说如果你不使用类,你将不得不为不方便的调用签名而烦恼。 我表明你不必烦恼。

 
Alexey Navoykov:
是什么阻止了我将符号的名称发送到构造函数中,使该类灵活多变? 你不考虑组合交易的可能性,这是一个原则问题?

考虑到一切。

但到目前为止,我一直坚持研究--现在我几乎已经准备好研究1000和1种MM的方法以及订单系统的各种技巧了。)

但我仍然认为这最终不会太灵活,我已经在上面写了2次,程序化风格+小类的订单处理功能调整得好,会更好。

我将暂时转向测试我的想法,然后我将看到我在代码中经常编辑的内容和我不去碰的内容。

 
Igor Makanu:

.....

如果我想用它来跟踪呢?.... 有更多的想象空间,但最终它仍将作为COrder中的一个对象使用--它还能用在哪里?


尾巴是独立的,因为它们与主逻辑无关。它们可能存在,也可能根本不存在。

***

尾巴和其他类似的维护功能应该被作为一个类的后代,它们的实例应该在一个数组中创建。如果一个函数被启用,一个实例被添加到数组中并被执行。如果所有的函数都被禁用,那么数组就是空的,不必要的ifs不会被执行。你可以在EA中插入至少100个尾随条,而且不会影响其执行速度。

 
Alexey Navoykov:
这不是做这件事的方法。你至少要同时调用Bid()和Ask()。 你的代码看起来只是一个变量,让人觉得它的值保持不变,而实际上它不是。

唉,一直以来都是这样做的,在MT4中仍然是买入价和卖出价,没有造物主的奇思妙想来破坏这种简单的使用和获得当前价格;)

fxsaber:

我有以下方案,我没有遇到任何问题。

  1. 我写TC只是为了Tester。没有日志、错误处理程序和其他东西。如果通过OOP来完成的话,代码是非常简洁的,可以理解的,并且易于修改(但不是关键)。我已经把这个例子贴在KB上了。奖金是快速优化
  2. 最主要的是,它应该供测试者使用,并在独立的区块中。交易信号的产生--一个街区。信号交易--另一个街区。
  3. 向真实账户的转账总是在几个相同的动作中完成。TS被放置在一个虚拟环境中,没有任何代码变化。几个TS可以放在一个环境中,或者每个TS放在自己的环境中,那么OOP就变得特别方便。然后我们用一台复印机(市场上到处都是复印机,所以人们很擅长复印机的逻辑),它只是把交易/订单从虚拟环境复制到真实环境。
  4. 有了这个方案,编写TS就变得快速而简单。转移到真实(这真的很罕见)总是以统一、快速和清晰的方式进行。

我们谈论的是这个代码吗?https://www.mql5.com/ru/code/22770

真的很喜欢这个实现,对于测试人员和优化人员来说真的很好,我可能会把它作为一个基础,代码很短,可读性很强,说实话,读你的代码我很惊讶,你的写作风格要复杂得多,我通常是即插即用,我知道我不能理解这个逻辑。

 
Igor Makanu:

唉,一直以来都是这样的,在MT4中仍然是买入价和卖出价,没有任何创造者的奇思妙想会破坏这种简单的使用和获得当前价格;)

但它们的值在当前事件处理 中是不变的(当然,除非你强行调用RefreshRates)。 所以它们是变量,而不是函数。 而你的函数看起来像变量

 

给FP一个管理和处理数百兆字节或数千兆字节的数据阵列的真正任务,他们所有的童话般的信息模型(数据是不可改变的)都会变成地狱。

这些都是理论家,正好可以突破现实世界的任务,在他们虚构的宇宙中进行广播:)电信故事是笨蛋的数据传递。

事实上,对抗复杂性的唯一机会是将其打包到物体中。
 
Alexey Navoykov:

但它们的值在当前的事件处理 中是不可改变的(除非你强行调用RefreshRates)。 因此,它们是变量,而不是函数。 而你的函数看起来像变量

我甚至不知道如何解释你的例子中讨论的问题,我试着人性化地解释一下--对我来说,作为一个拥有第一台奔腾-90个人电脑的人,看到为了获得方便的使用,将增加一个额外的函数调用,这意味着将寄存器的值放在堆栈上,这让我很痛苦...然后...我们走吧。

我知道现在所有的东西都在处理器层面上反复缓存,我怀疑编译器开发人员会使 "从函数调用到函数调用 "的效率更高。

那么你的例子应该是这样的。

#define  Ask(dummy) SymbolInfoDouble(_Symbol,SYMBOL_ASK)
#define  Bid(dummy) SymbolInfoDouble(_Symbol,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask());
   Print("Bid = ",Bid());
  }

或者像这样。

#define  Ask(symbol_) SymbolInfoDouble(symbol_,SYMBOL_ASK)
#define  Bid(symbol_) SymbolInfoDouble(symbol_,SYMBOL_BID)

void OnStart()
  {
   Print("Ask = ",Ask(_Symbol));
   Print("Bid = ",Bid(_Symbol));
  }
 
Dmitry Fedoseev:

Vasiliy,这篇文章对你非常有用--不要为了OOP而挤掉OOP,折磨自己。

我有一个关于MT的功能框架的想法。那里几乎不会有OOP。只有函数、"单体 "和其他伪FP功能。我把所有的东西都写在引号里,因为在MQL中不可能做出全面的FP。

 
Dmitry Fedoseev:

评论是不必要的。

你们并不那么喜欢对方,或者也许是相反的,两个同性恋者在为自己寻找出路)。

顺便说一下,我喜欢你的文章,专家的文章很蹩脚,很弱,但我同样喜欢他。

而且我不是同性恋。