用tick数据进行回测

 

用tick数据进行回溯测试

我想我已经在metatrader中找到了一个很好的方法--我已经在这个方法中找到了一个很好的方法,但是在最后阶段却卡住了,寻求一些帮助。

1) 从一个公司(商业来源)得到的tick数据,符号。CL(石油)免费来源,如Dukascopy等,没有这个符号。
2) 使用公司的软件将这些tick数据渲染成条形格式(不损失任何分辨率)。3) 使用公司的软件,将这些tick数据呈现为条形格式(不损失任何分辨率)。

日期、时间、开盘、最高价、最低价、收盘、成交量

每个条形图中只有一个刻度!所以,对于一个给定的条形图,开盘价、最高价、最低价、收盘价都是一样的,因为条形图中只有一个刻度。

3) 我通过进入metatrader历史文件夹并删除其中的任何相关文件,将这些tick数据输入metatrader策略测试器。我在离线状态下打开metatrader,使用历史中心和导入功能来获得这些数据。当然,尽管它是tick数据--它的条形格式--它被metatrader接受了。当使用策略测试器(当然还是离线的)可以访问这些数据。

4) 但问题是:根据metatrader,在这些数据中,有多个具有相同日期和时间戳的条形图(因为metatrader忽略了秒;它认为最小的是分钟)。我认为解决这个问题的方法是改变数据,使所有的条形图都有不同的日期和时间戳(以metatrader可以接受的分辨率)。因此,举例来说,如果
一个条形图的时间戳是18:00:00,下一个条形图的时间戳是18:00:08 - 那么第二个条形图的时间戳应该被改为18:01:00。这样,它就可以被metatrader识别为下一个条形。当然,这将改变所有的时间戳(以及适当的日期戳),但我认为这并不重要。我的问题是--我怎样才能以这种方式改变所有的日期和时间戳?

当然,这些数据对Excel来说有太多的条目。我可以使用微软的Access。

也许一些脚本可以在每次进入时重复增加1秒。 但必须在上升过程中相应地改变小时数,然后当然是日期。这就是我的问题--使我陷入困境。我不知道该怎么做。


我的一个基于条形图的刻度数据的样本被剪切并粘贴在下面
(这是CL数据--甜原油期货)

日期,时间,开盘,最高,最低,收盘,成交量
20100831,18:00:00,71.70,71.70,71.70,71.70,2
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:01,71.73,71.73,71.73,71.73,2
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.73,71.73,71.73,71.73,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.75,71.75,71.75,71.75,7
20100831,18:00:01,71.75,71.75,71.75,71.75,1
20100831,18:00:04,71.75,71.75,71.75,71.75,1
20100831,18:00:05,71.74,71.74,71.74,71.74,1
20100831,18:00:05,71.75,71.75,71.75,71.75,1
20100831,18:00:05,71.75,71.75,71.75,71.75,3
20100831,18:00:08,71.75,71.75,71.75,71.75,7
20100831,18:00:09,71.75,71.75,71.75,71.75,1
20100831,18:00:10,71.75,71.75,71.75,71.75,1
20100831,18:00:10,71.75,71.75,71.75,71.75,1
20100831,18:00:10,71.71,71.71,71.71,71.71,1
20100831,18:00:11,71.70,71.70,71.70,71.70,1
20100831,18:00:11,71.68,71.68,71.68,71.68,1
20100831,18:00:19,71.71,71.71,71.71,71.71,1
20100831,18:00:19,71.71,71.71,71.71,71.71,1
20100831,18:00:19,71.69,71.69,71.69,71.69,1
20100831,18:00:19,71.69,71.69,71.69,71.69,1
20100831,18:00:19,71.68,71.68,71.68,71.68,2
20100831,18:00:19,71.67,71.67,71.67,71.67,1
20100831,18:00:34,71.72,71.72,71.72,71.72,1
20100831,18:00:34,71.72,71.72,71.72,71.72,1
20100831,18:00:35,71.72,71.72,71.72,71.72,1
20100831,18:00:37,71.72,71.72,71.72,71.72,1
20100831,18:00:56,71.71,71.71,71.71,71.71,1
20100831,18:00:56,71.71,71.71,71.71,71.71,1
20100831,18:00:56,71.70,71.70,71.70,71.70,1
20100831,18:01:00,71.71,71.71,71.71,71.71,1
20100831,18:01:02,71.72,71.72,71.72,71.72,1
20100831,18:01:11,71.71,71.71,71.71,71.71,1
20100831,18:01:12,71.71,71.71,71.71,71.71,1
20100831,18:01:13,71.71,71.71,71.71,71.71,1
20100831,18:01:16,71.70,71.70,71.70,71.70,1
20100831,18:01:26,71.70,71.70,71.70,71.70,3
20100831,18:01:26,71.70,71.70,71.70,71.70,5
20100831,18:01:28,71.70,71.70,71.70,71.70,1
20100831,18:01:33,71.71,71.71,71.71,71.71,1
20100831,18:01:36,71.70,71.70,71.70,71.70,4
20100831,18:01:45,71.70,71.70,71.70,71.70,1
20100831,18:01:46,71.71,71.71,71.71,71.71,2
20100831,18:01:46,71.71,71.71,71.71,71.71,4
20100831,18:01:49,71.71,71.71,71.71,71.71,1
20100831,18:02:19,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:26,71.70,71.70,71.70,71.70,1
20100831,18:02:26,71.70,71.70,71.70,71.70,1
20100831,18:02:39,71.74,71.74,71.74,71.74,1
20100831,18:03:10,71.74,71.74,71.74,71.74,1
20100831,18:03:29,71.75,71.75,71.75,71.75,1
20100831,18:03:34,71.75,71.75,71.75,71.75,1
20100831,18:03:34,71.77,71.77,71.77,71.77,1
20100831,18:03:41,71.78,71.78,71.78,71.78,1
20100831,18:03:41,71.78,71.78,71.78,71.78,5
20100831,18:03:41,71.78,71.78,71.78,71.78,5
20100831,18:03:41,71.79,71.79,71.79,71.79,1
20100831,18:03:44,71.78,71.78,71.78,71.78,1
20100831,18:03:50,71.78,71.78,71.78,71.78,1
20100831,18:03:52,71.79,71.79,71.79,71.79,1
20100831,18:04:14,71.79,71.79,71.79,71.79,1
20100831,18:04:14,71.79,71.79,71.79,71.79,1
20100831,18:04:14,71.80,71.80,71.80,71.80,1
20100831,18:04:14,71.80,71.80,71.80,71.80,2

请注意,我实际上可以呈现没有秒的数据,只有分钟的数据,这可能有助于解决这个问题。

20100831,18:00,71.70,71.70,71.70,71.70,2
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.73,71.73,71.73,71.73,2
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.73,71.73,71.73,71.73,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.75,71.75,71.75,71.75,7
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,3
20100831,18:00,71.75,71.75,71.75,71.75,7
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.68,71.68,71.68,71.68,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.69,71.69,71.69,71.69,1
20100831,18:00,71.69,71.69,71.69,71.69,1
20100831,18:00,71.68,71.68,71.68,71.68,2
20100831,18:00,71.67,71.67,71.67,71.67,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.72,71.72,71.72,71.72,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.70,71.70,71.70,71.70,1
20100831,18:01,71.70,71.70,71.70,71.70,3
20100831,18:01,71.70,71.70,71.70,71.70,5
20100831,18:01,71.70,71.70,71.70,71.70,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.70,71.70,71.70,71.70,4
20100831,18:01,71.70,71.70,71.70,71.70,1
20100831,18:01,71.71,71.71,71.71,71.71,2
20100831,18:01,71.71,71.71,71.71,71.71,4
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.74,71.74,71.74,71.74,1
20100831,18:03,71.74,71.74,71.74,71.74,1
20100831,18:03,71.75,71.75,71.75,71.75,1
20100831,18:03,71.75,71.75,71.75,71.75,1
20100831,18:03,71.77,71.77,71.77,71.77,1
20100831,18:03,71.78,71.78,71.78,71.78,1
20100831,18:03,71.78,71.78,71.78,71.78,5
20100831,18:03,71.78,71.78,71.78,71.78,5
20100831,18:03,71.79,71.79,71.79,71.79,1
20100831,18:03,71.78,71.78,71.78,71.78,1
20100831,18:03,71.78,71.78,71.78,71.78,1
20100831,18:03,71.79,71.79,71.79,71.79,1
20100831,18:04,71.79,71.79,71.79,71.79,1
20100831,18:04,71.79,71.79,71.79,71.79,1
20100831,18:04,71.80,71.80,71.80,71.80,1
20100831,18:04,71.80,71.80,71.80,71.80,2
20100831,18:04,71.80,71.80,71.80,71.80,1
20100831,18:04,71.80,71.80,71.80,71.80,3
20100831,18:04,71.80,71.80,71.80,71.80,17
20100831,18:04,71.80,71.80,71.80,71.80,1
20100831,18:04,71.80,71.80,71.80,71.80,4
20100831,18:04,71.79,71.79,71.79,71.79,1

 
测试仪使用FXT文件,这些文件也有秒数。不幸的是,这些FXT文件在每个连续的测试中都会被覆盖,所以用户不能把他们自己的数据放进去(在旧版本的MT4中可以->https://www.mql5.com/en/forum/103180/page6#321081)。有一个方法可以克服这个障碍...详细信息见这里 ->http://eareview.net/tick-data。
 

该网站似乎是对任何蜱虫的标准答案。

但我想做的是不同的事情(我走的是不同的路线,因为我的tick数据与该网站假设的来源不同--它有一个不同的起点,所以不适合提供的转换文件/系统的底层)。

事实上,我的方法不需要使用旧的metatrader版本。如果我是正确的。我也快成功了--我只是在最后的阶段需要帮助。

 

你怎么看?

1)我在一条有效的道路上吗?

正如我所说的--我不能使用那个网站(Birt EA)的路径,因为它对我的起始点无效。

2)如果是这样--你有什么办法来克服我的这个最后的症结吗?

 
要么是你不理解Birt的方法,要么是我不理解你,以下内容毫无意义。


mikey:

[...]

4) 但问题是:根据metatrader,在这个数据中,有多个具有相同日期和时间戳的柱子(因为metatrader忽略了秒,它认为最小的是分钟)。我认为解决这个问题的方法是改变数据,使所有的条形图都有不同的日期和时间戳(以metatrader可以接受的分辨率)。[...]

这不能解决任何问题,因为无论你在历史中心做什么,测试者总是先插值Ticks来进行回测。Birt的方法背后的主要想法是用一个包含真正的Ticks的文件来取代插值Ticks文件,让测试者进行测试。即使你在当前的尝试中成功了,测试者仍然会插值刻度来测试,所以这没有意义。


我建议你阅读这个->https://www.mql5.com/en/articles/1511,并再次翻阅Birt的教程。你的目标应该是创建一个适当的FXT文件,以取代由测试器生成的FXT文件。使用Birt的方法,你可以禁用 "重新计算",从而使测试器使用你的FXT文件(用你的真实点数)。

 

这一切都取决于这个。

1) metatrader是否只在小节内插值刻度? (我认为它是)

2) 它是在条形图的给定值的指导和约束下进行的:开盘、高点、低点、收盘?

如果[1]和[2]是真的,我认为我的方法是有效的,因为在我的方法中,每个柱子只有一个刻度。所以,开盘价、最高价、最低价和收盘价都是等值的。所以,当metatrader使用这些来插值ticks时--所有插值的ticks都被赋予完全相同的价值/价格。所以,metatrader对新刻度线的插值并不是一个问题--它不会改变任何东西。

我想我确实理解了这些问题,而且我认为我可能正走在通往我认为更好的做事方式的路上。但是,我愿意被纠正。也许我是太天真了。

 
mikey:

1) metatrader是否只在小节内插补刻度? (我认为是的)

2) 它是按照给定的条形图的值来做的:开盘、高点、低点、收盘?

如果[1]和[2]是真的,我认为我的方法是有效的,因为在我的方法中,每个柱子只有一个刻度。所以,开盘价、最高价、最低价和收盘价都是等值的。所以,当metatrader使用这些来插值ticks时--所有插值的ticks都被赋予完全相同的价值/价格。所以,metatrader插值的新点数并不是一个问题--它不会改变任何东西。[...]

我明白了...谢谢你的澄清。好吧,如果条形图有O=C=H=L和体积=1,那么确实应该只形成1个刻度。但这将意味着你正在通过平均条形体积 "拉伸 "时间尺度。尽管不同的柱子有不同的体积,但你是在 "均匀 "地拉伸它。这应该对大多数专家产生严重影响。这也意味着测试报告上的日期/时间会被拉长,交换的次数会比它应该的多无数倍。这听起来非常不可靠,我认为对大多数专家来说,它不会 "工作"。


总之,为了回答你的 "如何做 "的问题。简单地创建一个M1 HST文件,每个柱子代表一个刻度。这可以通过一个脚本完成。HST文件的结构在手册(终端帮助)中有记载,你可以重新使用csv2fxt脚本 中的一些代码。


p.s. 如果你对测试器中的插值是如何完成的感兴趣,有一篇关于MT5测试器中如何完成的好文章。应该与MT4测试器中的情况非常相似(如果不是相同的话)--https://www.mql5.com/en/articles/75。

 

作为对我上一个问题的进一步澄清。

每个勾股都有自己的M1条(有唯一的日期和时间戳的条,时间以整分钟为分辨率)。

因此,这意味着时间会被转移--一个勾股的条形图可能与该勾股实际发生的时间有很大不同。

但这对我来说不是一个问题。我不需要准确知道时间。我知道我在回溯测试 中输入了什么数据(从这一天到那一天),最后我将知道用这种方法在这段时间结束时是赚了还是亏了。(输出图上的确切日期/时间与我无关)。

再次强调--我愿意被纠正。这一切是合理的还是疯狂的?请花点时间来理解审查我所说的,而不是仅仅把我引向Birts.因为如果我能够正确地理解和转述它,并且它是合理的--我想这可能是一种更好的做事方式。

 

mikey:

[...]但这对我来说不是问题。我不需要准确知道时间。我知道我在回测中投入了什么数据(从这一天到那一天),我将在最后知道用这种方法在这一时期结束时是赚了还是亏了。(输出图上的确切日期/时间与我无关)[...] 。

好的。但你绝对确定这不会影响专家吗?例如--任何依赖时间框架考虑的专家或基于时间框架的indi将不能像它应该的那样工作。你也将不得不把交换重置为零,因为它肯定不会被正确计算。可能还有其他的副作用,我现在还没有想到......对我来说听起来非常危险。
 
顺便说一下,你将不得不取消成交量数据,因为它与MT4的计算方式无关(成交量=一个柱状图中收到的点数)。
 

是的,当我发出最后一条信息时,你的回复就出现了。

如果我的EA不 "阅读 "交易量,我是否安全?不需要担心这个问题?我没有想过成交量的问题--但正如我所说,我的EA没有 "读取 "任何东西。所以,只是想澄清一下 - 我可以忽略成交量?或者我应该把所有条形的成交量设置为1?