你在代码中添加了哪些调试打印语句,以找出正在执行和未执行的内容? 例如,是OrderClose()失败了,还是导致OrderClose()的代码问题? 你是否注意到返回值并打印任何相关错误?
你可以用TimeDayOfWeek() 代替。
>我正在运行这段代码[b]来关闭交易:[/b] 。
Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
>注:问题是,所有的交易在周一至周四保持开放,直到23:57。 另外,所有的交易在周五 保持开放,直到21:57。
这是初学者一个非常常见的错误;试图将整个逻辑表达式放在一行中。这是不可能进行调试的。
诀窍是将测试分解成小块,并检查每一点(用Print 语句或其他方式)。
你能让它在任何一天的23:57之后关闭吗?没有必要担心这个测试的星期数。一旦你得到一个正确的测试,你就可以变得更冒险了。但在可能的情况下使用几行,以便在两者之间使用Print 语句进行调试。当它工作时,删除Print 语句,但将代码留在单独的行上。当代码写在多行上时,实际上效率更高(运行更快)。
Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
你是指其中的哪一个?
总是完全用括号,或简化和自我记录Day() == 1 || Day() == 2 || Day() == 3 || ( Day() == 4 && TimeHour(TimeCurrent()) >=23) && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
#define HR2157 79020 // 21 * 3600 + 57 * 60 #define HR2357 86220 datetime now = TimeCurrent(); int tod = now % 86400; bool isFriday = TimeDayOfWeek(now) == 5; if (isFriday) int todClose = HR215700; else todClose = HR235700 if (now >= todClose) ...
- https://www.mql5.com/en/forum/127483 报告说DayOfWeek()在测试器中总是返回5,所以我只使用Timexxx()版本。
- 你是指其中的哪一个?
你在你的代码中添加了哪些调试打印语句,以找出正在执行和未执行的内容? 例如,是OrderClose()失败了,还是导致OrderClose()的代码问题? 你是否注意到返回值并打印任何相关错误?
你可以使用TimeDayOfWeek() 来代替。
我没有使用Print语句来达到这样的目的。 我在原帖中打错了字。 我使用的工具[b]不能[/b](我原来打的是 "可以")使用MQL函数,如Print,或Comment。 所以,我为这个打字错误道歉,它影响了你的回复。
然而,我可以很容易地查看测试者日志,看到EA在应该准备的时候(00:00)没有准备任何交易,在应该的时候(周一至周四23:59,或周五21:57)也没有实例化任何交易的收盘。 基本上,我可以看到EA在测试器运行时加载,关于模拟账户的必要信息,最后,我可以看到EA使用的指标的所有时间框架都被正确加载,没有错误。 我的EA通常不会出现任何形式的错误,无论如何。 而且,我一直在测试多时间框架的EA。
我似乎只在Time()函数上出了问题。
由于唯一被打开的头寸是EA在点击测试者开始按钮后看到的第一笔交易,我无法从打印或评论的输出中告诉你Day()是否在工作。 然而,作为一个随机测试,我从控制周一至周五00:00开仓的代码段中删除了[b]TimeMinute(TimeCurrent()) <= 05[/b]一行。 当我这样做时,下面的代码开始按设计工作。
Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent() ) >=23 && TimeMinute(TimeCurrent() ) >=57 || Day() == 5 && TimeHour(TimeCurrent() ) >=21 && TimeMinute(TimeCurrent() >=57
这告诉我,事实上,Day()确实是通过推理工作的。 事实上,关闭头寸的那段代码,确实在工作。 但是,由于某些原因,当[b]TimeMinute(TimeCurrent())<=05[/b]被用于控制开仓的那段代码时,就不行了。 这种讽刺对我来说毫无意义--我不明白为什么会出现这种情况。
谢谢
cfx
>我正在运行这段代码[b]来关闭交易:[/b] 。
>注意:问题是,所有的交易在周一至周四都保持开放,直到23:57。此外,所有的交易在周五也保持开放,直到21:57。
这是初学者非常常见的错误;试图将整个逻辑表达式放在一行中。这是不可能进行调试的。
诀窍是将测试分解成小块,检查每一点(用Print 语句或其他方式)。
你能让它在任何一天的23:57之后关闭吗?对于这个测试,没有必要担心星期几的问题。一旦你得到一个正确的测试,你就可以更冒险了。但在可能的情况下使用几行,以便在两者之间使用Print 语句进行调试。当它工作时,删除Print 语句,但将代码留在单独的行上。当代码写在多行上时,实际上效率更高(运行更快)。
顺便感谢大家的回答
关闭控件可以工作。当我把[b]TimeMinute(TimeCurrent()) <= 05[/b]从打开控制中删除后,它确实起作用了。点击测试器启动按钮后执行的第一个仓位,确实在23:57(周一至周四)被关闭。问题是,在00:00没有新的头寸被打开,因为打开控件的设计要求([b]TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent() <= 05[/b].即使我把[b]TimeMinute(TimeCurrent() <=5[/b]]函数 去掉,也只是作为一个理智的检查。
我认为使代码尽可能紧凑是最好的选择,但我将尝试扩展每个函数、段、组件等,看看是否有帮助。
谢谢!
cfx
- 你是指其中的哪一个?
总是完全用括号,或者简化和自我记录 - https://www.mql5.com/en/forum/127483 report DayOfWeek()在测试器中总是返回5,所以我只使用Timexxx()的版本。
我的意思是。
( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
这段代码中似乎少了一个小括号。 如果你能为我纠正,我会很感激。 我使用的工具让我知道什么时候少了一个小括号,但它没有告诉我在哪里。
谢谢!"。
OP显然是指除周五以外的所有工作日的OR。显然,他是想在交易日结束前强制收盘,但周五的时间更短。他没有意识到,使用四天的OR的测试是多余的,因为如果时间在23:57之后,我们总是可以关闭。周五不需要被排除在外!
我必须把星期五隔离出来,否则周一至周四的收盘时间和周五的收盘时间之间的区别将是零。 这两个关门时间都是由它们发生的星期几 来区分的,而不仅仅是它们发生的时间。
因此,我需要分别在周一至周四的23:57和周五的21:57关闭。 如果我把周五的收盘时间和周一至周四的收盘时间包括在一起,那么所有的交易都将在EA看到的最早时间关闭,这将是21:57,比周一至周四的规定收盘时间整整早了两个小时。
请澄清你的说法。 谢谢!
cfx
LOL!
我开始认为,MT4中大部分基于 "时间 "的功能都存在严重缺陷。
我的意思是,如果我把我所有的仓位控制逻辑重置为像这样平凡的东西。 TimeHour(TimeCurrent()) == 23 &&TimeHour(TimeCurrent()) == 59,而我却无法关闭任何一笔交易(EA根本无视这些代码!),那么我认为MT4在这些类型的功能方面有一些问题需要纠正。
我还使用以下方法进行了一系列测试。DayOfWeek() !=0 && DayOfWeek() !=,周一到周五没有一笔交易会开仓!事实上,没有一笔交易会开仓。 事实上,根本就没有一笔交易开仓。 但是,当我完全删除所有基于时间的功能时,你认为EA发生了什么? 当然,它按设计运行,没有错误。 我不是MQL的开发者,但我真的很擅长开发逻辑结构,当我感觉到一个系统性的问题时,我可以发现它。 我感觉到MetaQuotes的Time()函数有问题,就是这样。 我不可能对如此容易编码的东西如此无知,我已经看到其他用MQL编码的人对MT4中基于时间的函数有困难。
我不知道问题出在哪里,但当从开盘控制逻辑(控制所有交易开盘的那段代码)中移除TimeMinute(TimeCurrent())<=05时,我只得到第一笔交易在正确的时间收盘,但由完全相同的开盘控制逻辑驱动的所有其他交易随后被EA立即忽略,那么我知道这个函数本身存在系统问题。
代码不能再简单了! 我正在指示EA在00:00和00:05之间打开该死的交易。 这并不是一个困难的代码。 一个六岁的孩子都能写出这样的代码。 这里又是如此。 [b]TimeHour(TimeCurrent()) == 00 &&TimeHour(TimeCurrent()) <= 05[/b]。
就这样。 我刚刚编码了。 然后我把这段代码放到我使用的工具中,工具告诉我,代码的语法是正确的!这就是我的代码。 好吧,现在怎么办? 好吧,我把这该死的.ex4文件编译了一百万次,然后运行M4测试器。 好了,现在怎么办? 好吧,第一笔交易在00:00启动了。 真棒,对吗? 不!不!不!不!不 为什么? 因为在星期一的23:59,这个该死的位置仍然是开放的。 然后呢? 好吧,在下一个交易时段的00:00(下一个D1条),好的[b]TimeHour(TimeCurrent()) == 00 &&TimeHour(TimeCurrent()) <= 05[/b]将拉过收盘控制失败的地方,对吗? 错了! 为什么? 因为,在00:00到00:05,EA从来没有开过任何该死的交易!!!。
我在这个简单的代码上花了两(2)天的时间,没有人能够告诉我为什么它不能工作--甚至连MQL专家也不能!这告诉我,MetaQuotes有问题。 这告诉我,MetaQuotes有一个问题。
好了,我现在发泄完了。 那是两天来被压抑的挫折感,我必须把它发泄出来。
我的EA从来没有出现过问题,而且我已经能够使用除W1和MN之外的所有时间框架来进行一些相当复杂的设计。 我所有的EA都使用 我从头开始建立和研究的iCustom 设计。
突然间,在我像一个上了油的、调校良好的V8引擎一样运行之后,我开始使用Time()函数,所有的地狱都崩溃了? 这里面有些地方不太对劲。 我以最简单的方式使用这些基于时间的函数,但它们还是不能工作? 在这样的事情上花费48小时,对我来说是浪费了大量的时间。 我很沮丧,也很生气,我将尝试在没有 "时间 "的情况下生活,如果可能的话。
我将不得不学习如何围绕Time()函数开发交易逻辑。
虚幻。
LOL!
我开始觉得MT4中大部分基于 "时间 "的功能都有严重缺陷。
我的意思是,如果我把我所有的仓位控制逻辑重置为像这样平凡的东西。TimeHour(TimeCurrent()) == 23 &&TimeHour(TimeCurrent()) == 59,而我却无法关闭任何一笔交易(EA根本无视这些代码!),那么我认为MT4在这些类型的功能方面有一些问题需要纠正。
我还使用以下方法进行了一系列测试。DayOfWeek() !=0 && DayOfWeek() !=,周一到周五没有一笔交易会开仓!事实上,没有一笔交易会开仓。事实上,根本就没有一笔交易开仓。但是,当我完全删除所有基于时间的功能时,你认为EA发生了什么?当然,它按设计运行,没有错误。我不是MQL的开发者,但我真的很擅长开发逻辑结构,当我感觉到一个系统性的问题时,我可以发现它。我感觉到MetaQuotes的Time()函数有问题,就是这样。我不可能对如此容易编码的东西如此无知,我已经看到其他用MQL编码的人对MT4中基于时间的函数有困难。
我不知道问题出在哪里,但是当从开盘控制逻辑(控制所有交易开盘的那段代码)中移除TimeMinute(TimeCurrent())<=05时,我只得到第一笔交易在正确的时间收盘,但是由完全相同的开盘控制逻辑驱动的所有其他交易随后都被EA忽略了,那么我知道这个函数本身存在系统问题。
代码不能再简单了!我正在指示EA在00:00和00:05之间打开该死的交易。这并不是一个困难的代码。一个六岁的孩子都能写出这样的代码。这里又是如此。[b]TimeHour(TimeCurrent()) == 00 &&TimeHour(TimeCurrent()) <= 05[/b]。
就这样。我刚刚编码了。然后我把这段代码放到我使用的工具中,工具告诉我,代码的语法是正确的!这就是我的代码。好吧,现在怎么办?好吧,我把这该死的.ex4文件编译了一百万次,然后运行M4测试器。好了,现在怎么办?好吧,第一笔交易在00:00启动了。真棒,对吗?不!不!不!不!不为什么?因为在星期一的23:59,这个该死的位置仍然是开放的。然后呢?好吧,在下一个交易时段的00:00(下一个D1条),好的[b]TimeHour(TimeCurrent()) == 00 &&TimeHour(TimeCurrent()) <= 05[/b]将拉过收盘控制失败的地方,对吗?错了!为什么?因为,在00:00到00:05,EA从来没有开过任何该死的交易!!。
我在这个简单的代码上花了两(2)天的时间,没有人能够告诉我为什么它不能工作--甚至连MQL专家也不能!这告诉我,MetaQuotes有问题。这告诉我,MetaQuotes有一个问题。
好了,我现在发泄完了。那是两天来被压抑的挫折感,我必须把它发泄出来。
我的EA从来没有出现过问题,而且我已经能够使用除W1和MN之外的所有时间框架来进行一些相当复杂的设计。我所有的EA都使用我从头开始建立和研究的iCustom设计。
突然间,在我像一个上了油的、调校良好的V8引擎一样运行之后,我开始使用Time()函数,所有的地狱都崩溃了?这里面有些地方不太对劲。我以最简单的方式使用这些基于时间的函数,但它们还是不能工作?对我来说,在这样的事情上浪费48小时是一个巨大的时间量。我很沮丧,也很生气,我将尝试在没有 "时间 "的情况下生活,如果可能的话。
我将不得不学习如何围绕Time()函数开发贸易逻辑。
虚幻。
大笑。你才是那个不真实的人。你的这段代码...
if (TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05)
...永远不会返回真实。
你才是那个需要进一步发展 "你的 "逻辑结构的人。
而构建这个......
if (TimeHour(TimeCurrent()) >= 00 && TimeHour(TimeCurrent()) <= 05)
这是我的第一个帖子。 首先,请注意,我不是一个MQL的开发者。 我是一个交易员,使用一个工具来帮助我建立EA。 该工具允许使用一些MQL结构,但它不执行明确的MQL函数。 它只是接受MQL代码,评估基于MQL的条件是否为真/假,然后执行自定义函数,如OpenBuy, OpenSell, CloseBuy, CloseSell, DeletePendingBuy, DeletePendingSell,等等。 但是,它不会明确地运行MQL代码。 例如,你可以使用打印或评论功能,让一些东西出现在MT4的图表窗口(只是一个例子)。
所以,我对MQL有一点了解,这刚好让我能够使用我用来建立EA的开发工具。 到目前为止,我已经使用该工具建立了10个EA,由于非盈利性而放弃了其中的7个,这比我以前在Excel中建立交易系统时的成功原型率要好30%左右。 我通常预计10个想法中的7-8个不会像预期的那样有利可图,剩下2-3个设计的利润足以开始优化过程。 好了,关于我和我的工作方式就说到这里。
这是我的问题,我希望我来到了正确的地方寻求帮助
我正在运行这段代码[b]来关闭交易:[/b] 。
Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent() ) >=23 && TimeMinute(TimeCurrent() ) >=57 || Day() == 5 && TimeHour(TimeCurrent() ) >=21 && TimeMinute(TimeCurrent() ) >=57
注意:问题是,所有的交易在周一到周四都保持开放,直到23:57。 另外,所有的交易在周五保持开放,直到21:57。
我也在通过MQL块运行这段代码[b]来打开交易:[/b]
TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05
注意:唯一在00:00和00:05之间打开的交易,是回测的第一笔交易,当点击测试者开始按钮。 该交易正好在00:00打开。 然而,在本周晚些时候,其他交易都没有在00:00和00:05之间打开。
综上所述。
- 在点击测试者开始按钮后,有一笔交易在00:00点开盘。
- 随后在23:57(周一至周四)或21:57(周五)没有交易被关闭。
- 在00:00至00:05之间,没有任何交易随后被打开。
上面显示的所有时间都有充足的可用tick流量。 因此,在Tester使用的数据中没有任何空白。
希望能得到任何帮助。 为什么这些交易不能在编码的时间关闭? 从周一到周五,00:00到00:05之间总是有交易信号,为什么没有交易被执行?
谢谢您的帮助!
cfx