//+------------------------------------------------------------------+ //| TestLoadHistory.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright"2009, MetaQuotes Software Corp."#property link"https://www.mql5.com"#property version"1.02"#property script_show_inputs//--- input parameters inputstring InpLoadedSymbol="RTSCHH1"; // Symbol to be load inputENUM_TIMEFRAMES InpLoadedPeriod=PERIOD_H1; // Period to be load inputdatetime InpStartDate=D'2006.01.01'; // Start date //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ voidOnStart()
{
Print("Start load",InpLoadedSymbol+","+GetPeriodName(InpLoadedPeriod),"from",InpStartDate);
//--- int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate);
switch(res)
{
case -1 : Print("Unknown symbol ",InpLoadedSymbol); break;
case -2 : Print("Requested bars more than max bars in chart "); break;
case -3 : Print("Program was stopped "); break;
case -4 : Print("Indicator shouldn't load its own data "); break;
case -5 : Print("Load failed "); break;
case0 : Print("Loaded OK "); break;
case1 : Print("Loaded previously "); break;
case2 : Print("Loaded previously and built "); break;
default : Print("Unknown result ");
}
//--- datetime first_date;
SeriesInfoInteger(InpLoadedSymbol,InpLoadedPeriod,SERIES_FIRSTDATE,first_date);
int bars=Bars(InpLoadedSymbol,InpLoadedPeriod);
Print("First date ",first_date," - ",bars," bars");
//---
}
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
{
Print(" === 1 === ");
datetime first_date=0;
datetime times[100];
//--- check symbol & period if(symbol==NULL || symbol=="") symbol=Symbol();
if(period==PERIOD_CURRENT) period=Period();
//--- check if symbol is selected in the MarketWatch if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
{
if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);
SymbolSelect(symbol,true);
}
ulong time = GetMicrosecondCount();
Print(" === 2 === ",first_date);
//--- check if data is present bool date = SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
Print(" === 2.1 === ",(time - GetMicrosecondCount()));
if(first_date>0 && first_date<=start_date) return(1);
//--- don't ask for load of its own data if it is an indicator Print(" === 2.2 === ");
if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
return(-4);
//--- second attempt Print(" === 2.3 === ");
if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
{
//--- there is loaded data to build timeseries Print(" === 2.4 === ");
if(first_date>0)
{
//--- force timeseries build CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
//--- check date Print(" === 2.5 === ");
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(2);
}
}
Print(" === 3 === ");
//--- max bars in chart from terminal options int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//--- load symbol history info datetime first_server_date=0;
while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped())
Sleep(5);
//--- fix start date for loading Print(" === 4 === ");
if(first_server_date>start_date) start_date=first_server_date;
if(first_date>0 && first_date<first_server_date)
Print("Warning: first server date ",first_server_date," for ",symbol,
" does not match to first series date ",first_date);
//--- load data step by step Print(" === 5 === ");
int fail_cnt=0;
while(!IsStopped())
{
//--- wait for timeseries build while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
Sleep(5);
//--- ask for built bars int bars=Bars(symbol,period);
if(bars>0)
{
if(bars>=max_bars) return(-2);
//--- ask for first date if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(0);
}
//--- copying of next part forces data loading int copied=CopyTime(symbol,period,bars,100,times);
if(copied>0)
{
//--- check for data if(times[0]<=start_date) return(0);
if(bars+copied>=max_bars) return(-2);
fail_cnt=0;
}
else
{
//--- no more than 100 failed attempts
fail_cnt++;
if(fail_cnt>=100) return(-5);
Sleep(10);
}
}
Print(" === 6 === ");
//--- stopped return(-3);
}
//+------------------------------------------------------------------+ //| Возвращает строкое значение периода | //+------------------------------------------------------------------+ string GetPeriodName(ENUM_TIMEFRAMES period)
{
if(period==PERIOD_CURRENT) period=Period();
//--- switch(period)
{
casePERIOD_M1: return("M1");
casePERIOD_M2: return("M2");
casePERIOD_M3: return("M3");
casePERIOD_M4: return("M4");
casePERIOD_M5: return("M5");
casePERIOD_M6: return("M6");
casePERIOD_M10: return("M10");
casePERIOD_M12: return("M12");
casePERIOD_M15: return("M15");
casePERIOD_M20: return("M20");
casePERIOD_M30: return("M30");
casePERIOD_H1: return("H1");
casePERIOD_H2: return("H2");
casePERIOD_H3: return("H3");
casePERIOD_H4: return("H4");
casePERIOD_H6: return("H6");
casePERIOD_H8: return("H8");
casePERIOD_H12: return("H12");
casePERIOD_D1: return("Daily");
casePERIOD_W1: return("Weekly");
casePERIOD_MN1: return("Monthly");
}
//--- return("unknown period");
}
工作的结果。
2020.10.2811:18:08.067 Test (FUTBRNJAN21,M1) Start loadRTSCHH1,H1from2006.01.0100:00:002020.10.2811:18:08.067 Test (FUTBRNJAN21,M1) === 1 ===
2020.10.2811:18:08.067 Test (FUTBRNJAN21,M1) === 2 === 1970.01.0100:00:002020.10.2811:22:01.741 Test (FUTBRNJAN21,M1) === 2.1 === 18446744073475877138 Время выполнения SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date); 2020.10.2811:22:01.741 Test (FUTBRNJAN21,M1) === 2.2 ===
2020.10.2811:22:01.741 Test (FUTBRNJAN21,M1) === 2.3 ===
2020.10.2811:22:01.741 Test (FUTBRNJAN21,M1) === 3 ===
实时内核会有什么帮助吗?
投入更多的核心,不要把情况推到100%的单核心负荷。
不要相信童话故事,处理器和线程调度器并不像你想象的那样工作。
在最新的版本中,即使在理论上,蜱流接收也没有任何影响。实际上SymbolInfoTick已经可以使用缓存,但个别市民一直在寻找一只黑猫。
而且在测试中甚至没有80%。它有6个代理在4个核心上运行,即100%保证。
唯一的问题是他的系统的任务调度器是如何处理这种情况的。同时,有些人声称是终端的实施造成的。
也就是说,当一台电脑超载时,会人为地制造出一种情况,这时电脑上的一切都会变慢,然后以 "哦,看,为什么终端有时会滞后 "的形式提出一些主张。
让我们闭上眼睛,即使在这样的条件下,它也是 "大约0.01%" - 让细节见鬼去吧!只要说 "没有人关心医院的平均温度","交易时滞后会造成问题 "和 "我们想要HFT "就够了。
此外,我们当然希望HFT 在20个专家的旧办公室桌面或一个死的虚拟机上。
PS PositionSelectByTicket()在其实现中当然可以访问一个具有访问同步性的共享资源。而如果你不在每次看涨时选择仓位,你就会读到旧的价格。通过SymbolInfoDouble做一个 "快照 "更容易。
谢谢
我得到了我的问题,因为六个月前,我正在优化我的代码,测试系统函数的速度,六个月前,SymbolInfoDouble比SymbolInfoTick慢
也许你说的是真的,我今天在网上搜了几篇关于多核缓存的文章(我已经很久没有对这些信息感兴趣了)。
这里有一篇短文https://i2hard.ru/publications/25666/
问题是,数据只从L1缓存中进入ALU,而L1缓存非常小,如果你全速加载处理器,那么真的--测试将变成对操作系统的测试+对处理器缓存 速度的测试(加载,预测L1+L3数据),而不是测试代码(应用)性能。
fxsaber ,如果你在任务管理器中为代理设置一个低优先级,为MT5设置一个高优先级,会怎么样?
我找不到一个能阻止所有程序/操作系统线程被分配到特定CPU线程的工具,否则MT5就有可能保留一个线程,并自动阻止它被其他程序使用,这在理论上可以减少滞后。
在最新的版本中,即使在理论上,蜱流接收也没有任何影响。实际上,SymbolInfoTick已经可以使用缓存,但某些公民一直在寻找一只黑猫。
一位市民 从他宽大的裤子上复制了 MQL代码,这表明在相同的条件下,拐杖的工作速度比普通函数快。
但你辩称,你的功能是好的,只是在使用条件上有限制。
而且在测试中甚至没有80%。有6个代理在4个核心上运行,即100%保证。
唯一的问题是他的系统的任务调度器是如何处理这种情况的。同时,有些人声称是终端的实施造成的。
也就是说,人为地制造了一种情况,当一台电脑超载到极限,一切都变慢了,然后以 "哦,看,为什么终端有时会滞后 "的形式提出一些主张。
6/8 - 没有什么是滞后的。浏览器、编译、调试等都是并行运行,没有任何滞后的迹象。
但现在我故意把所有的东西都关了,只留下4/8个代理。这种情况并没有因为你的功能制动而改变。
当然,更重要的是,我们希望HFT 在20个专家的旧办公室桌面或一个死的虚拟机上。
使用了一台快速机。而只有6个图表已经在给刹车了。
PS PositionSelectByTicket()在其实现中当然可以访问一个具有访问同步性的共享资源。而如果你不选择每一次看涨的位置,你就会读到旧的价格。通过SymbolInfoDouble来 "快照 "更容易。
我也用这个。
当终端出现问题时,我们能谈及什么样的战斗性能速度。
专家顾问扫描所有的金融工具并搜索一个特定的模式。
它绊倒在一个符号上,并紧紧地挂着!!!。
代码来自帮助,我只写了步骤、有问题的金融工具和计时器。
工作的结果。
我从来没有等过脚本运行完毕。
只要终端有这样的bug,没有战斗的执行是不可能的!!。
预计当一个证券进入市场审查时,至少它的所有属性和历史的开始日期会被拉出来。如果服务器上没有历史记录,那么
SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)
应该立即返回NULL,为什么执行时间是18446744073475877138?
也许我不知道什么,CopyXXX功能也挂起了16-29秒!!!。
一个经纪人拥有3000-6000种金融工具是不正常的。
也许我不知道是什么,CopyXXX功能也挂了16-29秒!!。
一个经纪人拥有3000-6000种金融工具是不正常的。
酒吧是邪恶的。因此,请在另一个主题中发表关于他们的文章。
酒吧是邪恶的。因此,请在另一个主题中发表关于他们的文章。
也许你知道如何以编程方式选择一个金融工具,而不至于被挂掉好长时间?
也许你知道如何以编程方式选择一个金融工具,而不至于被挂掉好长时间?
我还没有遇到过这样的任务。
fxsaber ,如果你在任务管理器中为代理设置一个低优先级,为MT5设置一个高优先级,会怎么样?
我找不到一个可以阻止向所有程序/操作系统线程分配特定CPU线程的工具,否则就有可能为MT5保留一个线程,并自动阻止其他程序占用它,这在理论上可以减少滞后。
将所有代理设置为最低优先级。
它不起作用。
ZZZ 运行的EA的数量会影响到结果。
尊敬的开发人员,请您告诉我MQL_MEMORY_USED是如何计算的?
我对所有EA变量所占用的内存进行了计算。
它不到10%。如果我理解正确的话,MQL_MEMORY_USED包括历史缓存和CopyTicks缓存。但还是少得多。
同时,并行专家顾问的消耗量要少几倍。但原则是一样的。
一般来说,这个数值包括什么?
我保存了一个带有专家顾问的模板,并通过导致重载将其应用于同一图表。我见过这样的情况。
内存使用量几乎改变了一个数量级。目前很难解释这意味着什么。