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

 
Andrey Barinov:

因为用OrderOpenPrice代替了OrderOpenTime()。

对。我搞混了。:)

 
Реter Konow:

我不得不承认,我对测试结果感到有些惊讶。

这就是为什么我想让你自己做所有的事情,而不是给出会撞墙的现成的解决方案。
你知道吗,彼得,还有这样一个功能,即函数的指针,由于它的存在,你可以通过简单地从这种指针的数组中获取这些指针来组织函数调用。我认为这对你的任务会非常有用。唯一的麻烦是,你必须再搞一次课。
 
Nikolai Semko:
这就是为什么我想让你自己做所有事情,而不是给现成的解决方案,这就像豌豆撞墙。
而且你知道吗,彼得,还有这样一种东西,那就是函数的指针,多亏了它,你可以通过简单地从这种指针的数组中获取这些指针来组织函数调用。我认为这对你的问题会非常有用。但麻烦就在这里--你必须再次处理班级问题。

我听说过函数的指针。但我的功能非常少。正因为如此,我没有空间,需要使用OOP。

我有一个不同的发展理念。我认为,整体性的多功能区块的运行比小功能的大型复合体的运行更有效率。

从机制发展的角度看,更有希望。

这是我的看法...

我有几个大块头。为了应用OOP,它们必须被分解成小的函数,组织成类,然后,使用指针和其他东西。

但我将无法做到这一点。只是因为我的想法不同。

OOP的概念与我的思维方式的特殊性不相吻合,我无法在其中展开。这就是原因。

 
Nikolai Semko:

请注意,尼古拉,在程序化发展问题上,我没有问题。一切都发展得非常快。

同时,这些机制运作良好。

我现在已经掌握了联合体,我看到它们在一项特殊任务中的应用,即把字符串写入资源中。

我将尝试在测试EA中检查速度和CPU负载,并公布结果。

如果它是好的,我将重建引擎和EA之间的沟通,使其在资源上。

 

为了使用资源来传递未定义长度的字符串,这些字符串必须被写入一个char数组中。

然而,它们的大小似乎只在联盟内部声明,之后不会改变。

我试着通过ArrayResize调整 联合体中char数组的大小,但没有任何效果。

看来,char数组的大小必须事先设置。而且应该是最大尺寸。


以下是代码。

//+------------------------------------------------------------------+
//|                                                       TEST_2.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar   Char[4];
   uint    Uint[1];   
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(1000);
   //----------------------------------------------
   if(!ObjectCreate(0,"Resource",OBJ_BITMAP_LABEL,0,0,0))Print("Object is not created!  ",GetLastError());
   else Print("Object created!");
   //-------------------------------
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"::Resource"))Print("BMPFILE is not created!");
   else Print("BMPFILE created!");
   //----------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Char_Uint u;
   string String = NULL;
   int q = MathRand();
   if(q > 10000)q = 10000;
   //-------------------------------------------------------
   //Формируем случайную строку.
   //-------------------------------------------------------
   for(int a1 = 0; a1 < q; a1++)String += (string)a1 + "^";
   //-------------------------------------------------------
   //Получаем размер собранной строки.
   //-------------------------------------------------------
   int StrSize = StringLen(String);
   //-------------------------------------------------------
   //Меняем размер массива из Char[] юниона. 
   //-------------------------------------------------------
   ArrayResize(u.Char,StrSize);
   //-------------------------------------------------------
   //Копируем строку в массив Char[].
   //-------------------------------------------------------
   //StringToCharArray(String,u.Char);
   //-------------------------------------------------------
   //
   //-------------------------------------------------------
   Print("StrSize  ",StrSize," Размер u.Char  ",ArraySize(u.Char));
  }
//+------------------------------------------------------------------+
 

现在很清楚,必须事先知道联合中的char 数组的大小。因为ArrayResize(u.Char,StrSize)并没有改变它

所以我们必须将数组的大小设置为等于最大字符串的长度...

 

好消息。一切运作良好。

该字符串被写入资源,并由不同图表上的另一个EA读取。

处理器上没有任何负载。负载只是由调用打印字符串的Alert引起的。

这里是专家顾问的代码。

1.专家顾问形成字符串并将其写入资源中。

//+------------------------------------------------------------------+
//|                                                       TEST_2.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar   Char[32000];
   uint    Uint[8000];   
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetMillisecondTimer(16);
   //----------------------------------------------
   if(!ObjectCreate(0,"Resource",OBJ_BITMAP_LABEL,0,0,0))Print("Object is not created!  ",GetLastError());
   else Print("Object created!");
   //-------------------------------
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"::Resource"))Print("BMPFILE is not created!");
   else Print("BMPFILE created!");
   //----------------------------------------------
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Char_Uint u;
   string String = NULL;
   int q = MathRand(),width,height;
   if(q > 1000)q = 1000;
   //-------------------------------------------------------
   //Формируем случайную строку.
   //-------------------------------------------------------
   for(int a1 = 0; a1 < q; a1++)String += (string)a1 + "^";
   //-------------------------------------------------------
   //Получаем размер собранной строки.
   //-------------------------------------------------------
   int StrSize = StringLen(String);
   //-------------------------------------------------------
   //Копируем строку в массив Char[].
   //-------------------------------------------------------
   StringToCharArray(String,u.Char);
   //-------------------------------------------------------
   //Cохраняем строку переведенную в байты в ресурсе.
   //-------------------------------------------------------
   if(!ResourceCreate("::Resource",u.Uint,8000,1,0,0,0,COLOR_FORMAT_XRGB_NOALPHA))Print("Resource is not created!");
   //-------------------------------------------------------
  }
//+------------------------------------------------------------------+
 

一个顾问从另一个图表的资源中读出一条线。

//+------------------------------------------------------------------+
//|                                              Resource reader.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//+------------------------------------------------------------------+
union Char_Uint
  {
   uchar   Char[32000];
   uint    Uint[8000];   
  };
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetMillisecondTimer(16); 
   
   if(!ObjectSetString(0,"Resource",OBJPROP_BMPFILE,"\\Experts\\TEST_2.ex4::Resource"))Print("Resource is not connected!");
   else Print("Resource connected!");
//---
   return(INIT_SUCCEEDED);
  }


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   Char_Uint u;   
   uint width,height;
   //string Message; 
   //-----------------------------
   if(!ResourceReadImage("\\Experts\\TEST_2.ex4::Resource",u.Uint,width,height))Print("Failed to read resource!  ",GetLastError());
   //-----------------------------
   string String = CharArrayToString(u.Char);
   //-----------------------------
   Alert("  String  ",String);
   //-----------------------------
  }
//+------------------------------------------------------------------+


将利用资源进行交流。唯一的缺点是,你必须在联盟中设置最大的char数组大小。但是,你不需要考虑字符串的大小和MT对象的数量。

这种方法比MT-对象的链接方法慢,但也不错。

 
Реter Konow:

你有一个有趣的理论,尽管它与我的实验结果不太吻合,我现在将在下面发表。

正如测试所显示的,是像素阵列的初始化对CPU的负载最大。

请看下面的测试EA。

重读任务。

瓦西里-索科洛夫

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

在这里,你可以看到当屏幕上的表格发生变化时,重新绘制的两个必要操作:1.关闭交易时;2.打开交易时。为什么要在其余时间重画像素?

你是在解决其他问题吗?

 
Vladimir:

重读该问题。

瓦西里-索科洛夫

这里我们看到,当屏幕上的表格发生变化时,有两个必要的重绘操作:1.关闭一个交易时,2.打开一个交易时。为什么在其他时间重绘像素?

你是在解决其他问题吗?

好吧,他们完全按照你说的重新绘制。

处理器上的负载在动画 中出现。

像素阵列中的数值不断被重新初始化。每16毫秒。这使处理器的负载达到了40%。

我正试图弄清楚到底是什么负荷。我以为是保存资源或阅读资源。结果发现是绘图循环中数组的重新初始化问题。


结果还发现,不断调用ObjectSetInteger(0, "MT object",OBJPROP_SELECTED,1);(每16毫秒)也会加载处理器。约10%。

我用这个调用来告诉另一个EA读取动画数据的资源。

总的来说,它在动画制作过程中得到+~50%的CPU负载。

原因: