MQL로 작성된 UI 갤러리 - 페이지 16

 
Nikolai Semko #:

알겠습니다, 피터.
감사합니다. 물론 개발자에게는 편리하지 않습니다.
불필요한 코드와 움직임이 많기 때문입니다. 그래도 함수에 대한 포인터가 있는 변형이 훨씬 낫습니다.

왜 불편할까요? 직접 사용해 보고 결론을 내릴 수 있습니다.)))

1. 생성자가 모든 엘리먼트 핸들러를 자체적으로 인쇄하고 연결하기만 하면 됩니다.

2. 인텔리센스에서는 필요한 기능을 제공하므로 선택만 하면 됩니다.))))

3. 모든 규칙은 간단하고 기억하기 어렵지 않습니다.

시각적 편집기 만 더 쉬울 수 있지만 나중에 설명합니다.

추신 4 년 휴식 후 10 분 만에 작업을 완료했습니다. 나머지 시간에는 기능이 작동하지 않는 이유를 이해하려고 노력한 다음 GIF를 촬영했습니다. )))
 
Реter Konow #:
왜 불편한가요? 직접 사용해 보고 결론을 내리세요.)))

1. 모든 엘리먼트 핸들러는 생성자 자체에서 인쇄되므로 플러그인만 하면 됩니다.

2. 인텔리센스에서는 필요한 기능을 제공하므로 하나를 선택하기만 하면 됩니다.)

3. 모든 규칙은 간단하고 외우기 쉽습니다.


시각적 편집기만 더 쉬울 수 있지만 이는 나중에 설명합니다.

추신 4 년의 휴식 후 10 분 만에 작업을 완료했습니다. 나머지 시간에는 기능이 작동하지 않는 이유를 알아 내려고 노력한 다음 GIF를 촬영했습니다. )))

개발자가 작성해야 할 Internal_API.mqh 파일이 다소 크고 복잡한 것으로 보입니다.



버튼 하나로 이러한 작업에는 몇 줄의 코드가 포함됩니까? 개발자가 객체를 생성하여 일반적인 방법으로 GUI를 개발하는 것이 중요합니다. 예를 들어 다음과 같은 작업이 있습니다:

#resource "//Images//eclipse-alt.png" as uchar eclipse_alt[] // загружаем в ресурс изображение иконки с файла png
#include  <My\IconsMenu.mqh>

//+------------------------------------------------------------------+
IconsMenu menu(5,15,1,ANCHOR_RIGHT_UPPER,true,27, CheckBox, 0x00EEEEEE); // создаем меню
//+------------------------------------------------------------------+
void TimerMenu() { // таймер необходим для всплывающей подсказки
   menu.Timer();
}
//+------------------------------------------------------------------+
int OnInit() {
   InitMenu();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}
//+------------------------------------------------------------------+
void OnTick() {
}
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
   menu.ChartEvent(id,lparam,dparam,sparam);
}
//+------------------------------------------------------------------+
void InitMenu() {
   menu.SetTimerFunction(TimerMenu); // установка функции таймера
   bool dark_mode = W.Color!=0;      // определяем текущую цветовую схему чарта
   menu.AddPng(eclipse_alt,"dark/light theme",ChangeColorScheme,dark_mode); // создаем элемент кнопки-иконки
   menu.Draw();
}
//+------------------------------------------------------------------+
void ChangeColorScheme (bool checked) {
   struct ColorScheme {
      uint           background;
      uint           foreground;
      uint           grid;
      uint           bar;
      uint           bull;
      uint           bear;
      uint           volume;
   };
   static const ColorScheme c[2] = {{0x00000000,0x00DDAAAA,0x00804040,0x0000FF00,0x00000000,0x00FFFFFF,0x0032CD32},
      {0x00FFFFFF,0x00000000,0x00C0C0C0,0x00000000,0x00FFFFFF,0x00000000,0x00008000}
   };
   int clr_scheme = checked?1:0;

   if (checked) {
      menu.clr_off = 0x00606060;
      menu.clr_hover = 0x30808080;
   } else {
      menu.clr_off = 0x00EEEEEE;
      menu.clr_hover = 0x30FFFFFF;
   }
   menu.ChangeColorAll();
   menu.Draw();

   ChartSetInteger(0,CHART_COLOR_BACKGROUND,c[clr_scheme].background);
   ChartSetInteger(0,CHART_COLOR_FOREGROUND,c[clr_scheme].foreground);
   ChartSetInteger(0,CHART_COLOR_CHART_LINE,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_DOWN,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CHART_UP,c[clr_scheme].bar);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,c[clr_scheme].bull);
   ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,c[clr_scheme].bear);
   ChartSetInteger(0,CHART_COLOR_GRID,c[clr_scheme].grid);
   ChartSetInteger(0,CHART_COLOR_VOLUME,c[clr_scheme].volume);
   ChartRedraw();
}

GUI의 생성 및 사용자 지정과 관련된 모든 항목은 노란색으로 강조 표시됩니다.
새로운 GUI 요소는 각각 한 줄의 코드 + 이 요소의 이벤트 핸들러 함수로 구성되어 있으므로 다른 작업을 할 필요가 없습니다.



파일:
 
니콜라이, 이미 다 설명했잖아요.

1. 빌드된 GUI를 저장할 때 파일이 자동으로 인쇄됩니다.

2. 아무도 특별히 작성하지 않습니다.

3. 파일 내부에는 사용자가 마크업 언어로 선언한 컨트롤의 준비된 핸들러가 있습니다.

4.. 핸들러는 엔진으로부터 인터페이스 이벤트를 수신합니다.

5. 사용자는 핸들러에 자신의 코드만 삽입하면 됩니다.

그게 전부입니다. 반복하지 않겠습니다.

 
Реter Konow 컨트롤의 준비된 핸들러가 있습니다.

4.. 핸들러는 엔진으로부터 인터페이스 이벤트를 수신합니다.

5. 사용자는 핸들러에 자신의 코드만 삽입합니다.

그게 다입니다. 반복하지 않겠습니다.



이 파일을 제공하지 않았기 때문에 가정을 해보겠습니다. 모든 파일이 포함된 버전이 나올 때까지 기다렸다가 실시간으로 테스트할 수 있도록 하겠습니다.

 
몇 줄의 코드에 대한 질문에 대해.

문제를 해결할 때 인텔리 센스에서 핸들러에 2 줄을 삽입했습니다. 그림에 나와 있습니다. 괄호 안에 색상 이름 만 썼습니다. 그리고 두 줄의 함수 (당신 대신). 다른 것은 없습니다.
 
출시 전에 코드를 "정리"하고, 엔진을 "재구축"하고, 불필요한 것들을 (찾을 수 있는 경우) 제거하는 동시에 모든 것이 어떻게 작동했는지 기억하고 있습니다.

일반적으로는 곧 업로드할 예정입니다.
 
Реter Konow # :
출시 전에 코드를 '정리'하고, 엔진을 '재구축'하고, 불필요한 것들을 제거하면서(찾을 수 있다면) 동시에 모든 것이 어떻게 작동했는지 기억하고 있습니다.

일반적으로는 곧 업로드할 예정입니다.

출시를 기대하며 여러분의 코딩 아이디어를 이해하고 싶습니다.

 
Nikolai Semko # :

피터, 이해가 안 돼요. 질문에 대답하지 않으셨어요.
프로그래머는 작업하는 동안 GUI와 상호 작용하는 방법을 아는 것이 중요합니다.
다음은 제 GUI의 예입니다. 밝게/어두운 테마 바로 가기를 클릭하면 이 이벤트가 즉시 배경색과 선을 변경하는 기능을 트리거했습니다. 이 상호작용은 어떻게 하나요?


" 사용자가 내 코드와 (전혀) 상호 작용하지 않습니다 . "?
프로그래머는 코드가 아니라 이 코드를 생성해야 하는 이벤트와 상호 작용해야 합니다.

결국 GUI는 별도의 독립된 프로그램이 아닙니다. GUI는 궁극적으로 개발자의 메인 프로그램과 상호 작용해야 합니다. 그것이 인디케이터이든 EA이든 상관없습니다.

사진에서 보여주신 GUI가 멋진데 어떻게 구현하셨는지 알려주실 수 있나요?

 
hini #:

출시를 기대하며 코딩 아이디어를 이해하고 싶습니다.

알았어요. (웃음)

릴리스에 대해 조금 설명해드리겠습니다. 4년의 휴식기 후에 엔진의 최신 버전이 사라졌습니다. 바로 발견되지는 않았습니다. 이전 버전은 작동하지만 빌더 버전으로 업그레이드해야 합니다. 이를 위해서는 코드에 대해 충분히 깊이 들어가야 하는데, 제가 약간 잊고 있었습니다. 하지만 큰 문제는 아니며 곧 완료될 것입니다.

엔진이 지연되어 릴리스를 두 부분으로 나누기로 결정했습니다. 먼저 생성자를 보여드리겠습니다. 원하는 분들은 마크업 언어에 익숙해지고 필요한 GUI를 작성해 보세요. 잠시 후 업데이트 된 엔진을 대중에게 제공 할 것입니다. 그 후 생성 된 GUI를 연결하는 데 도움을 줄 것이며 사용자 지정 전문가 고문 또는 지표와 함께 작동합니다. 그러면 모든 사람이 마크 업 언어 작업의 간단한 원칙과 애플리케이션에 인터페이스에 연결하는 방법을 배우게됩니다.

생성자가 거의 릴리스 준비가 완료되고 엔진에 약간의 수정이 필요하기 때문에 두 부분으로 릴리스하는 것이 더 쉽습니다.

물론 생성자 릴리스와 함께 마크 업 코드의 예와 작성에 대한 추가 지침을 제공 할 것입니다.

주말에 기다려주세요).
 
디자이너가 출시된 이후에는 ME에서 바로 GUI를 디자인하고 싶은 분들을 위해 한 가지 설명을 덧붙이고 싶습니다.

1. 이를 위해 릴리스 빌드에서 "KIB-source.mqh" 인클루전 파일을 엽니다.

2. 2. 인디케이터 폴더에 저장하고 그 후에 컴파일합니다.

3. 결과적으로 MT5 내비게이터 브랜치에 "KIB-source.ex5"라는 새 지표가 표시되고 무료 차트에 표시됩니다.

4. 사용자는 MQL5 탐색기\include\... 폴더에 마크업 코드가 있는 파일을 만듭니다.

예를 들어, MQL5\include\My_GUI\Project_1\.....

이 폴더에는 프로젝트의 인터페이스가 포함된 파일을 저장합니다. 이 폴더에서 마크업 코드를 작성, 편집, 실험 및 UI를 디자인합니다.

5. UI를 빌드할 때 마크업 언어로 작업하는 동안 결과가 MT5 차트에 표시되도록 지정하는 것이 중요하며, 첫 번째 릴리스에서 제공 할 지표 "KIB-source.ex5"와 전문가 조언자 (생성자) "KIB.ex5"가 표시됩니다. 둘 다 같은 차트에 있어야 합니다.

또한 (매우 중요한), ME에서 병렬로 열린 "KIB-source.mq5" 파일을 컴파일하는 동안 (사용자 지정 GUI 프로젝트의 파일과 함께) 모든 마크업 코드가 동일한 차트에서 생성자로 전송되어 GUI가 완전히 새로 빌드됩니다. 인터페이스의 창과 요소 수에 따라 200밀리초에서 1000밀리초 정도 걸립니다. 그리고 사용자는 변경된 결과를 즉시 확인할 수 있습니다. 마크업 코드를 변경하고 "KIB-source.mq5"를 컴파일하면 순식간에 MT5 차트에서 결과를 볼 수 있는 등 모든 것이 매우 빠르고 거의 실시간으로 이루어집니다. 따라서 두 대의 모니터에서 작업하는 것이 바람직합니다. 한 모니터에는 MT5가, 다른 모니터에는 ME가 열려 있습니다.

6. 마크업 언어의 편리함은 단순성과 창이나 프로젝트 간에 쉽게 복사할 수 있는 요소와 창 템플릿을 만들 수 있다는 점입니다.

7. 디자이너가 아카이브에서 오픈 소스임을 추가하고 싶습니다. 따라서 사용자는 다음과 같은 작업을 수행합니다:

1. 아카이브를 엽니다.
2. MQL5\include\ 폴더에 KIB 폴더를 배치합니다.
3. 3. 아카이브의 CONNECTION.mqh 파일을 MQL5\inlude\ 폴더에 넣습니다(하위 폴더에 넣지 마십시오).
4. KIB.mq5 파일을 MQL5\Experts\ 폴더에 넣고 ME에서 열어 컴파일한 후 저장하여 MT5 내비게이터에 KIB.ex5 Expert Advisor가 나타나도록 합니다.
5. 이 보조지표 KIB-source.mq5와 동일한 차트에 이 Expert Advisor를 업로드합니다.
6. 그 후 ME에서 KIB.mq5 생성자 파일을 닫을 수 있습니다. 더 이상 필요하지 않습니다.


모든 것이 작동할 준비가 되었습니다.