错误、漏洞、问题 - 页 119

 
我在某个论坛上读到,测试期间的评论不会被写入日志(为了节省磁盘空间)。在这方面,我的问题是:我怎样才能在测试器中调试程序?我试过printf和PrintFormat--在测试器中没有任何作用,我甚至试过Alert。
 
Scriptong:
我在某个论坛上读到,测试期间的评论不会被写入日志(为了节省磁盘空间)。因此,我的问题是:我怎样才能在测试器中调试程序?我试过printf和PrintFormat--在测试器中没有任何作用,我甚至试过Alert。
看看测试代理的日志--一切都写在那里,但只针对本地 代理。出于节省信息的原因,远程代理不把Print()输出 写入日志。
Документация по MQL5: Общие функции / Print
Документация по MQL5: Общие функции / Print
  • www.mql5.com
Общие функции / Print - Документация по MQL5
 

已检查。我的经纪人是本地人(至少在本地列出了)。在"每滴答"模式下运行专家顾问后,"日志 "选项卡的内容与代理日志文件的内容一致(专家顾问和日志文件附后)。

是的,我忘了。测试期为 "上个月"。

附加的文件:
test.mq5  2 kb
 

你的日志说"'test.ex5'的调试版本,请重新编译"。

这意味着,用于调试的EX5(在编辑器中按F5会产生带有调试信息的EX5)不能在测试器中运行。

我们将对此类EA进行自动重新编译。同时,手动重新编译你的EA。

 
alexvd:
你能带来完整的代码吗?

而且我可能已经把整个事情提出来了,我想不出任何其他的原因......

我将尝试更详细地描述这种情况。

有一个简单的类"CMqlTimer", 这个类的任务是跟踪不同时间间隔的变化时刻:小时、天、周、月、年。

一切都以非常简单的原始方式实现,例如,如果分钟数等于0,那么 "新的小时 "已经到来;如果一周的天数与存储在变量中的天数不一致,那么一天的交替(服务器时间为 "00:00:00")已经到来。如此下去。

分析是在定时器被触发时进行的,间隔时间为1秒,该工作在CMqlTimer::OnTimer()中完成。如果时间间隔发生变化,必须执行该函数。例如,如果它是一个 "新 "的一天,函数CMqlTimer::OnRolloverDay()应该被执行。


如果我们删除其余的代码,只写OnRolloverDay(),结果将是如下。

//Function CMqlTimer.OnRolloverDay
bool CMqlTimer::OnRolloverDay()
//Дневной ролловер
{
//----------------------------------------------------------------------------//
//Work variables
string MessageText; //Text for message
int    UserEventID; //Identifier of the user event  

bool Result; //Returned importance
//----------------------------------------------------------------------------//

Result = true;

ResetLastError();

RolloverCountDay = RolloverCountDay+1;

UserEventID = CHARTEVENT_CUSTOM+15;
MessageText = StringFormat("Rollover Day (№ %d)",RolloverCountDay); //Можно просто "Rollover Day"
//We refer user event of the work chart
EventChartCustom(0,(ushort)UserEventID-CHARTEVENT_CUSTOM,0,0,MessageText);

//Checking for presence of the errors
  if(_LastError!=0)
  //В результате работы произошла ошибка
  {
  Result = false;  
  }
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}

所有的用户事件 都被跟踪,并传递给主类进行处理

它看起来像这样

void OnChartEvent(const int id,         // идентификатор события  
                  const long& lparam,   // параметр события типа long
                  const double& dparam, // параметр события типа double
                  const string& sparam  // параметр события типа string
                  )
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//

//----------------------------------------------------------------------------//
//                          Processing user events                            //
//----------------------------------------------------------------------------//
  if(id>CHARTEVENT_CUSTOM)
  //User event is received
  {
  Expert.OnEvent(id,lparam,dparam,sparam);
  }
//----------------------------------------------------------------------------//  
}

所以,在测试模式下,事件不能到达OnChartEvent,也就是说,专家顾问不能处理在测试模式下使用 EventChartCustom 发送的事件。 通过显示日志中的所有事件进行了检查。

PS

最有趣的是,演示中所有的事件都达到了,但在测试器中却工作得很糟糕。

在319之前,所有的工作和在测试器中,事件被成功地处理。真正的最后一个版本,它的工作原理我不能说...

 
stringo:

你的日志说"'test.ex5'的调试版本,请重新编译"。

这意味着,用于调试的EX5(在编辑器中按F5会产生带有调试信息的EX5)不能在测试器中运行。

我们将对此类EA进行自动重新编译。同时,手动重新编译你的EA。

谢谢你。我不知道按F5和F7获得的文件之间有什么区别。
 
Interesting:

而且我可能已经把整个事情提出来了,我想不出任何其他的原因......

我将尝试更详细地描述这种情况。

...
谢谢你。我们会考虑的。
 

我不明白哪里出了问题,EA在测试器中工作没有错误,在组织者的测试机中也没有错误通过。

当我在模拟账户上运行它时,当我试图打开一个订单时,我得到一个错误。

2010.09.06 13:26:50 交易 '101894' : 未能在84.179处即时买入0.10 USDJPY [不支持的填充模式] 。
2010.09.06 13:26:45 交易 '101894' : 未能在1.03689即时买入0.10 USDCAD [不支持的填补模式]
2010.09.06 13:26:39 交易 '101894' : 未能在84.174即时买入0.10 USDJPY [不支持的填充模式]
2010.09.06 13:26:34 交易 '101894' : 未能在1.03685即时买入0.10 USDCAD [不支持的填补模式]
2010.09.06 13:26:28 交易 '101894' : 未能在84.174即时买入0.10 USDJPY [不支持的填充模式]
2010.09.06 13:26:23 交易 '101894' : 未能在1.03688即时买入0.10 USDCAD [不支持的填补模式]
2010.09.06 13:26:18 交易 '101894' : 未能在84.181即时买入0.10 USDJPY [不支持的填充模式]

卖出请求。

MqlTradeRequest request;
         request.action=TRADE_ACTION_DEAL;
         request.symbol=Symbol_[i];
         request.volume=volume_exe;
         request.price=SymbolInfoDouble(Symbol_[i], SYMBOL_BID);
         request.sl=0;
         request.tp=0;
         request.deviation=SymbolInfoInteger(Symbol_[i], SYMBOL_SPREAD)*2;
         request.type=ORDER_TYPE_SELL;
         request.type_filling=ORDER_FILLING_CANCEL

要求购买。

MqlTradeRequest request;
         request.action=TRADE_ACTION_DEAL;
         request.symbol=Symbol_[i];
         request.volume=volume_exe;
         request.price=SymbolInfoDouble(Symbol_[i], SYMBOL_ASK);
         request.sl=0;
         request.tp=0;
         request.deviation=SymbolInfoInteger(Symbol_[i], SYMBOL_SPREAD)*2;
         request.type=ORDER_TYPE_BUY;
         request.type_filling=ORDER_FILLING_CANCEL;

OrderCheck没有发现任何错误。


 

ORDER_ FILLING_ AON查询代替ORDER_FILLING_ CANCEL 查询,专家工作

但问题仍然存在,为什么在测试者和服务器的操作上有如此大的差异。


Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 

如果冠军服务器变成相反的方式,那真是个笑话。