我的方法。核心是引擎。 - 页 126

 
Nikolai Semko:
如果是MT4,那么是的。
据我所知,MT5完全支持多核和多线程,与MT4不同。

看来,要想减轻负担,就必须使用OpenCL。但MT4没有这个功能。或者你可以忍受它。

另一个变体是允许用户调整动画 重绘的速度。在这种情况下,它将能够在必要时减少处理器的负载,并在它想增加负载时再增加。

 
Реter Konow:

看起来你需要使用OpenCL来减轻负担。但MT4没有这个功能。或者只是忍受它。

另一个选择是允许用户调整动画重绘的速度。在这种情况下,他将能够在需要的时候减少处理器的负载,如果他想的话,又能增加它。

我已经转到MT5了。
在MT5中测试两个EA的工作是很有意思的,这两个EA安装在不同的窗口,但只用一个窗口的资源工作。毕竟,每个EA都有自己的线程,而且,如你所知,你不能在一个窗口中放多个EA。
 
Nikolai Semko:
在MT5中测试两个安装在不同窗口的EA的工作是很有趣的,但它们只用一个窗口的资源工作。因为每个EA都有自己的线程,而且,如你所知,你不能在一个窗口中放多个专家顾问。

在MT4中,每个EA也有自己的线程。如果我没有记错的话...

线程不同,但处理器都是一样的...

我想这就是创建图表的原因。

 

还有一个细微差别。

如果动画是 循环的(如gif),你不需要一直重新初始化像素阵列。你可以通过一个周期来绘制动画,并将每一帧存储在一个资源中。接下来,只要切换图像就可以了。部分地,我已经实现了这一点,并且由于这一点,实现了多种动画速度。 一开始,动画速度很糟糕,因为每次我都是重新绘制原始图像,然后在上面绘制新的图像)。

 
Реter Konow:

在MT4中,每个EA也有自己的线程。如果我没有记错的话...

线程不同,但处理器都是一样的...

我想这就是为什么他们创建了一个图形化的地图。

为了体会MT4和MT5的区别,在两个平台上运行这段代码(代码在那里都能运行),你会发现在MT4中运行得更慢。

#define protected public
#include <Canvas\Canvas.mqh>
#undef protected
#property script_show_inputs 
input uint N=8; // количество центов гравитации
void OnStart()
  {
   ChartSetInteger(0,CHART_FOREGROUND,true);
   CCanvas C;
   int Width=(ushort)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS);                               // get Window width
   int Height=(ushort)ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS);                             // get Window height 
   if(!C.CreateBitmapLabel(0,0,"CanvasExamlple",0,0,Width,Height,COLOR_FORMAT_XRGB_NOALPHA)) // create canvas with the size of the current window
      Print("Error creating canvas: ",GetLastError());
   uint i=0,j=100000;
   int size=Width*Height;
   uchar h[25600];
   ArrayInitialize(h,0);
   uint w;
   for(w=0;w<25600;w++) h[w]=uchar(128+128*sin(double(w)/256)); //create an array to speed up the work
   double SQRT[];
   uint ss=Width*Width+Height*Height;
   Print(ss);
   ArrayResize(SQRT,ss);
   for(w=0;w<ss;w++) SQRT[(int)w]=sqrt(w); //create an array to speed up the work 
   int k[]; ArrayResize(k,N*2);
   for(w=0;w<N*2;w++) k[w]=20+rand()%200;
   double XP[],YP[],D[],D1[];
   ArrayResize(XP,N);
   ArrayResize(YP,N);
   ArrayResize(D,N);
   ArrayInitialize(XP,0);
   ArrayInitialize(YP,0);
   ulong t=0,sum=0, f=0;
   C.FontSet("Verdana",50,FW_MEDIUM);
   while(!IsStopped())
     {
      int pos=int(i%size);
      if(pos==0)
        {
         //Sleep(20); //For those who have a too powerful computer.
         if (i>0) {t=GetMicrosecondCount()-t; sum+=t; f++; 
         C.TextOut(Width/2,Height/2,"Время формирования кадра = "+IntegerToString(sum/f)+" мкс",clrBlueViolet,TA_CENTER|TA_VCENTER);}
         C.Update();
         t=GetMicrosecondCount();
         for(w=0;w<N;w++)
           {
            XP[w]= Width/2-(sin((double)j/k[2*w])*(double)Width/2);
            YP[w]= Height/2-(cos((double)j/k[2*w+1])*(double)Height/2);
           }
         j++;
        }
      int X=pos%Width;
      int Y=int(pos/Width);
      
     // for(int w=0;w<N;w++) D1[w]=SQRT[int((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y))];
      for(w=0;w<N;w++) D[w]=    sqrt((XP[w]-X)*(XP[w]-X)+(YP[w]-Y)*(YP[w]-Y));
      double S1=0,S2;
      for(w=0;w<N/2;w++) S1+=D[w];
      S2=S1;
      for(w=N/2;w<N;w++) S2+=D[w];
      double d=S1/S2;
      
      //double d= (D[0]+D[1]+D[2]+D[3])/(D[0]+D[1]+D[2]+D[3]+D[4]+D[5]+D[6]+D[7]);
       //d= (D[0]+D[1])/(D[0]+D[1]+D[2]+D[3]);
      C.m_pixels[pos]=XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]);// works a little faster, but requires transferring the array m_pixels from protected to public in Canvas.mqh
      //C.PixelSet(X,Y,XRGB(h[int(d*11520)],h[int(d*17920)],h[int(d*6400)]));
      i++;
     }
   C.Destroy();
  }
//+------------------------------------------------------------------+
 
Nikolai Semko:

只是为了体会MT4和MT5的区别,在两个平台上运行这段代码(代码在那里都能运行),你会发现在MT4中的速度要慢一个数量级。

是的,把它放在那里和那里。差异约为10倍。正是因为在MT5中,数组的初始化速度是10倍或更快。我已经检查过了。

然而,即使在MT4上,一切都应该快得多。毕竟,你只是在重新绘制图像。如果你在一个数组中反复处理就不同了。

我不知道为什么在MT4上会这么慢。

 

然而,也许这是因为你正在重新初始化整个画布空间中的每一个像素,即图形的大小。

在我的动画 中,只画了个别区域,图像的主要部分完全取自资源。你没有主要的部分,而图像完全是由你创造的。因此,它放慢了速度。

这是图纸的尺寸。

 
Реter Konow:

然而,也许这是因为你正在重新初始化整个画布空间中的每一个像素,即图形的大小。

在我的动画中,只画了个别区域,图像的主要部分完全取自资源。你没有主要的部分,而图像完全是由你创造的。因此,它放慢了速度。

这是图纸的尺寸。

多么大的差别。这是一个刻意的极端例子,清楚地表明了mt5在kanvas速度方面的优势。而这个问题在你的脑子里是有档案的。这就是为什么我长期以来一直在说--到MQL5去。
事实依然如此。mt5上的图像取景比mt4上快10倍。而这是一个非常有说服力的论点。
 
Nikolai Semko:
多么大的差别。这是一个刻意的极端例子,清楚地表明了mt5在kanvas速度上的优势。而这个问题在你的脑子里是有档案的。这就是为什么我长期以来一直在说--去找MQL5。
事实依然如此。MT5上的成像速度是MT4的10倍。而这是一个非常有效的论点。

MT4的缺点,是发展中需要的。你不必逃避他们。它们迫使你思考并改进你的解决方案。

在MT5上,你也不需要很努力。一切工作都足够快,因为它是。因此,计划在最后阶段迁移到MT5。

 
Реter Konow:

最后,动态表就完成了。我不得不说,这并不容易。事实证明,有很多细微的差别。

另外,这个表是 "有条件的 "动态的。也就是说,最大的行数是预先确定的。现在还不可能做到 "绝对 "动态。

这个表有20个可能的行。因此,它可以显示20个未结头寸。我们可以做更多,但现在只是一个示范。

点击查看。

这里是连接文件(放在包容里),引擎(在指标文件夹里),以及test.EA(在专家文件夹里)。

彼得,很抱歉,你的作品不被接受,因为你所发送的是一个罕见的黑客工作。我很抱歉,但似乎我是唯一一个运行你发送的东西的人,除了我之外,没有人愿意检查它。

因此,按照顺序,任务如下。

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

我的方法。核心 - 发动机。

Vasiliy Sokolov, 2018.12.26 13:29

彼得,任务是这样的。在MT4中制作一个显示当前订单开放的面板。不需要对系统面板进行完整的复制,显示最简单的表格,包括未结订单的基本属性:开盘价、方向、利润。剩下的就看你自己了。最主要的是,当一个订单被关闭时,它在你表中的指示也会消失。反之亦然,当一个新的订单被打开时,它将出现在这个表中。

我看到的却是。

首先,交易只能在你的面板上通过点击买入/卖出按钮打开。如果是通过标准窗口开仓,则不会出现交易。

第二,有些订单显示的是空值。它们存在于表格中,但行是空的。

第三,(这真是令人毛骨悚然),如果我们通过标准对话框关闭一个订单,它不会在表中消失。但最可悲的是,当你重新加载面板时,已关闭的订单又被显示为应该是开放的!这是为什么?这是什么?为什么你要把不相关的信息存储在某个地方,然后再试图加载它呢!?

第四,20个订单是什么鬼?我的任务中没有一个字提到这种限制!我的任务中没有一个字提到这种限制。这是有目的的,以测试你的引擎在动态和以前未知的环境中工作。这项工作不是随机选择的,你改变了我的要求,这样就可以隐藏你引擎的所有 "尖角"。但任务是为了显示这些角度而下达的。

第五,如果你设置了止损或止盈,你就不需要这样做。这些字段留空。

是的,在你的面板上,关闭位置(十字)的按钮也不起作用。

简而言之,彼得。我很抱歉,但你发给我的东西完全是一个黑客的工作。请按照规格修复它。

我将再次澄清任务,所以不会有任何问题。

  1. 该表是动态的,显示的订单与贸易标签上的一样。如果标签上没有订单,你的表格也不会显示它们。
  2. 你的表格中显示的订单数量应该是任何东西。没有来自上面的限制。
  3. 通过标准对话窗口打开一个订单,应该会使该订单出现在您的表格中。通过标准手段关闭订单,应该会导致订单在你的表中消失。
  4. 不一致的状态是不能接受的!如果你的表格显示了一件事,但贸易标签显示了另一件事,这就是一个错误。

到目前为止,一个胖子没有 去。等待你的完善。在你搞清楚之前,不要做3D效果图!
原因: