void XYToTimePrice(long chart_id,int x,int y,int& sub_window,datetime &time,double &price,int id)
{
staticint left_bar; // номер самого левого бара на экранеstaticint WidBar;
staticint Wid;
staticint Hei;
staticdouble y_min;
staticdouble y_max;
staticint PerSec=PeriodSeconds();
staticbool ChartChange=true;
if(id==CHARTEVENT_CHART_CHANGE) { ChartChange=true; return; }
if(ChartChange) // если было изменение чатра после последнего вычисления
{
left_bar=(int)ChartGetInteger(chart_id,CHART_FIRST_VISIBLE_BAR, sub_window); // номер самого левого бара на экране
Wid=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_PIXELS, sub_window); // ширина экрана в пикселях
WidBar=(int)ChartGetInteger(chart_id,CHART_WIDTH_IN_BARS, sub_window); // ширина экрана в барах
Hei=(int)ChartGetInteger(chart_id,CHART_HEIGHT_IN_PIXELS, sub_window); // высота экрана в пикселях
y_min=ChartGetDouble(chart_id,CHART_PRICE_MIN, sub_window); // макс. цена на экране
y_max=ChartGetDouble(chart_id,CHART_PRICE_MAX, sub_window); // мин. цена на экране
}
if(x>Wid || x<0 || y<0 || y>Hei) return; // выходим если точка (x,y) за пределами экрана
price=y_min+(Hei-y)*(y_max-y_min)/Hei;
int NrBar=left_bar-(int)((double)x/((double)Wid/(double)WidBar));
datetime T[1];
if(NrBar>=0) CopyTime(NULL,0,NrBar,1,T);
else { CopyTime(NULL,0,0,1,T); T[0]+=fabs(NrBar)*PerSec;}
ChartChange=false;
time=T[0];
}
伙计们,我已经厌倦了在mt5中从www.mql5.com,在android中输入我的用户名和密码。
为什么他们总是丢失他们的用户名和密码?
我也经常被问到,但我没有输入用户名/密码,我只是按了一下返回键,结果发现已经登录了。
为什么像ChartXYToTimePrice()这样一个非常有用的函数在执行时间上如此昂贵?
我写了一个类似于XYToTimePrice()的函数,它的运行速度更快。速度高达几百倍。
但在原函数中也有ChartID_in 与SubWindow_out。做一个完整的模拟。
所以在原文中还有ChartID_in与SubWindow_out。做一个完整的模拟。
添加ChartID_in 和SubWindow_out一点都不难。但我的目的不是创建一个完整的模拟,我只是创建这个函数来显示ChartXYToTimePrice()的缓慢性。
但这是真的,我的函数需要额外的参数事件ID。到目前为止,这个功能的效果与原来的一个像素的蜡烛厚度差不多,但如果有必要,你可以改进它。
添加ChartID_in和SubWindow_out一点都不难。但我的目的不是创建一个完整的模拟,我只是创建这个函数来显示ChartXYToTimePrice()的缓慢性。
但这是真的,我的函数需要额外的参数事件ID。虽然这个功能与原来的一个像素的蜡烛厚度的工作原理大致相同,但如果有必要,你可以改进它。
而且我还注意到ChartXYToTimePrice的一个奇怪的特点。它的执行时间与图表上的条数 成正比。
这表明其计算方法很 "奇怪"。也就是说,它是一个循环求和,对于这样一个问题的最优解来说是很奇怪的。
XYToTimePrice函数的速度是相同的,不管有多少个柱子。
而且说实话,ChartGetInteger和ChartGetDouble函数的速度也明显被高估了,而且有非常奇怪的功能。例如,函数
是20-100倍于函数
如果MAX在MIN之后。
但如果你把它们调换一下,情况就相反了。
也就是说,这似乎是符合逻辑的--同一个函数,反复计算,使用的是之前函数调用中已经计算和存储的数据。但它只是显示了一些疯狂的计算和创建大量的中间数据,甚至可能是数组来计算一个简单的图表最高(或最低)价格的双倍值,这可能已经存在于某个变量中,只是需要被提取。
虽然我不排除这种影响是由于剖析的某些特殊性而发生的,而且是假性的。但这些功能的迟缓并不是假的。
如有必要,可对其进行完善。
当两个函数的结果重合时,说比较它们的速度特性是正确的,可能仍然有效。请完成它。
伙计们,我已经厌倦了在mt5中从安卓上的www.mql5.com 输入我的用户名和密码。
为什么他们总是丢失他们的用户名和密码?
写信给servicedesk。请附上日志。我很抱歉,谢谢。
关于交易、自动交易系统和交易策略测试的论坛
虫子,虫子,问题
fxsaber, 2017.10.04 09:13
关于这一点已经写过很多次了。由于某些原因没有得到纠正。
我还注意到ChartXYToTimePrice的一个奇怪的特点。它的执行时间与图表上的条数 成正比。
这表明其计算算法的 "怪异性"。也就是说,它是一个循环求和,对于这样一个问题的最优解来说是很奇怪的。
XYToTimePrice函数的速度是相同的,不管有多少个柱子。
而且说实话,ChartGetInteger和ChartGetDouble函数的速度也明显被高估了,而且有非常奇怪的功能。例如,函数
是20-100倍于函数
如果MAX在MIN之后。
但如果你把它们调换一下,情况就相反了。
也就是说,这似乎是符合逻辑的--同一个函数,反复计算,使用的是之前函数调用中已经计算和存储的数据。但它只是显示了一些疯狂的计算和创建大量的中间数据,甚至可能是数组来计算一个简单的图表最高(或最低)价格的双倍值,这可能已经存在于某个变量中,只是需要被提取。
虽然我不排除这种影响是由于剖析的某些特殊性而发生的,而且是假性的。但这些功能的迟缓并不是假的。
图表数据请求功能的迟缓在于信息的发送和接收方式,而不是实现本身。这些函数的实现本身是原始的,不取决于图表上的条数。
但由于图表是一个对象,其中的信息分布在许多来源中,整个控制是基于消息队列的。在前一个请求被处理之前,下一个请求一直在等待。
但是,如果你连续有几个对同一图形的请求,那么这些后续请求就会很快被执行。这是因为没有人有时间在他们和第一个请求之间进行切割。
图表数据请求功能的瓶颈在于信息的发送和接收方式,而不是实现本身。这些函数的实现本身是原始的,不取决于图表上的条数。
但由于图表是一个对象,其中的信息分布在许多来源中,整个控制是基于消息队列的。在前一个请求被处理之前,下一个请求正在等待。
但是,如果你连续有几个对同一图形的请求,那么这些后续请求就会很快被执行。这是因为没有人有时间在他们和第一个查询之间进行切割。
那就这样吧。但意识到这一点并没有使事情变得更容易。斯拉瓦,不要误解一个简单的程序员。我在以前的信息中测试指标的例子清楚地表明,ChartXYToTimePrice() 请求的平均运行时间是5000-10000微秒(在1像素的蜡烛厚度和全高清屏幕上的标准MT窗口)。在这样的时间里可以做什么?
那么,举例来说,在这段时间里,你可以在同一个屏幕上形成500个阴影圆圈的图像,并在屏幕上显示。
即使有排队,但为什么会有这么长的队伍?
在比例尺的一侧,有一个逐个像素生成的500个圆圈,其输出在屏幕上,而另一侧则是一个简单的两位数查询。而且它的重量是一样的。
一个简单的程序员坐在那里,搔首弄姿,无法将这些难题拼凑起来。
那就这样吧。但意识到这一点并不会使事情变得更容易。斯拉瓦,不要误解一个简单的程序员。我在以前的信息中的测试指标的例子清楚地表明,ChartXYToTimePrice() 请求的平均执行时间是5000-10000微秒(在蜡烛宽度为1像素和全高清屏幕的MT标准窗口下)。在这样的时间里可以做什么?
那么,举例来说,在这段时间里,可以在同一个屏幕上形成500个阴影圆圈的图像,并在屏幕上显示。
即使有排队,但为什么会有这么长的队伍?
天平的一边是500个圆圈的逐个像素形成,并在屏幕上显示,另一边是简单的两位数查询。而且它的重量是一样的。
一个简单的程序员坐在那里抓耳挠腮,不能把拼图拼起来。
你已经感觉到了同步命令和异步命令之间的区别。