错误、漏洞、问题 - 页 2099

 
Vladimir Pastushak:
伙计们,我已经厌倦了在mt5中从www.mql5.com,在android中输入我的用户名和密码。
为什么他们总是丢失他们的用户名和密码?

我也经常被问到,但我没有输入用户名/密码,我只是按了一下返回键,结果发现已经登录了。

 
Nikolai Semko:

为什么像ChartXYToTimePrice()这样一个非常有用的函数在执行时间上如此昂贵?

我写了一个类似于XYToTimePrice()的函数,它的运行速度更快。速度高达几百倍。

但在原函数中也有ChartID_in 与SubWindow_out。做一个完整的模拟。

 
fxsaber:

所以在原文中还有ChartID_in与SubWindow_out。做一个完整的模拟。


添加ChartID_in 和SubWindow_out一点都不难。但我的目的不是创建一个完整的模拟,我只是创建这个函数来显示ChartXYToTimePrice()的缓慢性。

void XYToTimePrice(long chart_id,int x,int y,int& sub_window,datetime &time,double &price,int id)
  {
   static int left_bar; // номер самого левого бара на экране
   static int WidBar;
   static int Wid;
   static int Hei;
   static double y_min;
   static double y_max;
   static int PerSec=PeriodSeconds();
   static bool 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];
  }

但这是真的,我的函数需要额外的参数事件ID。到目前为止,这个功能的效果与原来的一个像素的蜡烛厚度差不多,但如果有必要,你可以改进它。

 
Nikolai Semko:

添加ChartID_in和SubWindow_out一点都不难。但我的目的不是创建一个完整的模拟,我只是创建这个函数来显示ChartXYToTimePrice()的缓慢性。

但这是真的,我的函数需要额外的参数事件ID。虽然这个功能与原来的一个像素的蜡烛厚度的工作原理大致相同,但如果有必要,你可以改进它。


而且我还注意到ChartXYToTimePrice的一个奇怪的特点。它的执行时间与图表上的条数 成正比。

这表明其计算方法很 "奇怪"。也就是说,它是一个循环求和,对于这样一个问题的最优解来说是很奇怪的。

XYToTimePrice函数的速度是相同的,不管有多少个柱子。

而且说实话,ChartGetInteger和ChartGetDouble函数的速度也明显被高估了,而且有非常奇怪的功能。例如,函数

ChartGetDouble(0,CHART_PRICE_MAX);

是20-100倍于函数

ChartGetDouble(0,CHART_PRICE_MIN);          

如果MAX在MIN之后。

但如果你把它们调换一下,情况就相反了。


也就是说,这似乎是符合逻辑的--同一个函数,反复计算,使用的是之前函数调用中已经计算和存储的数据。但它只是显示了一些疯狂的计算和创建大量的中间数据,甚至可能是数组来计算一个简单的图表最高(或最低)价格的双倍值,这可能已经存在于某个变量中,只是需要被提取。

虽然我不排除这种影响是由于剖析的某些特殊性而发生的,而且是假性的。但这些功能的迟缓并不是假的。

 
Nikolai Semko:

如有必要,可对其进行完善。

当两个函数的结果重合时,说比较它们的速度特性是正确的,可能仍然有效。请完成它。

 
Vladimir Pastushak:
伙计们,我已经厌倦了在mt5中从安卓上的www.mql5.com 输入我的用户名和密码。
为什么他们总是丢失他们的用户名和密码?

写信给servicedesk。请附上日志。我很抱歉,谢谢。

 

关于交易、自动交易系统和交易策略测试的论坛

虫子,虫子,问题

fxsaber, 2017.10.04 09:13

关于这一点已经写过很多次了。由于某些原因没有得到纠正。

看上去他们已经修好了。在Build 1730中我不再有这个问题了。
 
Nikolai Semko:

我还注意到ChartXYToTimePrice的一个奇怪的特点。它的执行时间与图表上的条数 成正比。

这表明其计算算法的 "怪异性"。也就是说,它是一个循环求和,对于这样一个问题的最优解来说是很奇怪的。

XYToTimePrice函数的速度是相同的,不管有多少个柱子。

而且说实话,ChartGetInteger和ChartGetDouble函数的速度也明显被高估了,而且有非常奇怪的功能。例如,函数

是20-100倍于函数

如果MAX在MIN之后。

但如果你把它们调换一下,情况就相反了。


也就是说,这似乎是符合逻辑的--同一个函数,反复计算,使用的是之前函数调用中已经计算和存储的数据。但它只是显示了一些疯狂的计算和创建大量的中间数据,甚至可能是数组来计算一个简单的图表最高(或最低)价格的双倍值,这可能已经存在于某个变量中,只是需要被提取。

虽然我不排除这种影响是由于剖析的某些特殊性而发生的,而且是假性的。但这些功能的迟缓并不是假的。

图表数据请求功能的迟缓在于信息的发送和接收方式,而不是实现本身。这些函数的实现本身是原始的,不取决于图表上的条数。

但由于图表是一个对象,其中的信息分布在许多来源中,整个控制是基于消息队列的。在前一个请求被处理之前,下一个请求一直在等待。

但是,如果你连续有几个对同一图形的请求,那么这些后续请求就会很快被执行。这是因为没有人有时间在他们和第一个请求之间进行切割。

 
Slava:

图表数据请求功能的瓶颈在于信息的发送和接收方式,而不是实现本身。这些函数的实现本身是原始的,不取决于图表上的条数。

但由于图表是一个对象,其中的信息分布在许多来源中,整个控制是基于消息队列的。在前一个请求被处理之前,下一个请求正在等待。

但是,如果你连续有几个对同一图形的请求,那么这些后续请求就会很快被执行。这是因为没有人有时间在他们和第一个查询之间进行切割。


那就这样吧。但意识到这一点并没有使事情变得更容易。斯拉瓦,不要误解一个简单的程序员。我在以前的信息中测试指标的例子清楚地表明,ChartXYToTimePrice() 请求的平均运行时间是5000-10000微秒(在1像素的蜡烛厚度和全高清屏幕上的标准MT窗口)。在这样的时间里可以做什么?

那么,举例来说,在这段时间里,你可以在同一个屏幕上形成500个阴影圆圈的图像,并在屏幕上显示。

即使有排队,但为什么会有这么长的队伍?
在比例尺的一侧,有一个逐个像素生成的500个圆圈,其输出在屏幕上,而另一侧则是一个简单的两位数查询。而且它的重量是一样的。
一个简单的程序员坐在那里,搔首弄姿,无法将这些难题拼凑起来。

 
Nikolai Semko:

那就这样吧。但意识到这一点并不会使事情变得更容易。斯拉瓦,不要误解一个简单的程序员。我在以前的信息中的测试指标的例子清楚地表明,ChartXYToTimePrice() 请求的平均执行时间是5000-10000微秒(在蜡烛宽度为1像素和全高清屏幕的MT标准窗口下)。在这样的时间里可以做什么?

那么,举例来说,在这段时间里,可以在同一个屏幕上形成500个阴影圆圈的图像,并在屏幕上显示。

即使有排队,但为什么会有这么长的队伍?
天平的一边是500个圆圈的逐个像素形成,并在屏幕上显示,另一边是简单的两位数查询。而且它的重量是一样的。
一个简单的程序员坐在那里抓耳挠腮,不能把拼图拼起来。

你已经感觉到了同步命令和异步命令之间的区别。