顾问的项目 - 页 7

 
George Merts:

你说的 "ATR不算是一个指标 "是什么意思?

那它怎么会 "不适合作为入市信号呢?我是一个只使用这个指标的 "波动性突破 "的傻瓜...?

我想你对指标有自己的理解。对我来说,指标是一个可以产生一些可变价值的对象,取决于时间。事实上,即使是普通的价格烛台图也是一个指标。但对你来说,它是另一种东西......因此,我们的理解是不同的。

基本上
指示器 = 显示某物的任何变化的工具(手段)。
在这个意义上,ATP是一个指标。
当你看图表时,你会发现该指标是最准确的(即,该指标 不是一个独立的指标--它是一个位置指标),你需要在市场上保持它。

我的尊重。

 

Я не вижу особой разницы - как я понимаю, WS (WareStore, вероятно ?) - это все тот же мой дата-провайдер.

这是对WorkSymbol 的缩写。选择这个简短的缩写是故意的,因为经常提到这个物体。

我怀疑在WS对象的初始化中一定有一些初步的步骤。

WS是CSymbol对象的一个实例,它的默认构造函数使用当前的Symbol()符号。因此,WS不需要从外部进行初始化。它是与策略类一起简单地创建的。

在一个EA中可能有许多不同符号和不同时间框架的容器。数据提供者的意识形态允许不重复他们。因为在现实中--所有的时间序列都储存在其中,而容器--只需指向必要的那些。

其结果是一个巨型类的内核,由专家类访问。它与基本的MQL有什么不同,当有MetaTrader内核和数以百计的功能,可以访问它?

如果我们认为MT4-5本身是数据提供者,而我们的类只用于提供访问--那么事实证明,根据你对开盘价的参考,我们必须为一个值调用CopyOpen()函数--这对我来说似乎是不合理的。

正是如此。只有这样的呼吁才能保证数据表现的统一性和状态的完全同步。不需要对报价进行任何更新(可以忘记),不需要使用一堆额外的切换开关,这在创建数据存储中介时不可避免地发生。不需要在数据库中搜索与要求的数据相匹配的数据。如果我的EA做到了。

Trade.SellLimit(WS.High[1]);

那么它就能保证知道WS.High[1]会返回它之前的极值,无论交易环境如何更新。是的,每次调用CopyHigh 并复制一个单一的double值太贵了,但它是100%可靠的。由于覆盖类不存储数据,而只是传递对系统函数的调用,那么我们就不可能出现存储的数据与当前环境不一致的情况。

我还认为,在程序中的任何地方给予所有变量完全的全局访问权是非常不合理的;相反,我尽量只访问程序中每个地方的特定行动所需的结构和数据。其他的东西都必须是不能接触到的。数据提供者的意识形态只是允许控制这种访问。

乔治,事实上,你已经创建了这个全球访问。你有一个大的超类提供者,每个人都在访问。这是一个大的全球对象池(指标、时间序列等),在OOP的包装下收集。换句话说,在有数据提供者的例子中,OOP已经变成了一种虚构。它在形式上存在,但在现实中并不存在。

 
Vasiliy Sokolov:

乔治,事实上你已经创建了这个全球访问。你有一个大的超阶级提供者,每个人都可以访问。这是一个由对象(指标、时间序列等)组成的大的全球池,在OOP的包装下被组装起来。换句话说,在有数据提供者的例子中,OOP已经变成了一种虚构。形式上是有的,但实际上是没有的。

不,我是在比较我把缓冲区放在数据提供者中或每次通过CopyXXX获得数据时的运行速度--我对缓冲区的访问速度快了数倍。这就是为什么我确定了我的缓冲区,而数据提供者只是这些缓冲区的一个集中存储。

事实上,"层 "的存在--这个非常的数据提供者带来了数据不同步的风险。但到目前为止,我还没有遇到过这样的问题,但数据提供者的保存速度相当明显。事实上,我认为许多人已经进行了这个测试--结果都表明,在处理一个tick时,复制一次数据,并使用它们,比每次到终端去找数据更有利。

现在不同了?通过CopyXXX对每个双倍值进行多次调用的速度和对整个范围进行一次调用的速度是一样的,然后--调用缓冲区的值?

 
George Merts:

不,我是在比较我把缓冲区放在数据提供者中时的速度,或者每次通过CopyXXX获得数据时的速度--我对缓冲区的访问快了几倍。这就是为什么我确定了我的缓冲区,而数据提供者只是这些缓冲区的一个集中存储。

事实上,"层 "的存在--这个非常的数据提供者带来了数据不同步的风险。但到目前为止,我还没有遇到过这样的问题,但数据提供者的保存速度相当明显。实际上,我认为很多人已经进行了这种测试--每个人都收到了,在处理打勾时,复制一次数据并使用它们,而不是每次都到终端去取数据,这样更有利可图。

现在不同了?而通过CopyXXX对每个双倍值的调用数量的速度与对整个范围的一次调用的速度是一样的,然后--调用缓冲区的值?

毫无疑问,在EA的内部内存中一次性复制所有的报价(日期提供者),然后从中调用数值,要比不断调用CopyBuffer快得多。但这是基于国家的制度的代价。基本上,我们的整个领域--编写EA、脚本等--是基于状态的系统编程:我们有一个订单--处理其处理规则。没有命令--我们检查其开放的条件。

至于CopyBuffer,复制大块的报价并测量性能增益只有在合成测试中才能实现。在实践中,在90%的情况下,专家顾问在每个tick上或在打开一个新条形的时刻,都会与最后一个条形一起工作。因此,最后一个条形图的数据总是被请求的,并且有一个CopyBuffer函数的持续调用,它将最后一个条形图复制到缓存中。

唯一真正提高生产力的是当专家顾问需要最后的N个柱子,其中N个数字远远大于1。但最后N个小节的要求是什么?它是在滑动窗口中工作(专家顾问所有工作的99%)。而滑动窗口,在本质上是一个循环缓冲器。因此,当要求最后N个条形图时,实际上,你只需要更新或添加一个,最后一个条形图。也就是说,所有这些关于复制数据块的东西都是一个非常好的故事,但它在它被创造出来的主题领域并不工作,而环形缓冲区的工作却相当成功。

现在我的CSymbol只是通过传递正确的索引来工作。但我可以升级它,使它能够缓存N个最后的条形图,而N个条形图将由CSymbol自己选择,这取决于最大的请求索引。然后,在没有任何外部变化的情况下,CSymbol在某些任务上的工作速度会比CopyBuffer的永久调用快很多倍。这就是OOP的力量。在与使用额外包装器相关的一定开销之后,一个质的飞跃出现了,由于自适应算法,你可以极大地减少内存或CPU时间的使用。

 
Gregory Kovalenko:
你好。
随着代码量的增加,有时会变得困难和混乱。
我见过有大量代码的EA代码,我想知道复杂的EA是如何设计的,是否有任何工具或技术来处理如此复杂的算法?

我写了大量的代码块,占据了数百行。几乎没有评论。没有OOP。该代码是俄语。一切工作都非常有效。我在程序中的定位没有任何问题,尽管有大约100个文件与它相连。可能是因为我已经习惯了,很久以前就记住了一切。最主要的是认识和了解你的项目,其他的都是次要的。我认为。

 
Реter Konow:

编写巨大的代码块,占据了数百行的篇幅。几乎没有评论。没有OOP。俄语的代码。一切工作都非常有效。虽然有大约100个文件与之相连,但我在程序中没有任何定向的问题。可能是因为我已经习惯了,很久以前就记住了一切。最主要的是认识和了解你的项目,其他的都是次要的。我的感觉是,最重要的是了解自己的程序,其他的是次要的。

你是否从1C到MQL?
 
Vasiliy Sokolov:
你是否从1C到MQL?

我是自学成才。我学习的第一种编程语言是MQL4。在那之后,我在C#和C++中练习了一下。


从未听说过1C。它是什么?

 
Vasiliy Sokolov:

至于CopyBuffer,复制大块的报价并测量性能增益,只有在合成测试中才有可能。在实践中,在90%的情况下,专家顾问在每个tick上的最后一个条形图,或在打开一个新条形图的时刻工作。因此,最后一个条形图的数据总是被请求的,并且有一个CopyBuffer的持续调用,它将最后一个条形图复制到缓冲区。

因此,我们需要 "合成测试 "的速度--在策略测试器中 搜索变体时,速度变得至关重要。对我来说,策略测试器是一个 "瓶颈",我们需要速度。

只是真正在实际工作中--每次通过CopyXXX直接访问数据的速度已经足够了。但是,对于测试仪中的程序--速度差异是非常重要的。

 
与本主题无关的评论已被移至"OOP与程序化编程"。
 
George Merts:

但正是在 "合成测试 "中,我们需要速度--在策略测试器中 尝试期权时,速度变得至关重要。对我来说,策略测试器是一个需要速度的 "瓶颈"。

只是真正在实际工作中--每次通过CopyXXX直接访问数据的速度已经足够了。但是,对于测试器中的程序来说--速度上的差异是非常重要的。

用更简单的话来解释:在你的数据提供者的基础上,有一个CopyXXX函数,它复制最后一个字符。在我的CSymbol的底部也是CopyXXX,复制相同的最后一个字符。这两项功能都很慢。因此,你的代码和我的代码都很慢,因为CopyXXX的调用不能被绕过。但我的代码更简单、更小。那么,如果不解决CopyXXX的问题本身,为什么要在CopyXXX上建这么多的多层楼?