任何新的软件产品都不可避免地包含有错误,即使是最彻底的内部测试也不一定能发现这些错误。这就是为什么我们非常重视所有用户在我们的软件中发现的问题的报告,并试图对每一个问题作出回应。
如果先有一个错误的反应,然后我们就忽略它,我们怎么能沟通。应用2016.06.22 08:06,#1499568
也许社区可以解释一些事情?
这里是EA代码的一部分。里面有 void OnTick()。
bool openNew, newDay, newHour; if((int)mqlDateTime.hour == startHour) // startHour = 0 Это условие выполнено. { newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); // if(newDay) Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour); if(newHour) Print("***** newHour ", newHour); // Судя по распечатке newHour = true if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ. { openNew = openNew_or_No(); Print("***** openNew ", openNew, " ***** PositionsTotal ", PositionsTotal()); // Эта распечатка отсутствует if(openNew || PositionsTotal() == 0) // Продолжение кода... // На несоответствие количества открывающих и закрывающих фигурных скобок прошу не обращать внимания.
这就是 "专家 "标签的内容。
2016.06.22 00:00:44.531 Toad Green (EURUSD,M15) ***** newHour true 2016.06.22 00:00:44.331 Toad Green (USDJPY,M15) ***** newHour true 2016.06.22 00:00:18.361 Toad Green (EURUSD,M15) ***** newDay true mqlDateTime.hour 0 2016.06.22 00:00:12.770 Toad Green (USDJPY,M15) ***** newDay true mqlDateTime.hour 0
从21.06的日志文件的第一行可以清楚地看到,上述代码工作正常。
GM 0 00:00:30.116 Trades '3265046': instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55) NK 0 00:00:30.246 Trades '3265046': accepted instant buy 0.01 EURUSD at 1.13188 tp: 1.13388 (deviation: 55) IE 0 00:00:30.246 Trades '3265046': deal #73303810 buy 0.01 EURUSD at 1.13188 done (based on order #87892298) KI 0 00:00:30.246 Trades '3265046': order #87892298 buy 0.01 / 0.01 EURUSD at 1.13188 done in 130 ms ON 0 00:00:30.256 Trades '3265046': instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55) LQ 0 00:00:30.366 Trades '3265046': accepted instant sell 0.01 EURUSD at 1.13093 tp: 1.12893 (deviation: 55) HG 0 00:00:30.376 Trades '3265046': deal #73303813 sell 0.01 EURUSD at 1.13093 done (based on order #87892301) RK 0 00:00:30.376 Trades '3265046': order #87892301 sell 0.01 / 0.01 EURUSD at 1.13093 done in 120 ms MJ 0 00:00:30.376 Trades '3265046': modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462 GK 0 00:00:30.476 Trades '3265046': accepted modify #87608748 sell 0.01 EURUSD sl: 0.00000, tp: 1.12031 -> sl: 0.00000, tp: 1.12462 OK 0 00:00:30.486 Trades '3265046': modify #87608748 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 107 ms OH 0 00:00:30.486 Trades '3265046': modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462 GJ 0 00:00:30.586 Trades '3265046': accepted modify #87892301 sell 0.01 EURUSD sl: 0.00000, tp: 1.12893 -> sl: 0.00000, tp: 1.12462 KI 0 00:00:30.596 Trades '3265046': modify #87892301 sell 0.01 EURUSD -> sl: 0.00000, tp: 1.12462 done in 109 ms EN 0 04:20:25.608 Trades '3265046': deal #73317674 sell 0.01 EURUSD at 1.13388 done (based on order #87906853)
EA休息到第二天的开始。
21.06的日志文件的最后2行
OD 0 23:09:20.196 Network '3265046': scanning network for access points NR 0 23:09:33.496 Network '3265046': scanning network finished
和从22.06开始的日志
PM 1 02:13:39.422 Network '3265046': connection to MetaQuotes-Demo lost GF 2 02:13:39.582 MQL5.community authorization failed DO 2 02:13:39.682 MQL5.community authorization failed IP 2 02:13:40.052 MQL5.community authorization failed PK 0 02:13:43.252 Network '3265046': authorized on MetaQuotes-Demo through Access Point RU Moscow (ping: 117.48 ms) DI 0 02:13:43.252 Network '3265046': previous successful authorization performed from 31.173.80.184 on 2016.06.21 14:55:11
如果你同时打印了NewDay和NewHour,它们在日志中应该是相邻的。在同一时间
很抱歉给你带来不便,我没有注意到时间。那么,为什么在新的一天的第一根柱子出现时,它--也是新的一小时和新的一分钟的第一根柱子,同一个函数返回一个真,一个假,而当它想返回时,又能正确返回?
请解释一下这个功能有什么问题?
/*****************Определение появления нового бара******************/ class cNewBar { public: bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime & m_tOld) { datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE); if(tNew > m_tOld) { m_tOld = tNew; return(true); } return(false); } }; /********************************************************************/为什么一切都在正常工作了很多个星期,突然间就出问题了呢?
支持团队 2016.06.22 11:31
这个功能不能重复使用,因为
m_tOld = tNew;
Alexey Viktorov 2016.06.23 10:17
我昨天没有立即理解的东西......毕竟,变量m_tOld是通过引用传递的,它是在全局变量的层面上声明的,如果不同的变量通过引用传递给函数,应该不会影响到多次调用。难道不是这样吗?首先,为什么它在测试器和调试器中工作正常,而在模拟账户中却不工作。
这张支票是怎么回事?
if(tNew > m_tOld)
支持团队 2016.06.23 10:24
连续调用你的函数2次。如果在第一次调用时返回真,在下一次调用时将返回假,即使你在同一个tick上调用它。
Alexey Viktorov 2016.06.23 10:36
好吧,它被称为。所有需要的代码我都提供了。为什么在测试器和调试器中,以及在演示中,它不能按照你的要求进行阻止?这就是我不能理解的地方。好 吧,如果在测试器中偶尔会出现这样的问题,我们可以也应该寻找新的方法,但测试器中没有问题......
同样,我没有在mql4上使用相同的功能保存过EA,但没有问题。这个问题只出现在mql5中。Alexey Viktorov 2016.06.23 10:41
那么?所以测试...因为在检查之前,变量tNew被分配了一个值,它与通过引用传递的变量进行比较,而不是与m_tOld变量本身进行比较。 而这个m_tOld可能有指定时期的前一个条形的时间值,如果是第一次调用,则是01.01.1970。只有在每个周期的下一个刻度上,才会比较同一条形的数值。
Alexey Viktorov 2016.06.23 10:57
注意,不同的变量和不同的时期被传递给函数
newDay = newBar.IsNewBar(_Symbol, PERIOD_D1, oldDay); newHour = newBar.IsNewBar(_Symbol, PERIOD_H1, oldHour);
和所有...之后,我就完全被忽略了。谢谢你毫不迟疑地迅速答复,但我没有收到任何明白的答复。如果mql5有一个bug,你可以直接写:"我们正在努力修复它,所以请等待..."。但在这种情况下,你根本就是在忽视这个问题。
mql4中的一个类似函数将时间变化定义为15秒的倍数,而在mql5中这个问题突然出现了...
这就是在进行实验时,不适当的组织观察意味着什么。
...
要回答这个问题,你需要一个密码。你有一些代码片断。编写最低限度的代码,以便任何人都可以在自己的地方运行这个代码。
在代码中打印变量的值也很好--在函数的输入端和函数的输出端。
迪米特里,它又开始了吗?也许回答 "为什么在2016年6月21日没有任何问题的情况下打开了认股权证,但在2016年6月22日突然出现了错误的监控组织 "或其他问题会更容易...
如果我简单直截了当地回答,我可能会因此被禁止。
永远...
你甚至不能睡觉,你做了这么多梦?
这有什么意义?因为它不会让你变得更聪明。
当生命的意义是仇恨时,生活不是很有趣吗?А?
要回答这个问题,你需要一个代码。你有一些代码片断。制作最低限度的代码--这样任何人都可以自己运行这个代码。
最好能在代码中打印出变量的值--在函数的输入端和函数的输出端。
没问题。
但请注意,没有任何问题,突然...为什么?除了代码片段外,还有日志显示,2016年6月21日和之前的几周都在正常工作,但2016年6月22日这里突然出现问题。在写入SD之前,我在测试器中反复运行,通过历史记录进行调试,没有发现问题。
这就是为什么我怀疑贴出代码的用处。这只是为了好玩。
#property strict datetime oldDay, oldHour; MqlDateTime mqlDateTime; /*******************Expert initialization function*******************/ int OnInit() { return(INIT_SUCCEEDED); }/*******************************************************************/ /************************Expert tick function************************/ void OnTick() { bool newDay, newHour; TimeToStruct(TimeCurrent(), mqlDateTime); if((int)mqlDateTime.hour == 0) { newDay = IsNewBar(_Symbol, PERIOD_D1, oldDay); // Обратите внимание на то, что это отдельная переменная передаваемая в функцию по ссылке if(newDay) Print("***** newDay ", newDay, " mqlDateTime.hour ", mqlDateTime.hour); // Судя по распечатке newDay = true newHour = IsNewBar(_Symbol, PERIOD_H1, oldHour); // А это совсем другая переменная if(newHour) Print("***** newHour ", newHour); // Судя по распечатке newHour = true if(newDay && newHour) // A ЭТО УСЛОВИЕ НЕ ВЫПОЛНЕНО НЕСМОТРЯ НА ПРЕДЫДУЩИЕ РАСПЕЧАТКИ. { Print("Ордер должен откыться. "); } } }/*******************************************************************/ /*****************Определение появления нового бара******************/ bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld) { datetime tNew = (datetime)SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE); if(tNew > m_tOld) { m_tOld = tNew; return(true); } return(false); } /********************************************************************/ /******************Expert deinitialization function******************/ void OnDeinit(const int reason) { Comment(""); }/*******************************************************************/
既然作者不愿意,我就试试吧。
//+------------------------------------------------------------------+ //| test_1Vc2f.mq5 | //| Copyright © 2016, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2016, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- bool openNew,newDay,newHour; //--- newDay=IsNewBar(_Symbol,PERIOD_D1,oldDay); // if(newDay) Print("***** newDay ",newDay," mqlDateTime.hour ",mqlDateTime.hour); // Судя по распечатке newDay = true newHour=IsNewBar(_Symbol,PERIOD_H1,oldHour); if(newHour) Print("***** newHour ",newHour); // Судя по распечатке newDay = true } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool IsNewBar(string symbol,ENUM_TIMEFRAMES timeframe,datetime &m_tOld) { datetime tNew=(datetime)SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE); if(tNew>m_tOld) { Print("in: m_tOld = ",m_tOld); m_tOld=tNew; Print("out: m_tOld = ",m_tOld); return(true); } return(false); } //+------------------------------------------------------------------+
尚待决定的是"mqlDateTime"结构,以及在哪里声明变量 "oldDay "和 "oldHour"...。