내 접근 방식. 코어 - 엔진. - 페이지 85

 

직관에 대해 이야기합시다. 재미있는 예를 하나 들겠습니다. 2년 전에 이 스레드 https://www.mql5.com/en/forum/95632/page12에 게시된 내 게시물:

Реter Konow :

1. 그래픽 엔진의 개념.

2. 그래픽 코어의 개념.

3. MT 플랫폼용 비주얼 스튜디오를 만드는 단계.

4. EA 인터페이스 생성 메커니즘에 대한 설명.


1. 그래픽 엔진은 지표로 실행되는 프로그램입니다. 이 프로그램은 전적으로 사용자 인터페이스를 관리하도록 설계되었습니다. 일련의 기본 기능을 수행합니다.

  • 파일에서 GUI 코어 로드.
  • 사용자 인터페이스 설정을 저장합니다.
  • 인터페이스의 모든 프로세스에 대한 단일 조정된 관리 구현. 창 열기 및 닫기, 창 크기 조정, 창 이동, 창 병합, 크기 조정, 스크립트 재생, 개체 상태 변경, 개체 바인딩, 제어 매개변수 값 관리를 포함하는 인터페이스 관리의 "역학"을 구현합니다. 유형 및 속성에 따라 전역 생성 및 소멸. 변수.

  그래픽 엔진은 다른 지표와 마찬가지로 차트에 추가됩니다. 여기에는 다음 창 세트가 포함됩니다.

  • 작업 표시줄의 오른쪽에는 엔진 자체의 서비스 창을 호출하는 여러 아이콘이 추가됩니다.
  • 파일 탐색기, 부트 파일이 특별한 위치에 있는 인터페이스가 있는 파일 목록 에서 선택됩니다. 폴더.
  • 이 단계에서 기본적인 역할을 하지 않는 선택적 설정 창.

여기에는 원칙적으로 그래픽 엔진의 개념이 소진됩니다. 그것 없이는 인터페이스의 작동이 불가능하다는 것이 중요합니다.



2. 그래픽 코어는 인터페이스의 모든 개체 및 창의 데이터를 포함하는 정보 블록으로 배열로 작성되고 파일로 저장됩니다.

이 블록 은 그래픽 인터페이스의 디지털 반영입니다. 사용자의 지시에 따라 그래픽 엔진에 의해 로드됩니다. 그래픽 엔진 자체에는 자체 내부 그래프가 있습니다. 자체 창을 제공하는 커널이며 해당 커널 내에는 사용자 인터페이스가 (디지털로) 통합될 여지가 있습니다. 통합은 파일에서 그래픽 코어를 로드하는 과정에서 수행됩니다.


3. 내 이해에 따르면 MT 플랫폼에서 Visual Studio를 만드는 것은 두 단계로 나뉩니다.

  • 첫 번째 단계에서 인터페이스 생성자의 파일 버전이 생성됩니다. 여기에서 사용자는 테이블 템플릿으로 작업합니다. 사용자는 인터페이스 요소의 유형과 이름을 테이블에 입력하고 해당 매개변수의 속성을 설정합니다. 생성은 사용자가 창에서 요소의 올바른 위치에 대해 걱정할 필요가 없는 매우 쉬운 프로세스가 될 것이며(엔진이 모든 것을 자동으로 계산함) 요소를 배열하는 것으로 충분할 것입니다. 그에게 필요한 순서.
  • 두 번째 단계에서는 파일 생성자와 동일한 인터페이스 구성 방법이 구현되는 시각적 환경이 만들어지고 그 사용만 훨씬 더 쉽고 편리해집니다. 또한 컨트롤의 모양을 변경하는 기능도 추가됩니다. 일반적으로 사용자는 더 많은 그래픽 옵션을 갖게 됩니다.


4. 일반적인 용어로 인터페이스를 만드는 과정의 메커니즘을 설명하고 기술의 베일을 약간 열어보고 싶습니다. 파일을 통한 인터페이스 생성의 용이성은 어디에서 오는지 설명하십시오.

요점은 다음과 같습니다. 엔진에는 특별한 기능이 있습니다. 최소한의 부팅 정보로 단일 파일을 기반으로 본격적인 그래픽 코어를 생성하는 기능. 이 파일의 부팅 정보는 설명이 필요 없고 사람이 읽을 수 있습니다. 작성 및 편집이 쉽습니다. 예를 들어, 창을 생성하려면 "_CREATE_NEW_WINDOW " 라고 쓰고 체크박스 "_CHECKBOX" 와 이 체크박스의 이름을 생성하는 것으로 충분합니다. (엔진은 자동으로 요소의 이름을 요소 자체의 이름으로 인식합니다. 매개변수의 이름으로).

이 함수는 "G_CORE_BUILDER()"라고 하며 두 가지 주요 소스에서 데이터를 가져오는 그래픽 코어를 빌드합니다. 사용자 생성 부트 파일과 "CONTENT[]" 배열에서 데이터를 가져옵니다. 창 및 제어 플랫폼의 일부입니다. "CONTENT[]" 에는 개체 상태와 스크립트도 포함됩니다. 모든 것이 하나의 어레이에 있습니다. 일반적으로 "CONTENT[]"의 소스 자료 + 사용자 생성 부트 파일은 엔진이 작동하는 그래픽 코어를 빌드하기 위해 "G_CORE_BUILDER()" 함수에 의해 사용됩니다.

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

2년 동안의 노력으로 용어와 개념이 어떻게 바뀌지 않았는지 놀랍습니다. 그리고 함수와 배열, 키워드 - 여기에서 말하는 것처럼. 이 시나리오에 따라 모든 것이 구현됩니다. 그리고 이 기술은 작동하고 발전하고 있습니다. 2년 전의 사실에도 불구하고, 나는 마크업 언어를 개발한 경험이 전혀 없었습니다.

나는 막다른 골목에 부딪치지 않았고, 개념을 바꾸지 않았고, 방향을 바꾸지 않았습니다. 그는 원래 의도한 대로 엔진, 코어 및 마크업 언어를 계속해서 만들었습니다. 그리고 연습은 경로 선택의 정확성을 확인합니다.

이것이 예언적 직관이 아니면 무엇입니까?

 

친애하는 상대.

다음은 스크립트 코드입니다.

  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배 이상 빠릅니다.

Peter, 문자열로 작업하면 어떤 경우에도 성능이 저하됩니다. 따라서 처음에는 문자열을 통해 메시지를 전달한 다음 이 메시지를 구문 분석하는 부적절한 솔루션을 선택했지만 신화적인 성능을 쫓는 방법을 듣는 것은 놀라운 일입니다.

 
Vasiliy Sokolov :

Peter, 문자열로 작업하면 어떤 경우에도 성능이 저하됩니다. 따라서 처음에는 문자열을 통해 메시지를 전달한 다음 이 메시지를 구문 분석하는 부적절한 솔루션을 선택했지만 신화적인 성능을 쫓는 방법을 듣는 것은 놀라운 일입니다.

Vasily, 프로그램 간에 모든 유형의 데이터를 전송하는 다른 방법은 무엇입니까?

OnChartEvent() 는 부분적으로 적합합니다.

  1. 테스터에서 작동하지 않습니다.
  2. 많은 수의 호출로 이벤트 대기열이 막힙니다.


 
그런데 엄밀히 말하면 20밀리초 미만의 측정은 적어도 선점형 멀티스레딩이 있는 시스템에서는 전혀 유효하지 않습니다. 그러나 결과를 수락하더라도(일반적으로 인정합니다) 전체 원을 고려하면 비용이 중요하기 때문에 여전히 아무 말도 하지 않습니다. 그리고 당신이 측정한 것은 그것의 일부일 뿐입니다.
 
Vasiliy Sokolov :
그런데 엄밀히 말하면 20밀리초 미만의 측정은 적어도 선점형 멀티스레딩이 있는 시스템에서는 전혀 유효하지 않습니다. 그러나 결과를 수락하더라도(일반적으로 인정합니다) 전체 원을 고려하면 비용이 중요하기 때문에 여전히 아무 말도 하지 않습니다. 그리고 당신이 측정한 것은 그것의 일부일 뿐입니다.

보편적이고 가장 빠른 방법이 필요합니다. 테스터에서 작업하고 OnChartEvent() 이벤트 대기열을 우회하려면;

테스트에서 알 수 있듯이 리소스를 통한 전송은 10배 더 느립니다. ( ResourceReadImage() 를 사용하여 리소스를 저장하고 데이터를 가져오는 시간을 측정하지 않음) .

내 솔루션은 원래 조건에서 최상의 옵션입니다.

 
Vasiliy Sokolov :
...그러나 당신이 당신의 결과를 받아들인다 해도(나는 전체적으로 그것을 인정합니다), 그것은 여전히 아무 말도하지 않습니다. 왜냐하면 전체 원을 고려한 비용이 중요하기 때문입니다. 그리고 당신이 측정한 것은 그것의 일부일 뿐입니다.

사실이지만 더 많은 행과 전송으로 외삽하면 내 버전이 여전히 이깁니다.

 
Реter Konow :

Vasily, 프로그램 간에 모든 유형의 데이터를 전송하는 다른 방법은 무엇입니까?

전역 액세스를 위해 공유되는 바이트 배열에 대한 유니온을 통한 구조의 직접 매핑. 이것이 기술적으로 실현 가능한지는 모르겠지만, 그렇다면 속도는 우주적일 것입니다. 왜냐하면. 아무것도 복사할 필요가 없습니다.