EA: 来自"MQL5算法交易的神经网络"教程的示例 - 页 2

 

下午好、

我正在尝试运行书中的第一个脚本,它可以生成一个 csv 文件。

文件名为 initial_data.mq5。

在第一步运行脚本时

如果(CopyClose(_Symbol, PERIOD_M5, Start, End, close) <= 0 |||

CopyOpen(_Symbol, PERIOD_M5, Start, End, open) <= 0 |||

CopyHigh(_Symbol, PERIOD_M5, Start, End, high) <= 0 ||

CopyLow(_Symbol, PERIOD_M5, Start, End, low) <= 0)

返回;

CopyClose 始终等于-1

脚本崩溃,重新运行也无济于事,正如我在注释中看到的那样

这是正常情况,意味着服务器没有数据。

但是,我并不完全理解数据文件的路径是如何写入脚本的。

它写在 MQL5 文档中:


例如,来自 MetaQuotes-Demo 交易服务器的欧元兑美元符号数据将位于terminal_directory\bases\MetaQuotes-Demo\history\EURUSD\文件夹中


我确实有 .hcc 解析度的文件和一个子目录 (cache),上面有像 H4.hc 这样的文件。


但在脚本 initial_data.mq5 中,只有一处写入了路径。

PrintFormat("Correlation coefficients saved to file %s\\\\Files\\\\%s"、

TerminalInfoString(TERMINAL_DATA_PATH), FileName);


我输出 TERMINAL_DATA_PATH

2024.06.16 22:53:39.982 path (EURUSD,M5) dataPath =C:\Users\HPAppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075


我该怎么做才能正确指定这些文件的路径,还是应该根据 MQL5 逻辑自动从终端目录钩取这些文件?

如何将数据下载到 csv 文件?


 
bobozel1 #:

关于交易、自动交易系统和测试交易策略的论坛

初学者关于 MQL4 和 MQL5 的任何问题,关于算法和代码的帮助和讨论

Aleksey Vyazmikin, 2024.06.18 06:28 pm

#define FileName  "correlation.csv"
//+------------------------------------------------------------------+
//| 外部参数|
//+------------------------------------------------------------------+
input datetime Start = D'2015.01.01 00:00:00';  // 期初
input datetime End = D'2020.12.31 23:59:00';    // 期间结束
//--- 打开文件以写入数据
   int handle = FileOpen(FileName, FILE_WRITE | FILE_CSV | FILE_ANSI, "\t", CP_UTF8);
   if(handle == INVALID_HANDLE)
     {
      PrintFormat("Error of open file %s: %d", FileName, GetLastError());
      return;
     }
文件打开

参数

open_flags

[in]定义文件工作模式的标志组合。这些标志的定义如下:
FILE_READ 文件打开用于读取
FILE_WRITE文件打开用于写入
FILE_BIN二进制读写模式(不进行字符串之间的转换)
FILE_CSV类型为 csv 的文件(所有写入的元素都转换为相应类型的字符串,unicode 或 ansi,并用分 隔符分隔)
FILE_TXT 纯文本� �� �(与csv 相同 ,但不考虑分隔符)FILE_ANE 文件打开用于写入 但不考虑分隔符)
FILE_ANSIANSI 类型的字符串(单字节字符)
FILE_UNICODEUNICODE 类型的字符串(双字节字符)
FILE_SHARE_READ多个程序共享读取访问
FILE_SHARE_WRITE多个程序共享写入访问
FILE_COMMON文件位置在所有客户终端的公共文件夹中 \Terminal\Common\Files.

文件打开

注意事项

出于安全原因,在 MQL5 语言中,对文件的操作受到严格控制。用于使用 MQL5 语言工具进行文件操作的文件不能位于文件 "沙箱 "之外。

如果需要以特定编码读取文件(指定了带有编码 值的 codepage 参数),则必须设置 FILE_ANSI 标志。如果不指定 FILE_ANSI 标志,文本文件将以 Unicode 格式读取,而不进行任何转换。

文件将在 MQL5\Files 子文件夹(或测试代理_agent\MQL5\Files 目录)中的客户端文件夹中打开。如果在标志中指定了 FILE_COMMON,文件将在所有客户端的公共文件夹中打开

可以根据以下规则打开 "命名通道":

  • 通道名称是一个字符串,必须是:"servername/pipe/pipename",其中 servername 是网络上服务器的名称,pipename 是通道的名称。如果通道在同一台计算机上使用,服务器名可以省略,但应使用点来代替:"\.\pipe\pipename"。试图连接到通道的客户端必须知道通道的名称。
  • 在从通道读取数据和向通道写入数据的连续操作之间,必须在文件开头调用FileFlush()FileSeek( )

上述行中使用了特殊的反斜杠字符"\",因此在 MQL5 程序中写入名称时,"\"应加倍,即上述示例应在代码中写成"\\\\servername\\pipe\\pipename "。

有关使用命名通道的更多详情,请阅读文章 "通过命名通道与 MetaTrader 5 通信,无需 DLL"。


 
Aleksey Vyazmikin #

老实说,我对答案一无所知,就像机器人在写东西一样。我知道要创建的文件被写到哪里,但它并没有被创建。

我有一个具体问题,如何从 .hcc 和 .hc 文件中获取数据并写入 .csv?

结果是 运行书中的 initial_data.mq5 脚本

CopyClose 总是-1。如何解决这个问题?

我怀疑它之所以看不到这些文件,是因为数据文件的路径拼写不正确。

如何正确拼写数据文件的路径?

在我的案例中,数据文件位于沙盒内的 terminal_directory\bases\MetaQuotes-Demo\history\EURUSD\ 文件夹中。

我为这个问题纠结了一个星期,什么都看了,但还是没有找到解决办法。请帮帮我。

 
bobozel1 #:

老实说,我对答案一无所知,就像机器人在写东西一样。我知道要创建的文件写在哪里,但它并没有被创建。

我有一个具体的问题,如何从 .hcc 和 .hc 文件中获取数据并写入 .csv?

结果 运行了书中的 initial_data.mq5 脚本

CopyClose 总是-1。如何解决这个问题?

我怀疑它只是没有看到这些文件,因为数据文件的路径拼写不正确。

如何正确指定数据文件的路径?

在我的例子中,数据文件位于沙盒内的 terminal_terminal_directory\bases\MetaQuotes-Demo\history\EURUSD\ 文件夹中。

我已经为此纠结了一个星期,看了所有的资料,但还是没有找到解决办法。请帮帮我。

所有数据都来自平台,用户并不关心终端从哪里获取数据--从哪个文件。

脚本使用图表上的数据。

请检查图表上是否有您请求报价的日期。

 
Aleksey Vyazmikin #:

所有数据都来自平台,用户并不关心终端从哪里获取数据--从哪个文件。

脚本使用图表上的数据。

检查图表上是否有您要求报价的日期。

请解释这意味着什么。

脚本中有一个范围

输入 datetime 开始 = D'2015.01.01.01 00:00:00'; // 期间开始

输入 datetime End = D'2020.12.31 23:59:00'; // 期间结束

在 M5 上

我是否应该使用 M5 上的欧元兑美元 图表,滚动到2015.01.01,然后在上面运行脚本?

或者我可以在 MN 上运行脚本吗?新的刻度点会回到起点吗?
 
bobozel1 #:

您能解释一下这是什么意思吗?

脚本中有一个范围

输入 datetime 开始 = D'2015.01.01.01 00:00:00'; // 期间开始

输入 datetime End = D'2020.12.31 23:59:00'; // 期间结束

在 M5 上

我是否需要将 M5 上的欧元兑美元 图表滚动到2015.01.01,然后在上面运行脚本?

或者我可以在 MN 上运行脚本?新的刻度点会再次移动到起点吗?

请阅读终端帮助。还有一件 事。

你会发现有一个通过窗口中最大条数来设置历史深度的选项。您需要重新加载终端才能使更改生效。

因此,有必要同时设置所有 TF 的最大历史深度,即工作所需的最小 TF。

很明显,以 100 条为天数和以 100 条为分钟数,在条数上的深度是一样的,但在日期上就不一样了。

设置所需值或 "无限 "并重新加载终端后,如果所需时间段的历史记录可用,则可在月度 TF 上运行脚本。


 
Aleksey Vyazmikin #:

请阅读终端帮助。还有一个

你会了解到,可以通过窗口中的最大条数来设置历史深度。要使更改生效,需要重新加载终端。

因此,有必要通过最小的 TF 一次设置所有 TF 的最大历史深度,这是工作需要。

很明显,以 100 条为天数和以 100 条为分钟数,在条数上的深度是一样的,但在日期上就不一样了。

当您设置了所需值或 "无限 "并重新加载终端后,如果所需时间段的历史记录可用,您就可以在月度 TF 上运行脚本。


谢谢!一切正常。
 
bobozel1 #:
谢谢!成功了

不客气

 
最麻烦的不是这。最麻烦的是,优化的参数后,只能一年赢利。换一年,就又不行了。也就是说作者的这个是不可行的。不同的年份可能参数差距很大。或许根本就不存在这样的一系列参数,能够每年赢利
 

感谢 德米特里 为本书所做的一切努力。它真的很有用。

在 neuronbase.mqh 中,你实现了下面的 ElasticNet 正则化方法,但书中却没有解释。

m_cWeights.m_mMatrix -= m_cWeights.m_mMatrix * Lambda[1] + Lambda[0]

但这与基本公式 (+) 或 Keras 源代码 (+) 不同。

请解释一下你的实现方法。为什么只使用 lambdas 而不是完整的公式,为什么用其中一个来乘权重,用另一个来求和。

Dmitriy Gizlyk
Dmitriy Gizlyk
  • 2024.07.15
  • www.mql5.com
Trader's profile