文章 "自定义品种(符号):实践基础" - 页 5

 
Mr David Frederick Roberts #:

感谢您的回复,这很奇怪,我确实使用的是真实点差模式,而且我不知道 MT5 中还有固定点差选项,所以我确定我没有(我更熟悉 MT4)。我没有注意到每一栏的点差都是一样的,事实上,查看完整文件后发现,点差似乎只在 1 分钟的边界上发生变化。 我想我的想法是正确的,即调用 SymbolInfoDouble() 时应返回 OnTick() 事件调用结果中正在处理的刻度的价格,而不是某种 M1 值?

我试着用下面的代码打印我所期望的带有毫秒的实际跳动时间,但毫秒值总是零......

编辑:正如我所说,我对 MQL5 比较陌生--我刚发现 SymbolInfoTick(),也许我应该使用它,而不是像现在这样!我试试看,看看会发生什么...


好的,这样做没有任何区别,结果完全一样,但都与终端中的 "Symbol Ticks "对话框不一致。 我说毫秒值始终为零是错误的,它在一分钟内(即午夜前一分钟)是非零的!

在我看来,这是一个相当重要的问题。 我的交易 EA 希望收到的刻度线价格与导入的源刻度线数据一致(其他人也一样!)。 我敢说我做错了什么,但如果是这样,我想知道是什么。我附上了包含测试 EA 的压缩文件、午夜两小时结果的电子表格,以及一些设置和刻度线的截图。

恐怕还不清楚您是如何创建自定义符号的。所附的 csv 文件是一样的(顺便说一下,我不知道您为什么需要两份不同名称的文件),而且格式都不对:要导入 MT5 自定义符号,tick 文件应包含以下列:日期、时间、买入价、卖出价、尾盘价、成交量。因此,如果不进行额外操作,目前无法从您的刻度线创建自定义符号。

如果您能将 MT5 UI 中导入的刻度线图片和您的 EA 日志并排张贴出来,那就更简单了。上面展示的图片并不完整,图片中的刻度看起来与 csv 文件中的不同。

 
Stanislav Korotky #:

恐怕还不清楚您是如何创建自定义符号的。所附的 csv 文件是一样的(顺便说一下,我不知道您为什么需要两份不同名称的文件),而且格式都不对:要导入 MT5 自定义符号,tick 文件应包含以下列:日期、时间、买入价、卖出价、尾盘价、成交量。因此,如果不进行额外操作,目前无法从您的 ticks 中创建自定义符号。

如果您能将 MT5 UI 中导入的刻度线图片和您的 EA 日志并排张贴出来,那就更简单了。上面展示的图片并不完整,图片中的刻度看起来与 csv 文件中的不同。

刻度线数据是从我使用 Dukascopy 数据(大小约为 8GB 的 CSV 文件)的 MT4 "刻度线数据套件 "导出的自定义符号导入 MT5 的。

我发送的 csv 文件绝不是要作为勾选数据导入,它们是我的测试 EA 的输出结果 (已随附),该 EA 记录了收到的每个 OnTick 事件的买入价和卖出价以及时间。 两者只是通过不同的方法得出 - 一个使用 SymbolInfoDouble(...) 获得买入价和卖出价,另一个使用 SymbolInfoTick(...) 获得买入价和卖出价。 两者相同的事实只是向我自己证明,方法之间没有区别。

我想说的是,测试 EA 记录的 CSV 文件中的买入价和卖出价以及时间与 MT5 UI(我也发送了)中导入的刻度线图像不一致。 所以...

  1. 用户界面截图中的刻度时间与测试 EA 记录的时间不一致 - 为什么?
  2. 除了午夜前的一分钟,测试 EA 记录的时间都是零毫秒--为什么?
  3. 虽然测试 EA 记录的买入价与 MT5 UI 中的买入价接近,但卖出价可能相差很多(因此产生了价差)--为什么?
  4. 测试 EA 记录的价格所产生的价差似乎只在一分钟界限上发生变化--为什么?
  5. 测试 EA 记录的 OnTick 事件少于 MT5 UI 中的 tick 记录 - 为什么?

在我看来,在存储库和 EA OnTick 事件之间,自定义符号的刻度数据似乎受到了干扰。

下面,我尝试将测试 EA(左侧)和 MT5 UI(右侧)记录的部分数据尽可能地对齐。 由于 EA 记录的刻度数少于 MT5 UI 中的刻度数,因此不可能将它们准确对齐。 还请注意,测试 EA 记录的毫秒值在 23:59 之前都是零。

突出显示的事件可能是同一个刻度线,但请注意测试 EA 记录的价格与用户界面中的价格不同...

EA 记录买入价 1.16504 和卖出价 1.16513(点差 = 9)

MT5 用户界面显示买入价 1.16504 和卖出价 1.16518(点差 = 14)

 
Mr David Frederick Roberts #:


你有很多 "为什么",但很难给出答案(没有猜测)。你的程序或源代码有问题。

您可以发布 8GB 滴答历史记录中的一小部分,这样就可以很容易地导入自定义符号并检查您的代码。

通常情况下,SymbolInfoTick 应该接收与您在 MT5 GUI 中看到的相同自定义符号的刻度(包括毫秒计时)完全相同的刻度。

如果处理前一个刻度点花费了太多时间,您的 EA 可能会跳过某些刻度点。这个 "过多 "时间可能非常短,因为刻度点可能来得非常快。如果您想确保历史记录中包含所有刻度线,就应该调用 CopyTicks 函数来处理前一个刻度线之后的时间段。但这不是您现在应该解决的问题--您应该首先找出当前方法的问题所在。

 
Mr David Frederick Roberts #:

使用 Dukascopy 数据(大小约为 8GB 的 CSV 文件)从我的 MT4 "跳动数据套件 "导出的跳动数据已作为自定义符号导入 MT5。

我发送的 csv 文件绝不是要作为跳动数据导入,它们是我的测试 EA(附带)的输出 ,该 EA 记录了收到的每个 OnTick 事件的买入价和卖出价以及时间。 两者只是通过不同的方法得出 - 一个使用 SymbolInfoDouble(...) 获得买入价和卖出价,另一个使用 SymbolInfoTick(...) 获得买入价和卖出价。 两者相同的事实只是向我自己证明,方法之间没有区别。

我想说的是,测试 EA 记录的 CSV 文件中的买入价和卖出价以及时间与 MT5 UI(我也发送了)中导入的刻度图像不一致。 所以...

  1. 用户界面截图中的刻度时间与测试 EA 记录的时间不一致 - 为什么?
  2. 除了午夜前的一分钟,测试 EA 记录的时间都是零毫秒--为什么?
  3. 虽然测试 EA 记录的买入价与 MT5 UI 中的买入价接近,但卖出价可能相差很多(因此产生了价差)--为什么?
  4. 测试 EA 记录的价格所产生的价差似乎只在一分钟界限上发生变化--为什么?
  5. 测试 EA 记录的 OnTick 事件少于 MT5 UI 中的 tick 记录 - 为什么?

在我看来,在存储库和 EA OnTick 事件之间,自定义符号的刻度数据似乎受到了干扰。

下面,我尝试将测试 EA(左侧)和 MT5 UI(右侧)记录的部分数据尽可能地对齐。 由于 EA 记录的刻度数少于 MT5 UI 中的刻度数,因此不可能将它们准确对齐。 还请注意,测试 EA 记录的毫秒值在 23:59 之前都是零。

突出显示的事件可能是同一个刻度线,但请注意测试 EA 记录的价格与用户界面记录的价格不同...

EA 记录买入价 1.16504 和卖出价 1.16513(点差 = 9)

MT5 用户界面显示买入价 1.16504 和卖出价 1.16518(点差 = 14)

您的 EA 收集的刻度似乎是模拟刻度,而不是真实刻度。查看策略测试仪日志。
 
Alain Verleyen #:
您的 EA 收集的刻度似乎是模拟刻度,而不是真实刻度。请查看策略测试仪日志。

感谢 Alain,我完全同意你的看法。 在用户界面中是有刻度线数据的,但当它进入 EA 时,看起来就像是它在获取找到的第一个买入/卖出价对,并在接下来的一分钟内应用该价差 - 或者其他什么。

总之,我看了一下日志(附后),但我不太确定我希望看到什么,所以如果您能看一下,看看您是否能发现问题所在,我将不胜感激。 我还附上了生成的 CSV 文件,以供参考。

非常感谢,大卫。

附加的文件:
 
Mr David Frederick Roberts #:

感谢 Alain,我完全同意你的看法。 在用户界面中是有勾选数据的,但当它进入 EA 时,看起来就好像是它找到了第一个买入价/卖出价对,并在下一分钟内应用该价差--或者其他什么。

总之,我看了一下日志(附后),但我不太确定我希望看到什么,所以如果您能看一下,看看是否能发现问题所在,我将不胜感激。 我还附上了生成的 CSV 文件,以供参考。

非常感谢,大卫。

您的日志显示 "生成每个刻度线",这意味着是人为刻度线。应该是 "根据真实刻度生成"。请查阅测试文档

同样,如果您希望别人测试您的自定义符号,请提供兼容的 CSV 文件,而不是您自己的格式。

Strategy Testing - Algorithmic Trading, Trading Robots - MetaTrader 5 Help
Strategy Testing - Algorithmic Trading, Trading Robots - MetaTrader 5 Help
  • www.metatrader5.com
The Strategy Tester allows you to test and optimize trading strategies ( Expert Advisors ) before using them for live trading. During testing, an...
 
Stanislav Korotky #:

您的日志显示 "生成每个刻度线",这意味着是人为刻度线。应该是 "根据真实刻度生成"。请查阅测试文档

同样,如果您希望别人测试您的自定义符号,请提供兼容的 CSV 文件,而不是您自己的格式。

谢谢 Stanislav,我非常感谢大家的帮助,但我毫无进展。

我查看了文档,却找不到任何东西能告诉我,为什么测试仪在有全套刻度线数据的情况下,还要生成人造刻度线!事实上,文档中写道...

在真实刻度上进行测试和优化尽可能接近真实情况。可以使用经纪商积累的真实刻度,而不是基于分钟数据生成的 刻度。这些刻度线来自交易所和流动性提供商。

我重申,CSV 文件是 输出 我重复一遍,CSV 文件是我的测试 EA 的输出,它只是写入收到的刻度线价格,与我导入到自定义符号中的刻度线数据无关,因此其格式完全无关。

好吧,我所做的...

  1. 以 MT5 格式从 MT4 "Tick Data Suite"(Tick Data Suite (eareview.net))导出欧元兑美元的刻度线数据,生成一个巨大的 CSV 文件(截图如下)。
  2. 将该文件导入 MT5 中的自定义符号,并将其命名为 EURUSD_TDS。
  3. 截图显示 MT5 UI 中的部分刻度。
  4. 编写一个测试 EA,简单地将每次 OnTick() 调用中的买入价和卖出价以及时间写入 CSV 文件(我应该叫它 TXT 文件!)。
  5. 使用我ZIP 文件中提供的截图中显示的设置, 在 EURUSD_TDS 上运行测试 EA。
  6. 将文件中的结果与 MT5 UI 中相同日期的刻度进行比较 - 两者不匹配。
  7. 求助为何不匹配。
  8. 发现测试仪显然是在生成人为的刻度线,但我还没有更进一步。



Tick Data Suite
  • eareview.net
Everything you need to make your Metatrader 4 backtests accurate, get 99% modeling quality and to immediately spot which expert advisor is worth your time. From download to backtest, everything has been streamlined in an easy-to-use format. Updated often and offering premium-level support, the Tick Data Suite also has an associated recurring...
 
Mr David Frederick Roberts #: 我检查了文档,但没有找到任何东西能告诉我为什么测试仪会在有全套刻度线数据的情况下生成人造刻度线! 事实上,文档中指出...

因为您没有在测试仪设置中选择"每个刻度线都基于真实刻度线":


 
Andrey Khatimlianskii #:

还遇到了 "HistoryCache:容器头读取错误 [0]",接着是 "HistoryBase:发现无效容器 (1970.01.01)"。

这就从自定义工具的历史记录中删除了 2022 年 1 月的历史记录,从而出现了从 12 月 31 日到今天的空白。

这种情况只出现在 2 台计算机上,资源足够。

@Slava,你需要哪些细节来重现?

又出现了。好像是在午夜的时候:

FK      3       23:59:27.790    HistoryCache    'BTCUSDT.bnf' container header read error [0]
PR      3       23:59:27.790    HistoryBase     'BTCUSDT.bnf' invalid container (1970.01.01) found (off: 3144282240, size: 86589, file: 1925419658)
HQ      3       23:59:28.071    HistoryCache    'LUNAUSDT.bnf' container header read error [0]
HD      3       23:59:28.071    HistoryBase     'LUNAUSDT.bnf' invalid container (1970.01.01) found (off: 3144242580, size: 86589, file: 1925434658)
RK      3       23:59:28.344    HistoryCache    'MANAUSDT.bnf' container header read error [0]
EJ      3       23:59:28.344    HistoryBase     'MANAUSDT.bnf' invalid container (1970.01.01) found (off: 3144247980, size: 86589, file: 1925447087)
CD      3       23:59:28.633    HistoryCache    'ATOMUSDT.bnf' container header read error [0]
KQ      3       23:59:28.633    HistoryBase     'ATOMUSDT.bnf' invalid container (1970.01.01) found (off: 3144177171, size: 86589, file: 1925399738)
HN      0       00:14:15.224    Terminal        MetaTrader 5 x64 build 3210 started for MetaQuotes Software Corp.
NS      0       00:14:15.225    Terminal        Windows 10 build 17763, 20 x Intel Xeon  E5-2650 v3 @ 2.30 GHz, 12 / 15 Gb memory, 53 / 111 Gb disk, admin, GMT+3

往哪边挖?

 
Fernando Carreiro #:

因为您没有在测试仪设置中选择"每个刻度都基于真实刻度":


啊,终于找到了 :-)

谢谢你,费尔南多,我怀疑是我做了什么蠢事,但我就是看不出来!正如我所说,我对 MT4 要熟悉得多(大约 8 年),我没有发现 MT5 中有两个"£Every Tick "选项。 我刚启动它,看到它被设置为 "Every Tick",就认为如果它有真实点差,就会使用它们。

这一定是个很简单的问题,再次感谢您的发现。

大卫