Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
MetaTrader 5 позволяет во встроенном тестере стратегий моделировать автоматическую торговлю с помощью экспертов на языке MQL5. Такое моделирование называется тестированием экспертов, и может проводиться с использованием многопоточной оптимизации и одновременно по множеству инструментов. Для проведения тщательного тестирования требуется генерировать тики на основе имеющейся минутной истории. В статье дается подробное описание алгоритма, по которому генерируются тики для исторического тестирования в клиентском терминале MetaTrader 5.
你说的是什么现实?实时测试?如果是这样,那么我当然同意。如果你在你的符号上挂两个EA,一切都将是正确的。但我正在测试多币种模式。而只用OnTimer()(10秒)显示了相同的结果。
我说的是在多币种模式下的真实运行(在设置为每个符号的EA(在每个EA中)进行N个符号的交易)--那会给出一个真实的估计,在测试者的情况下,你主要是比较测试模式,而不是每个多币种tick处理方法的正确性。如果不同的模式都是基于测试者的人工环境,那么比较它们的意义何在?运行结果的同一性并不是声称它在交易方面给出了最正确的结果的理由,它是测试者内在工作方面的最佳结果。
让我们从正确的措辞开始。在原来的例子中,你会想要 "在欧洲美元交易"。事实上,自定义事件 来自两个符号,在事件处理程序中,当收到来自这两个符号中任何一个的事件时,TradeSignalCounter()+TradePerformer()被调用。我们可以假设,事件队列总是满的。
现在你已经删除了一个信号源,但出于某种原因在事件处理程序中输入了"if(sparam == Symbol_01) "的检查。但下一个问题是不同的。从代码来看,Lizar的方案是在 "所有刻度 "模式下使用的,信号源(EURUSD)的每个刻度都会调用TradeSignalCounter()+TradePerformer()函数。有趣的是,已经暗示了事件队列可能溢出的问题。但我想知道这两个函数的Symbol_01参数使用的是什么仪器,以及你是否尝试过改变Lizar方案中事件的周期性。
是的,这就是我想做的事。毕竟,我们采取的每一个行动都是由我们的欲望引发的。在这种情况下,我得到的正是我想要的东西。也就是说,我们只在欧元兑美元 上进行交易,因为TradePerformer()函数检查是否允许对符号数组中的每个符号进行交易。这个选项位于外部变量中,当时使用GBPUSD 符号的交易是被禁止的。用户事件来自两个符号,但在事件处理程序中,同样,TradePerformer()函数只允许在EURUSD 符号上交易。TradePerformer()函数还包含一个函数,用于确定某一特定符号(本例中为欧元兑美元)是否出现了新条形。你关于事件队列一直是满的假设是正确的,但在这种情况下,所有的东西都被单独处理了,当在日线上测试时,晚一个 tick 并不重要。
去掉一个信号源,也就是不应该参与测试的信号源,只能证实之前的一切都做得很正确。当我检查结果时,"if(sparam == Symbol_01) "的检查仍然存在,没有删除不应该进行测试的信号源,但应该从该信号源进行测试。这个检查结果实际上甚至是多余的。结果并没有改变。欧元兑美元 的符号被用作Symbol_01 参数。我试着改变事件的频率,但没有任何改变。更准确地说,我可以说,所有刻度线模式是最准确的。
我说的是在多币种模式下的真实运行(在设置为每个符号的EA(在每个EA中)进行N个符号的交易)--那会给出一个真实的估计,在测试者的情况下,你主要是比较测试模式,而不是每个多币种tick处理方法的正确性。如果不同的模式都是基于测试者的人工环境,那么比较它们的意义何在?相同的运行结果不允许我们说它从交易的角度给出了最正确的结果,从测试者的内部机制的角度来看,它是最佳的。
现在我明白了。但讨论最初是集中在测试员的测试上。在你开始交易之前,你需要测试该系统。测试越准确,你在实际交易中就越有信心。这里介绍的测试结果表明,测试可以做对,也可以做错。现在,每个人都有选择权,可以自己决定什么是正确或错误。一位交易员曾正确地说过(如果我没记错的话,是范-萨普):"我们用我们的感知进行交易"。我可以补充一下。我们不仅仅是交易我们的想法。我们甚至是靠我们的感知来生活。))
如果我们在实际交易或测试中为每个符号分别附加一个专家顾问,那么它将是最准确的。当然,我同意这一点。但是,在酒吧同步化中没有必要这样做。准确度将伴随着持续时间。你可以在测试器中估计长的历史时期。而我个人更愿意看到正确的测试结果。
我还想再强调一点:我从不排除我可能在某处出错的可能性,我总是检查一切。但是,即使在最艰难的测试之后,当第一眼看上去一切都正确时,我仍然不排除可能在某处有错误。在这一点上,如果有人不同意对所提出的那些测试方法的结果的评估,你需要提供你自己的测试结果来进行比较。毕竟,这个主题的目的是找出如何做正确的 事情,或者更准确地说,如何正确地测试多货币专家顾问,而不是只在文字上找出谁对谁错。事实,只有事实,除了事实,别无他法。)))
如果不同的模式都是基于人为的测试者环境,那么比较它们的意义何在?
关键是要根据结果做出正确的决定。我当然也不认为分析扭曲的数据有什么意义。毕竟,种瓜得瓜,种豆得豆)。
去掉一个信号源,也就是不应该参与测试的信号源,只能证实之前的一切都做对了。
"......以前做得很好 "是属于自以为是的范畴。这首先是错误的。你似乎并不重视 "事件队列拥挤 "这样的现象。特别是在涉及到事件的后传时。请看一下关于这个问题的参考材料和论坛。关键字是 "排队"。
...我只在欧元兑美元 上进行交易,因为TradePerformer()函数检查是否允许对符号数组中的每个符号进行交易。这个选项位于外部变量中,当时禁止在GBPUSD 符号上交易。用户事件 来自两个符号,但在事件处理程序中,同样,TradePerformer()函数只允许在EURUSD 符号上交易。TradePerformer()函数还包含一个函数,用于确定某一特定符号(本例中为欧元兑美元)是否出现了新条形。你关于事件队列一直是满的假设是正确的,但是在这种情况下,所有的东西都被单独处理了,当在日线上测试时,一个 tick 的延迟并不重要。
由于TradeSignalCounter()+TradePerformer()只处理了一个信号源的事件,队列状态及其可能的溢出根本没有变化。换句话说,"禁止按GBRUSD符号处理事件 "根本没有从队列中删除相应的事件。我第三次提请注意这个问题:"已经暗示了事件队列中可能出现的溢出" :)如果你认为这只是关于 "晚了一格",那么这种结论的依据是什么?
"......在这种情况下,一切都要单独处理"。问题是,在最初的版本中,当收到来自两个信号源的事件时,事件处理程序会调用函数,然后这些函数已经过滤掉了来自 "不必要 "的信号。但这些函数每次都被调用(!)。
在日线上测试时,延迟一个刻度并不重要。
事件处理程序在哪个时期被测试并不重要。如果Lizar的方案是逐次产生信号,那么他们也是逐次对事件队列进行评分,而不是一天一次。
"我试着改变事件的频率,但这并没有带来任何变化。更准确地说,我可以说,所有刻度线模式是最准确的。" 你能否提供关于Lizar非刻度线模式的比较截图?
如果你在真实交易或测试中把EA分别放在每个符号上,这将是最准确的选择。当然,我同意这一点。但是,没有必要使条形图同步化。准确度将伴随着持续时间。你可以在测试器中估计长的历史时期。而我个人更愿意看到正确的测试结果。
关键是要根据结果做出正确的决定。但我绝对看不出分析损坏的数据有什么意义。毕竟,种瓜得瓜,种豆得豆)。
我想指出的是,"正确性 "的范畴现在已经被测试者运行的身份所取代,但这并不意味着这种数据的扭曲程度会降低。特别是,你现在选择了一个10秒的间隔,这无疑比例如5秒或1秒的间隔更失真。也就是说,你是在利用测试仪工作条件中的某些特性,使你获得了10秒计时器的首选方法。你真正想用计时器事件做的是 "捕捉 "所有工具上的新条形 符号的到来,很明显,做到这一点的最好方法是OnTick事件。
不要浪费你的时间。你永远不会在蜱虫上得到一个完美的匹配。一个小节的闭合时间对不同的乐器来说是不同的。
对于一个工具来说,当前时间是条形收盘的时间,对于另一个工具来说,条形还没有形成,而对于第三个工具来说,它已经在几个点之前形成。
看一下tick历史,tick的数量在不同的仪器上有很多不同。
Yedelkin 2011.08.25 08:16 #
"......以前的一切都做得很好 "是属于自满的范畴。
---
早晨好!))
除了这个单独撕掉的短语外,我还写道:"。我从不排除我在某处出错,我总是检查一切。但是,即使在最艰难的检查之后,当第一眼看上去一切正常时,我仍然不能排除在某处可能存在错误的可能性"。我应该补充的是,我不是那种认为自己对所有事情都是正确的人。)))
---
耶德尔金。
这本来就是错误的。显然,你并不重视 "事件队列拥挤 "这样的现象。特别是在涉及到事件的后传时。请看一下关于这个问题的参考材料和论坛。关键字是 "排队"。
---
看了一下定时器 的主题。我强调的关键点是。
1.当一个事件正在被处理时,其他事件可能不会被处理。
2.如果事件栈溢出,旧的事件就会从队列中删除而不被处理。
让我们按顺序来看看。有一个事件的列举。
在初始化时,指定我们将从哪个符号接受事件,以及我们将接受哪个事件。
也就是说,我们将只接受来自欧元兑美元 符号的CHARTEVENT_TICK 事件。没有其他符号。
测试已经开始。当任何事件发生时,程序进入OnChartEvent()函数,声明交易信号的变量数组,并检查该事件。如果这是一个自定义的事件,程序在TradeSignalCounter()中确定信号,然后在TradePerformer()函数中检查是否发生了一个新的柱状体,然后根据这个决定其他条件。该功能已停止工作,只有在欧元兑美元 图表上发生事件时才会开始工作。换句话说,在这种情况下是打钩。
耶德尔金。
从TradeSignalCounter()+TradePerformer()只处理一个信号源的事件来看,事件队列的状态及其可能的溢出并没有任何变化。换句话说,"禁止按GBRUSD 符号处理事件 "根本没有从队列中删除相应的事件。我第三次提请注意这个问题:"已经暗示了事件队列中可能出现的溢出" :)如果你认为它只是 "晚了一格",那么这种结论的依据是什么?
---
所列功能的执行速度非常快。没有事件队列溢出,没有重大事件被遗漏。而如果队列甚至溢出,事件被错过,我们会错过什么?一支烟,两支烟,三支烟?那么它是什么呢?这在白天的酒吧里是微不足道的。
---
耶德尔金。
问题是,在原来的版本中,当事件来自两个信号源时,事件处理程序会调用函数,然后这些函数已经过滤掉了来自 "不必要 "的信号。但这些函数每次都被调用(!)。
---
你为什么要紧紧抓住这第二个来源呢?)再也没有第二个来源了。有一个--欧元兑美元,但专家顾问从英镑兑美元 图表到欧元兑美元 交易。而结果是完全错误的。一个副本。也就是说,它们与第二个来源存在的情况相同。)))
-----------
最好是自己做测试,展示测试结果,并写下(简单的)你为获得正确的测试结果所做的工作,当然如果你能做到这一点。最简单的专家就可以做这个测试。通过任何条件进入,止损,获利。让它成为过去10年的日线。而你将亲眼看到。有些时期会重合,有些则不会。打开结果图,看看不匹配的地方。
怎么就不需要在网上做吧台同步了呢!?
因为你在这之前就写了。
营销人员。
我说的是在多币种模式下的真实运行(在EA中对N个符号进行交易(在每个EA中)设置为每个符号)--这给出了一个真实的估计...
由此我理解,你所说的真实运行是指在线测试,当几个EA在运行时,每个EA都直接在自己的符号上徘徊。如果这是你的意思,那么有一个问题。在这种情况下,如果每个专家顾问都位于自己的符号上,为什么我们需要同步条形图?也许,在这种情况下,如果交易系统的组织方式是同时对几个符号做出决定,那么在这几个符号上必须形成条形的同步。我的意思是在一个符号(任何符号)上的同时在几个符号上独立交易。
营销人员。
所有这些在测试器中的实验对于估计在线交易是必要的,这个主题的问题不是关于测试器(模拟在线),而是在线,首先是在线条形同步的需要(对于适当的专家顾问)。
对我来说,试验者的实验对于评估历史上的交易结果是必要的。而我对网上交易的选择取决于这一评估。因此,这个话题的问题是测试器的问题,而不是在线问题,这就是为什么我们在测试器中也需要同步条形图(对于相应的专家顾问)。一些镜像图片))))
营销人员。
我想指出的是,"正确性 "类别现在已经被测试者运行的身份所取代,但这并不意味着这类数据的倾斜程度会降低。特别是,你现在选择了一个10秒的间隔,这无疑比例如5秒或1秒的间隔更失真。也就是说,你是在利用测试仪工作条件中的某些特性,使你获得了10秒计时器的首选方法。
是的,间隔越小,结果越准确。但是,实际上它是必要的,至少对我来说,是为了最后的测试。而对于初步的,我还是同意Vladimir(MetaDriver)的观点,即一分钟的间隔已经足够了。
营销人员。
实际上,通过定时器事件,你试图 "捕捉 "所有符号上新条形 符号的到来,很明显,最好的方法是OnTick事件。
在这里你可以看到,你没有仔细阅读该主题的第一篇帖子。不是用定时器事件,而是用OnChartEvent()。或者说是误印?
由此我理解,你所说的真实运行是指在线测试,即几个EA在运行,每个EA都直接挂在自己的符号上。如果这是你的意思,那么有一个问题。在这种情况下,如果每个专家顾问都位于自己的符号上,为什么我们需要同步条形图?也许,在这种情况下,当交易系统被设计成同时根据几个符号做出决定时,条形图的同步是必要的,所以这几个符号的条形图应该形成。
它大约是这样的。
在这里你可以看到,你没有仔细阅读该主题的第一篇帖子。不是用定时器事件,而是用OnChartEvent()。或者说是误印?
为什么应该是这样?你把OnTimer作为第三个数字。在这个问题上你已经被引用过了:你只需要实现一个能够正确执行测试的方法。你有了。这是有最小间隔的 OnTimer()函数。所以你一定有别的想法。
有一个--欧元兑美元,但专家顾问从英镑兑美元 的图表上交易欧元兑美元。而结果是完全错误的。
如果这对你来说很重要,我还是建议你去问问开发者,5中的fxt-file的类似物是什么。我已经写过,很可能是为不同的测试生成了不同的勾股基数。