需要帮助!无法解决这个问题,我遇到了硬件限制 - 页 11

 
elugovoy:

Yurichik,我的意思是不对文件处理、压缩等进行任何摆弄。纯粹用SQL和机器人/指示器逻辑工作。我与许多数据库合作,唯一的问题是使MQL和SQL一起工作))。 我创建了一个漂亮 的解决方案,没有数组和结构。

一般来说,我不喜欢重新发明轮子,而是用最好的手段解决问题。

Zhenya 是的,我得到了你...

这正是我所喜欢的

...特别是在有专业工具的情况下...最好能很好地 整合...

 

多么好的讨论啊!感谢大家的参与!

我将一并回复大家,尽量不遗漏任何东西(和任何人)。

1. Перейти на x64

我花了一段时间才意识到,我没有指定终端的版本。我正在使用4,我还不打算把这个EA迁移到5。不幸的是,MT4只有32位

取消32位Windows 8 / 8.1的4GB内存限制 不会有帮助,我的系统是x64的。

2.切割成片/分片阅读/装载小块。

这对任务的条件来说是行不通的。

我试着在下面给出更多的细节,也许这能让人更好地理解这个问题。

3.购买更多的内存/租用强大的服务器或云端/将所有的东西转移到SSD上

我当然会在可用的插槽中再放16GB的内存,但这并不是答案。

这个量不是极限,扩大容量只能解决问题的一个特殊情况。

我认为只有在确定是100%的算法挤压的情况下才应该采用这种方法。

4.压缩数据

这就是我现在正在做的事情。

文本缓存(20GB)被压缩了2倍,而且可能还会再被压缩一些。
它没有解决内存大小的问题,但它更接近于其他一些解决方案(RAM磁盘)。

我也会把它转换为二进制,这样可以加快阅读速度,减少音量。


目前还不清楚http://www.nanex.net/historical.html的向导是如何 压缩数据的。他们的数据结构是相当多余的。

5.在使用前对数据进行压缩/编码,并对所需的块进行解压/解密

作为一个选项被接受。

但直觉告诉我,这也需要很长的时间(这里我们会被处理器拖累)。

6.将计算转移到一个外部程序(Matlab/R/等)

我不想这样做,有很多原因。

除非是在与MT环境良好整合的情况下。但这仍然需要时间来学习软件/环境和/或向第三方开发商订购解决方案。在发展阶段(我就是这样),这很不方便,而且成本很高。

无论如何,现在试图留在沙盒里,它的所有优点和缺点。


7.创建索引文件并与索引一起工作

我不明白这能有什么帮助。

仍然要反复从主文件中检索数据(不断重读)。


8.使用一个数据库

一个非常诱人的选择,鉴于此。

  • 可扩展性和可移植性(你可以租一台服务器或只是连接一台邻近的PC)。
  • 自动化和良好的工作流程,否则,许多过程必须在皱褶上手动完成。
  • 和其他好处。

但也有一些弊端。

  • 对我来说,这是一个相对较新的环境(还没有严格的工作,只有基本的查询)。
  • 在单一客户机上安装的复杂性(独立版本)。
  • 可能是别的东西。
总之,如果其他选择不奏效,我可能会回到这个地方。


9.理解并测试新的和晦涩的术语

这只是对自己未来的说明和/或对作者更多信息的要求;)

未公开的:文件映射基于哈希的解决方案,B树。


10.将带有所有缓存的终端移到虚拟RAM盘上

到目前为止,这是最有希望的(就成本/效益比而言)选择。

安装了SoftPerfect的RAM Disk,我将完成缓存压缩,将计算器改写为永久文件读取,并检查性能。

11.把握好任务 =)

非常好的建议,特别是考虑到输入信息的匮乏。

按照承诺,我将努力提供更多细节。

有许多类似的交易序列,每个序列都是按时间排序的。

不同序列中的交易是不同的,并且在时间上分布不均(在每个序列中的方式也不同)。交易的数量是不同的。但所有这些都是在从Date1到Date2的区间内。

任务是以M分钟的步幅从D1移动到D2(或者更好--完全按所有序列的交易点数),找到一个按标准K比其他序列更好的序列(一个单独的任务--不仅要找到最好的序列,而且要按标准对整个集合进行排序并输出前10名--但这是一个可选项,还不是必须的)。

标准K的计算是基于相应序列的X个先前交易,几乎所有关于X个交易的信息都被用于计算(例如,仅有利润是不够的)。


标准(K)、交易数量(X)和其他影响结果的参数由用户改变。也就是说,它们不能被 "写入 "算法中。

类似这样的事情。

在理念上,我们可以对文件进行重组,使其对所有序列的所有交易都是线性的。

但是,如果不把所有的信息放入记忆中,怎么能做到这一点?然后,如果一个序列的交易将被 "涂抹 "到整个文件中,我怎么能重新计算标准?

现在,希望任务是明确的。

再次,非常感谢你们的参与、讨论、问题、链接和具体答复。

TheXpert,Urain,sergeev,elugovoy,anonymous,meat,ALXIMIKS,IvanIvanov,Integer,C-4,marketeer,barabashkakvn,Silent,GT788,papaklass,grizzly_v,artemiusgreat,YuraZ,Candid,Contender andserver

谢谢你!

 
komposter:

多么好的讨论啊!感谢大家的参与!

....

考虑到这是一个非常诱人的选择。

  • 可扩展性和可移植性(你可以租一台服务器,或只是连接一个邻近的PC)。
  • 许多过程的自动化和良好的工作流程,否则这些过程必须在膝盖处手动完成。
  • 和其他好处。

但也有一些弊端。

  • 对我来说,这是一个相对较新的环境(还没有严格的工作,只有基本的查询)。
  • 在单一客户机上安装的复杂性(独立版本)。
  • 可能是别的东西。
一般来说,如果其他选项不成功,我可能会回到这个选项。


如果我们往SQL的方向走


  • 对我来说是一个相对陌生的环境(没有仔细工作过,只有基本的查询)。

这可能是学习曲线上的一个相当大的阻力。

如果你选择这种变体,最好用存储程序来构建所有的业务逻辑

专家顾问只留下两个功能--向服务器发送请求,并获得一个完全完成的结果

服务器上的所有计算结果

  • 在单一客户机上安装的复杂性(独立版本)。

事实上,网络上可以找到很多关于如何将SQL服务器

( ORACL, SYBASE + CENTOS为例) ORACL, SYBASE, MS SQL+WINDOWS独立机器

ORACL有点难学--专家少,文献少。

MS SQL - 也许是网络上最大的信息量和更多的文献。

不会有任何困难--网上有许多描述,商店里有更多的书。

MSSQL 2012的参数与ORACL非常接近--在2014年已经如此。

SQL + LINUX通常被选择用于生产环境中的操作 - 如果你对LINUX一无所知,最好使用WINDOWS。

 

komposter:

有许多类似的交易序列,每个序列都是按时间排序的。

不同序列中的交易是不同的,在时间上分布不均(在每个序列中以不同的方式)。交易的数量是不同的。但所有这些都是在从Date1到Date2的区间内。

任务是以M分钟的步幅从D1移动到D2(或者更好--完全按所有序列的交易点数),找到一个按标准K比其他序列更好的序列(一个单独的任务--不仅要找到最好的序列,而且要按标准对整个集合进行排序并输出前10名--但这是一个可选项,还不是必须的)。

标准K的计算是基于相应序列的X个先前交易,几乎所有关于X个交易的信息都被用于计算(例如,仅有利润是不够的)。


标准(K)、交易数量(X)和其他影响结果的参数由用户改变。也就是说,它们不能被 "写入 "算法中。

类似这样的事情。

在理念上,我们可以对文件进行重组,使其对所有序列的所有交易都是线性的。

但是,如果不把所有的信息放入记忆中,怎么能做到这一点?然后,如果一个序列的交易将被 "涂抹 "到整个文件中,我怎么能重新计算标准?

现在,我希望,任务是明确的。

传统上,我在早上会放慢速度 :)。

一个序列能不能在内存中装下,还是已经出现了问题?

如果是前者,什么时候会发生从磁盘的多次读取,当用户改变标准和参数时?

如果是的话,是通过某种算法还是根据某种主观理由手动改变的?

 
Candid:

传统上,我在早上会放慢速度 :)。

一个序列能不能在内存中装下,还是已经出现了问题?

如果是前者,什么时候会发生从磁盘的多次读取,当用户改变标准和参数时?

如果是的话,是通过某种算法还是根据某种主观理由手动改变的?

一百万个序列。

然后在每一个人中找到一个有正确日期的点,并对以前的历史进行分析。

并选择最好的序列。

然后转到 "故事 "的下一个点。

 
我认为,如果你不想麻烦终端用户安装DBMS,那么可以选择综合几个(十几个)典型的K标准(例如,称其为保守交易、激进交易等),并实际将其放入算法中,对所有序列计算一次所选指标在时间上的变化,然后用一维向量工作。
 
marketeer:
我认为,如果你不想麻烦终端用户安装DBMS,你可以综合几个(十几个)典型的K标准(例如,称它们为保守交易、激进交易等),并实际将它们保存在算法中,对所有序列计算一次所选指标在时间上的变化,然后用一维向量工作。

比方说,只有2个标准。

但有几个参数设置了标准,而且每个参数都可以取不同的值。

即使我们非常粗略地对每个参数取几个值,我们也不会得到一个一维的向量,而是一个3或4维的数组。

那么内存肯定是不够的=)

 
komposter:

一百万个序列。

然后在每一个人中找到一个有正确日期的点,并对以前的历史进行分析。

并选择最好的序列。

然后转到 "故事 "的下一个点。

整个序列被加载到内存中。然后它 "找到具有所需日期的点并分析以前的历史"。标准值与取得的最佳效果进行比较。如果更好的话,就会记住最佳序列的标准和要知道的内容。然后,下一个序列被加载,以取代已处理的序列。如此反复无数次。

文件是按顺序读取的,而且只读一次。

有什么问题吗?

 
Candid:

整个序列被加载到内存中。然后,它 "找到具有正确日期的点并分析以前的历史"。标准值与取得的最佳效果进行比较。如果更好的话,要记住的标准和要知道的最好的序列是什么。然后,下一个序列被加载,以取代已处理的序列。如此反复无数次。

文件是按顺序读取的,而且只读一次。

怎么了?

这就对了。

然后,"正确的日期 "被所选序列的交易结束点所转移,并且该算法会重复进行。

以此类推,再来一百万次 =)

 
komposter:

它是这样的。

然后,"正确的日期 "被选定的序列中的交易收盘点移位,并重复该算法。

以此类推,再来一百万次 =)

但这些序列是相互独立的,对吗?那么,为什么我们不能在一个加载的序列上一次做一个日期的循环?在这里,顺便说一下,只是可能有机会去找一些高效的递归算法,但这是运气好的时候。一百万上的大小将保持,文件将被读取一次。

当然,一个在下一次迭代中步骤数保持不变的问题(即搜索区域不会随着计算的进行而变窄)看起来并不十分稳健。但这是主观的,当然。