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

 

谈及直觉。我想给你一个有趣的例子。我的帖子,印在这个主题https://www.mql5.com/ru/forum/95632/page12两年多以前

Реter Konow:

1.图形引擎的概念。

2.图形核心的概念。

3.为MT平台创建视觉工作室的阶段。

4.EA接口创建机制的描述。


图形引擎是一个设计为指示器的程序这个程序只为管理用户界面而设计。它执行一套基本功能。

  • 从一个文件中加载图形界面的核心。
  • 保存界面的自定义设置。
  • 对界面中的所有过程实施统一协调的控制。它实现了界面的 "机械性",包括:打开和关闭窗口、调整窗口大小、移动窗口、合并窗口、缩放、播放脚本、改变对象的状态、绑定对象、根据控件的类型和属性控制其参数值、创建和销毁全局变量。

图形引擎像其他指标一样被添加到图表 中。它包括以下一组窗口。

  • 一个任务栏,在它的右侧将添加几个图标,以调用引擎本身的服务 窗口。
  • 一个文件导航器,它将被用来从位于一个特殊文件夹中的具有接口的文件列表 中选择启动文件。
  • 可选的设置窗口,在这个阶段不发挥关键作用。

原则上,这就是图形引擎概念的终结。重要的是,没有它就不可能进行接口操作。



图形引擎是一个包含界面中所有对象和窗口数据的信息块,它被记录在一个数组中并保存在一个文件中

该块是图形界面的数字表示。它是由图形引擎根据用户的要求加载的。 图形引擎本身有自己的内部图形内核,确保其自身窗口的运行,并在该内核内提供自由空间,以便将用户界面(以数字形式)整合到其中。集成是在从文件中加载图形核心的过程中进行的。


3.在MT平台上创建一个视觉工作室,据我所知,分为两个阶段。

  • 在第一阶段,将创建一个基于文件的界面构建器版本。在其中,用户将与表格模板一起工作。在表格中,用户将写出接口元素的类型和名称,并设置其参数的属性。对用户来说,创作将是非常容易的,他不必担心他的元素在窗口中的正确位置(引擎将自动计算一切),只需按要求的顺序排列元素即可。
  • 在第二阶段,将创建一个可视化环境,实现与文件构造器相同的接口构造方法,只是它的使用将更加简单和方便。它还将增加改变控件外观的能力。一般来说,用户会有更多的图形选项。


4.我想概述一下界面创建过程的机制,并稍微揭开其技术的面纱。解释一下通过文件创建界面的便利性从何而来

情况就是这样:引擎有一个特殊的功能,可以根据一个文件创建一个完整的图形内核,并将加载信息量降到最低 这个文件中的启动信息是不言自明的,而且是人类可读的。它很容易编写和编辑。例 如,你需要写"_CREATE_NEW_WINDOW " 来创建一个窗口 以及"_CHECKBOX "和 复选框的名称,(引擎会自动识别元素的名称,作为元素本身的名称和其参数的名称)。

这个函数被称为 "G_CORE_BUILDER()", 它通过从两个主要来源获取数据来构建图形核心:一个由用户创建的启动文件和 "CONTENT[]" 数组,其中包含了所有包含在窗口和控件平台中的标准对象组。"CONTENT[]" 也包含对象的状态和脚本。一切都在一个阵列中。一般来说,来自 "CONTENT[]"的源材料+用户创建的加载器文件被 "G_CORE_BUILDER() "用来构建引擎工作的图形核心。

Приход нового поколения торговых программ. Каким должен стать интерфейс советников?
Приход нового поколения торговых программ. Каким должен стать интерфейс советников?
  • 2016.09.19
  • www.mql5.com
Уважаемые разработчики, в преддверии скачка развития торговых программ, ожидается что создаваемые нами роботы преобретут массу новых возможностей...
 

令人惊讶的是,在两年的努力工作中,这些术语和概念并没有改变。而函数、数组和关键字就像这里说的那样。一切都按照这个方案来实施。尽管两年前,我根本没有开发标记语言的经验,但这项技术正在发挥作用并不断发展。

我没有走到死胡同,我没有改变概念,我没有改变方向。我继续创建引擎、核心和标记语言,完全按照我最初的意图。而实践证实了我选择的道路是正确的。

如果这不是预言性的直觉,那么什么才是呢?

 

亲爱的对手们。

以下是脚本代码,其中。

  1. 衡量将一个字符串 传输到一个Char数组 的时间,用于通过资源将字符串传递给另一个程序,以及从Char数组中检索字符串的时间,用于后续的信息分割和检索。
  2. 衡量将字符串写入MT对象描述的时间和从MT对象描述中检索字符串的时间,用于后续信息的分割和检索。
//+------------------------------------------------------------------+
//|                        CharArrayToString и StringToCharArray.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//--------------------------------------------

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string qwerty = "qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj";   
   uchar Arr[];
   //---------------------------------
   //Создаем объект связи.
   //---------------------------------
   ObjectCreate(0,"button_1",OBJ_BUTTON,0,0,0);   
   //---------------------------------
   ulong t1 = GetMicrosecondCount();
   //---------------------------------
   //Переводим строку в тип Char
   //---------------------------------
   StringToCharArray(qwerty,Arr,0,WHOLE_ARRAY);
   //---------------------------------
   ulong t2 = GetMicrosecondCount();
   //---------------------------------
   //Переводим массив Char обратно в строку:
   //---------------------------------
   string str_1 = CharArrayToString(Arr,0,WHOLE_ARRAY);
   //---------------------------------
   ulong t3 = GetMicrosecondCount();
   //---------------------------------
   //Записываем строку в описании МТ-объекта.
   //---------------------------------
   ObjectSetString(0,"button_1",OBJPROP_TEXT,"qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj");
   ulong t4 = GetMicrosecondCount();
   //---------------------------------
   //Cчитываем строку из описания МТ-объекта.
   //---------------------------------
   string str_2 = ObjectGetString(0,"button_1",OBJPROP_TEXT);
   ulong t5 = GetMicrosecondCount();
   //---------------------------------   
   //Замеряем время исполнения.
   //----------------------------------------------
   Print("Time of execution StringToCharArray:   ",t2-t1);
   Print("Time of execution CharArrayToString:   ",t3-t2," строка от CharArrayToString:  ",str_1);
   //----------------------------------------------
   Print("Time of execution ObjectSetString:     ",t4-t3);
   Print("Time of execution ObjectGetString:     ",t5-t4," строка от ObjectGetString:  ",str_2);
   //----------------------------------------------
  }
//+------------------------------------------------------------------+

结果。

2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution StringToCharArray:   47
2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution CharArrayToString:   35 строка от CharArrayToString:  qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj

2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectSetString:     3
2018.12.18 16:44:20.042 CharArrayToString и StringToCharArray GBPUSD,M5: Time of execution ObjectGetString:     3 строка от ObjectGetString:  qierfhqoerifhqoiwerufhqoiwerfhwioefhqowasdkfj


 

我的解决方案要快10倍以上。

在你的解决方案中加入保存资源的时间和使用ResourceReadImage() 将资源放入数组的时间。

在我的解决方案中,第一个和第二个都不需要。

 
Реter Konow:
我的解决方案要快10倍以上。

彼得,如果你用字符串工作,你在任何情况下都会失去性能。因此,听到你追逐神话般的性能是令人惊讶的,尽管你最初为它选择了一个不适合的解决方案:通过一个字符串传递消息,然后解析该消息。

 
Vasiliy Sokolov:

彼得,如果你用字符串工作,你在任何情况下都会失去性能。因此,听到你追逐神话般的性能是令人惊讶的,尽管你最初为它选择了一个不合适的解决方案:通过字符串传递消息,然后解析该消息。

瓦西里,你还如何在程序之间传输各种类型的数据?

OnChartEvent() 部分适合。

  1. 它在测试器中不起作用。
  2. 随着大量的调用 - 事件队列被堵塞。


 
顺便说一下,严格来说,小于20毫秒的测量是完全无效的,至少在抢占式多线程系统中。但是,即使你接受你的结果(一般情况下我承认),它仍然不能说明什么,因为重要的是全循环成本。而你所测量的只是其中的一部分。
 
Vasiliy Sokolov:
顺便说一下,严格来说,测量小于20毫秒是完全无效的,至少在有抢占式多线程的系统中是如此。但是,即使你接受你的结果(一般情况下我承认),它仍然不能说明什么,因为重要的是全循环成本。而你所测量的只是其中的一部分。

我需要一个通用的、最快的方法。要在测试器中工作,并绕过OnChartEvent()事件队列。

正如测试所显示的,通过资源转移的速度要慢10倍。(不测量保存资源和使用ResourceReadImage() 从其中获取数据的时间) 。

我的解决方案是初始条件下的最佳选择。

 
Vasiliy Sokolov:
...但即使你接受你的结果(一般情况下我承认),它仍然不能说明什么,因为重要的是全循环成本。而你所测量的只是其中的一部分。

诚然,但如果你推断出更多的线路和齿轮,我的方案仍然获胜。

 
Реter Konow:

Vasiliy,你还如何在程序之间传输各种类型的数据?

通过联合体直接映射结构到字节数组,为全局访问共享。我不知道这在技术上是否可行,但如果是这样,速度将是宇宙级的,因为你根本不需要复制任何东西。