✔️ GUI 그래픽 라이브러리 MT4©: https://www.mql5.com/en/market/product/206760
✔️ GUI 그래픽 라이브러리 MT5©: https://www.mql5.com/en/market/product/206761
✔️ 전체 문서, 요소 갤러리 및 이미지를 코드로 변환하는 도구5: https://www.betasoft.dev/gui-graphic-library
포지션 테이블, 주문 티켓 및 실시간 차트.
GUI 그래픽 라이브러리는 Expert Advisor와 지표에 창, 탭, 메뉴, 표, 차트, 선택기, 대화 상자 및 거래 위젯을 포함한 완벽한 인터페이스를 제공합니다. 모든 요소는 하나의 캔버스에 그려지며, 동일한 코드가 MetaTrader 4와 MetaTrader 5에서 모두 작동하고, 전체 API는 15개의 함수로 구성되어 있습니다.
이 가이드는 다운로드부터 첫 번째 작동 패널 생성, 그리고 가장 자주 수행하게 될 작업까지 안내합니다. 모든 코드 예제는 공개된 포함 파일만 사용하므로, 여러분의 프로그램에 붙여넣어 사용할 수 있습니다.
78개 요소 중 일부: 버튼, 입력란, 슬라이더, 탭.
1. 시작하기 전에
- Windows용 MetaTrader 4 또는 MetaTrader 5입니다. 글꼴과 아이콘은 Windows 화면 배율(100%, 125%, 150%, 200%)을 따릅니다.
- 데모 및 사용자 지정 프로그램을 컴파일하는 데 사용하는 MetaEditor입니다.
- 터미널 옵션에서 허용할 사항이 없습니다. 이 라이브러리는 DLL을 사용하지 않고, 웹 요청을 하지 않으며, 터미널 전역 변수를 사용하지 않습니다.
- MT4와 MT5 버전은 별개의 제품입니다. 사용하시는 터미널에 맞는 버전을 설치하세요.
2. 설치
- 터미널에서 파일 메뉴를 선택한 다음 데이터 폴더 열기를 선택하세요.
- MetaTrader 5의 경우 MQL5 폴더를, MetaTrader 4의 경우 MQL4 폴더를 엽니다.
- 위 표에 표시된 폴더(Libraries, Include, Experts 및 Indicators)에 각 파일을 복사하십시오.
- MetaEditor에서 각 데모를 열고 F7 키를 누르십시오. 결과는 오류 0개, 경고 0개로 표시되어야 합니다.
- 터미널로 돌아가서 네비게이터를 새로 고침(마우스 오른쪽 버튼 클릭 후 새로 고침)하면 새 프로그램이 나타납니다.
폴더 구조는 다음과 같아야 합니다.
MQL5/
Include/GUI_Graphic_Library.mqh
Libraries/GUI_Graphic_Library.ex5
Experts/GUI_Graphic_Library_FullDemo.mq5
GUI_Graphic_Library_ElementTests.mq5
Indicators/GUI_Graphic_Library_IndicatorWindow.mq5
GUI_Graphic_Library_IndicatorChart.mq5
MQL4/ the same files with .mq4 and .ex4
라이브러리 파일의 이름을 바꾸지 마십시오. 포함 파일에서 해당 이름으로 라이브러리 파일을 불러옵니다.
설치 후 점검 사항
| 확인하다 | 어디 |
|---|---|
| .ex5 (또는 .ex4) 파일은 라이브러리 폴더에 있습니다. | 데이터 폴더 |
| .mqh 파일은 Include 폴더에 있습니다. | 데이터 폴더 |
| 데모는 오류 없이 컴파일됩니다. | 메타에디터 |
| 데모에서는 차트의 창이 표시됩니다. | 차트 |
| 전문가 탭에는 "지원되지 않음"이라는 항목이 없습니다. | 터미널, 툴박스 |
GUI_Graphic_Library.mqh 파일 안에는 무엇이 들어있나요?
포함 파일은 의도적으로 크기가 작습니다. 가져오기 블록 위에는 열거형(객체 유형, 속성, 이벤트, 테마 및 아이콘)이 선언되어 있습니다. 아래의 가져오기 블록은 컴파일된 라이브러리를 로드하고 15개의 함수 목록을 표시합니다. MetaTrader 5는 컴파일러가 선택한 .ex5 파일을 로드하고 MetaTrader 4는 .ex4 파일을 로드합니다. 이 파일은 포함만 하고 절대 수정하지 않습니다.
#ifdef __MQL5__ #import "\\Market\\GUI_Graphic_Library.ex5" #else #import "\\Market\\GUI_Graphic_Library.ex4" #endif string Gui_Version(); bool Gui_Create( const long chart= 0 , const string name= "GUI_Graphic_Library" , const int subwin= 0 ); void Gui_Destroy(); void Gui_ChartEvent( const int id, const long lparam, const double dparam, const string sparam); void Gui_Timer(); void Gui_Update( const bool force= false ); bool Gui_NextEvent(ENUM_GUI_EVENT &event, int &sender, long &lparam, double &dparam, string &sparam); int Gui_Add( const ENUM_GUI_OBJECT type, const int parent, const string name, const string text, const int x, const int y, const int w, const int h); int Gui_Set( const int id, const ENUM_GUI_PROP prop, const string s= "" , const double a= EMPTY_VALUE , const double b= EMPTY_VALUE , const double c= EMPTY_VALUE , const double d= EMPTY_VALUE ); string Gui_Get( const int id, const ENUM_GUI_PROP prop, const string s= "" , const double a= EMPTY_VALUE , const double b= EMPTY_VALUE ); double Gui_GetNum( const int id, const ENUM_GUI_PROP prop, const string s= "" , const double a= EMPTY_VALUE , const double b= EMPTY_VALUE ); int Gui_SetArray( const int id, const ENUM_GUI_PROP prop, const double &values[], const double a= EMPTY_VALUE ); int Gui_AddImage( const string name, const uint &argb[], const int w, const int h); int Gui_Find( const string name); void Gui_BringToFront(); #import
다음은 나타나는 순서대로 나열된 15가지 기능입니다.
| 기능 | 이 제품의 기능은 무엇인가요? | 당신이 그것을 부르는 곳 |
|---|---|---|
| GUI 버전 | 라이브러리 버전을 텍스트로 반환합니다. | 어딘가에 |
| GUI_생성 | 차트에서 GUI를 시작합니다. 현재 차트를 사용하려면 0을 전달하고, 프로그램 이름과 지표를 표시할 하위 창 번호를 전달하세요. 성공하면 true를 반환합니다. | OnInit |
| Gui_Destroy | GUI와 GUI가 그린 모든 내용을 제거합니다. | 온데이닛 |
| Gui_ChartEvent | 차트 이벤트(마우스, 키보드, 클릭)를 라이브러리에 전달합니다. | 온차트이벤트 |
| GUI_타이머 | 라이브러리의 타이머(애니메이션, 알림, 카운터)를 실행합니다. | 온타이머 |
| GUI_업데이트 | 변경된 부분만 다시 그립니다. true를 전달하면 모든 것을 다시 그립니다. | 각 핸들러의 끝 |
| Gui_NextEvent | 큐에서 다음 이벤트(클릭, 변경, 대화 상자 결과, 거래 요청)를 가져옵니다. 큐가 비어 있으면 false를 반환합니다. | 이벤트 루프 |
| Gui_Add | 요소를 생성하고 해당 요소의 ID를 반환합니다. 유형, 부모 요소, 이름, 텍스트, x, y, 너비, 높이 값을 입력으로 받습니다. | OnInit |
| Gui_Set | 요소의 속성을 변경하거나 해당 요소의 액션을 실행합니다. 요소가 해당 기능을 지원하지 않는 경우 -1을 반환하고 로그에 한 줄을 추가합니다. | 어딘가에 |
| Gui_Get | 속성을 텍스트로 읽습니다. | 어딘가에 |
| Gui_GetNum | 속성을 숫자로 읽습니다. | 어딘가에 |
| Gui_SetArray | 예를 들어 전체 차트 시리즈와 같은 요소에 숫자 목록을 보냅니다. | 어딘가에 |
| Gui_AddImage | ARGB 픽셀 배열에서 이미지를 등록하여 요소들이 이미지를 표시할 수 있도록 합니다. 웹사이트의 Image to Code 도구는 PNG 파일에서 이 배열을 생성합니다. | OnInit |
| Gui_Find | 이름으로 요소의 ID를 찾습니다. | 어딘가에 |
| Gui_BringToFront | 그 뒤에 그린 차트 객체 위로 GUI를 이동합니다. | 차트 개체를 생성한 후 |
이것이 전체 인터페이스입니다. 이 가이드의 나머지 내용은 모두 이 15가지 호출의 조합입니다.
3. 전체 데모를 실행하세요
- 차트를 여세요. 예를 들어 1280x720픽셀 이상의 큰 창에서 가장 많은 정보를 볼 수 있습니다.
- 네비게이터에서 GUI_Graphic_Library_FullDemo를 차트로 드래그하세요.
- 상단의 섹션 탭을 사용하세요: 홈, 사용 사례, 버튼, 입력, 선택기, 데이터, 차트, 레이아웃, 피드백, 거래 및 설정.
데모 계정은 InpLiveTrading 입력값을 true로 설정하지 않으면 주문을 전송하지 않습니다. 실계정에서는 이 값을 비활성화하십시오. 메인 창을 닫으면 Expert Advisor가 자동으로 종료됩니다.
한 번에 하나의 요소만 살펴보려면 GUI_Graphic_Library_ElementTests를 사용하세요. 선택 창에서 그룹을 클릭하면 됩니다.
라이브러리의 요소만으로 구성된 대시보드.
4. 첫 번째 패널
이것은 완전한 Expert Advisor입니다. 거래량 선택 상자, 매수 버튼, 그리고 상태 표시줄이 있는 창으로 구성되어 있습니다. 실제 거래는 수행하지 않고 메시지만 표시합니다.
#include <GUI_Graphic_Library.mqh> int wMain, spLots, btnBuy, lblInfo; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit () { if (!Gui_Create( 0 , "MyPanel" )) return INIT_FAILED ; // 0 = this chart Gui_Set( 0 , GUI_PROP_THEME, "" , GUI_THEME_DARK); wMain = Gui_Add(GUI_OBJ_WINDOW, 0 , "wMain" , "My panel" , 20 , 40 , 300 , 170 ); Gui_Set(wMain, GUI_PROP_THEME_BUTTON, "" , true ); // sun / moon button Gui_Set(wMain, GUI_PROP_MAIN_WINDOW, "" , true ); // close asks to remove the program spLots = Gui_Add(GUI_OBJ_SPIN, wMain, "spLots" , "" , 10 , 10 , 280 , 30 ); Gui_Set(spLots, GUI_PROP_RANGE, "" , 0.01 , 50 , 0.01 , 2 ); // min, max, step, digits Gui_Set(spLots, GUI_PROP_VALUE, "" , 0.10 ); Gui_Set(spLots, GUI_PROP_SUFFIX, "lots" ); btnBuy = Gui_Add(GUI_OBJ_BUTTON, wMain, "btnBuy" , "BUY" , 10 , 50 , 280 , 40 ); Gui_Set(btnBuy, GUI_PROP_STYLE, "" , GUI_BUTTON_SUCCESS); Gui_Set(btnBuy, GUI_PROP_ICON, "" , GUI_ICON_ARROW_UP); lblInfo = Gui_Add(GUI_OBJ_LABEL, wMain, "lblInfo" , "Ready" , 10 , 100 , 280 , 20 ); Gui_Set(lblInfo, GUI_PROP_DIM, "" , true ); Gui_Set( 0 , GUI_PROP_REDRAW); return INIT_SUCCEEDED ; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ProcessEvents() { ENUM_GUI_EVENT ev; int sender; long l; double d; string s; while (Gui_NextEvent(ev, sender, l, d, s)) if (ev == GUI_EVENT_CLICK && sender == btnBuy) { double lots = Gui_GetNum(spLots, GUI_PROP_VALUE); Gui_Set(lblInfo, GUI_PROP_TEXT, "Buy " + DoubleToString (lots, 2 ) + " lots" ); Gui_Set( 0 , GUI_PROP_TOAST, "Buy|" + DoubleToString (lots, 2 ) + " lots" , GUI_NOTICE_SUCCESS, 3000 ); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit ( const int r) { Gui_Destroy(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTimer () { Gui_Timer(); ProcessEvents(); Gui_Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnChartEvent ( const int id, const long &l, const double &d, const string &s) { Gui_ChartEvent(id, l, d, s); ProcessEvents(); Gui_Update(); }
패턴은 절대 변하지 않는다.
- OnInit 메서드는 GUI와 그 구성 요소를 생성합니다.
- OnChartEvent와 OnTimer는 라이브러리에 이벤트를 전달하고, 큐를 읽어 Gui_Update를 호출합니다.
- OnDeinit 메서드는 GUI를 파괴합니다.
5. 도서관은 어떻게 생각하는가
- ID. Gui_Add는 정수 ID를 반환합니다. 필요한 ID를 저장해 두거나, 나중에 Gui_Find("name")을 사용하여 이름으로 찾을 수 있습니다. ID 0은 테마, 토스트 메시지, 대화 상자, 카운터 등 GUI 자체입니다.
- 부모 요소. 모든 요소는 부모 요소인 창 또는 컨테이너에 추가됩니다. 창, 메뉴 및 가격표는 부모 요소 0을 사용합니다. 탭의 경우 부모 요소는 탭 요소이며, 반환된 ID는 자식 요소를 추가하는 페이지입니다.
- 속성. Gui_Set(id, property, text, a, b, c, d) 함수는 속성을 변경하거나 작업을 실행합니다. text 인수에는 text 값을, a~d 인수에는 숫자, 색상 및 열거형 값을 입력합니다. Gui_Get 함수는 text 값을 읽고, Gui_GetNum 함수는 숫자를 읽습니다.
- 이벤트. 라이브러리는 사용자가 수행한 작업을 큐에 저장합니다. Gui_NextEvent를 사용하여 큐를 읽을 수 있습니다.
- 좌표는 100% 배율의 픽셀 단위입니다. 라이브러리는 윈도우 디스플레이 배율을 자동으로 곱해줍니다.
요소가 지원하지 않는 속성을 전달해도 아무런 문제가 발생하지 않습니다. 호출은 -1을 반환하고 Experts 로그에 한 줄이 기록됩니다.
6. 당신이 가장 많이 하게 될 업무들
사용자가 입력했거나 선택한 내용을 읽으세요.
string name=Gui_Get(edName,GUI_PROP_TEXT); double lots=Gui_GetNum(spLots,GUI_PROP_VALUE); int tab =( int )Gui_GetNum(tabs,GUI_PROP_SELECTED);
탭
int t=Gui_Add(GUI_OBJ_TABS,win, "tabs" , "" , 10 , 10 , 600 , 300 ); int pOrders =Gui_Add(GUI_OBJ_TAB,t, "" , "Orders" , 0 , 0 , 0 , 0 ); // returns the page int pHistory=Gui_Add(GUI_OBJ_TAB,t, "" , "History" , 0 , 0 , 0 , 0 ); Gui_Add(GUI_OBJ_BUTTON,pOrders, "b1" , "Close all" , 10 , 10 , 120 , 30 );
테이블
int tb=Gui_Add(GUI_OBJ_TABLE,page, "tbl" , "" , 10 , 10 , 600 , 300 ); Gui_Set(tb,GUI_PROP_ADD_COLUMN, "Symbol" , 120 ,GUI_ALIGN_LEFT); Gui_Set(tb,GUI_PROP_ADD_COLUMN, "Strength" , 130 ,GUI_ALIGN_LEFT,GUI_COL_PROGRESS); Gui_Set(tb,GUI_PROP_ADD_BUTTON_COLUMN, "Action" , 100 ,GUI_BUTTON_PRIMARY); Gui_Set(tb,GUI_PROP_ADD_ROW, "EURUSD|64|Trade" ); Gui_Set(tb,GUI_PROP_SORT, "" , 0 , true );
버튼 셀을 클릭하면 lparam에 행 번호, dparam에 열 번호를 전달하여 GUI_EVENT_CELL_BUTTON 이벤트가 전송됩니다.
차트
int ch=Gui_Add(GUI_OBJ_LINECHART,page, "chart" , "Price" , 10 , 10 , 500 , 260 ); int ln=Gui_Set(ch,GUI_PROP_ADD_SERIES, "Close" , clrDodgerBlue ); // returns the series index double closes[]; CopyClose ( _Symbol , PERIOD_H1 , 0 , 100 ,closes); Gui_SetArray(ch,GUI_PROP_SERIES,closes,ln); // a whole series at once int cd=Gui_Add(GUI_OBJ_CANDLECHART,page, "cd" , _Symbol , 10 , 280 , 500 , 260 ); Gui_Set(cd,GUI_PROP_LOAD_BARS, _Symbol , 80 ); Gui_Set(cd,GUI_PROP_ADD_MA, "" , 20 , clrDodgerBlue ); Gui_Set(cd,GUI_PROP_ADD_BANDS, "" , 20 , 2.0 );
대화와 건배
enum { CMD_CLOSE_ALL= 500 }; Gui_Set( 0 ,GUI_PROP_CONFIRM, "Close all|Close every position?|Close|Cancel" ,CMD_CLOSE_ALL); // later, in the event loop: if (ev==GUI_EVENT_DIALOG && Gui_GetNum(sender,GUI_PROP_CMD)==CMD_CLOSE_ALL && l== 0 ) CloseAll(); // l = button index, -1 = cancelled Gui_Set( 0 ,GUI_PROP_TOAST, "Order|Filled" ,GUI_NOTICE_SUCCESS, 3000 );
테마와 색상
Gui_Set( 0 ,GUI_PROP_THEME, "" ,GUI_THEME_MIDNIGHT); // DARK, LIGHT, MIDNIGHT, HIGHCONTRAST, SOFT Gui_Set( 0 ,GUI_PROP_ACCENT, "" , clrOrange ); Gui_Set( 0 ,GUI_PROP_RADIUS, "" , 10 );
창과 값을 기억하세요
Gui_Set( 0 ,GUI_PROP_AUTO_LAYOUT, "" , true ); // load now, save when the GUI is destroyed Gui_Set( 0 ,GUI_PROP_LOAD_VALUES); // in OnInit Gui_Set( 0 ,GUI_PROP_SAVE_VALUES); // in OnDeinit
두 방법 모두 작은 텍스트 파일을 사용합니다. 터미널 전역 변수는 사용하지 않습니다.
매초마다 무언가를 하세요
Gui_Set( 0 ,GUI_PROP_COUNTER, "refresh" , 1000 , true ); // name, ms, repeat // in OnTimer: if (Gui_GetNum( 0 ,GUI_PROP_COUNTER_DONE, "refresh" )!= 0 ) RefreshNumbers();
7. 자체 주문 기능을 갖춘 거래 패널
주문 티켓, 포지션 패널, 위험 계산기는 계정과 종목 코드를 읽어 이벤트를 표시합니다. 이러한 도구들은 주문을 직접 전송하지는 않습니다. 사용자가 매수 또는 매도 버튼을 클릭했을 때 어떤 일이 발생하는지는 사용자가 결정해야 합니다.
#include <GUI_Graphic_Library.mqh> #ifdef __MQL5__ #include <Trade\Trade.mqh> CTrade g_trade; #endif input bool InpLiveTrading = false ; // send real orders int g_ticket = 0 ; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit () { if (!Gui_Create( 0 , "GUI_TradePanel" )) return INIT_FAILED ; int w = Gui_Add(GUI_OBJ_WINDOW, 0 , "w" , "Trade" , 20 , 40 , 360 , 260 ); Gui_Set(w, GUI_PROP_MAIN_WINDOW, "" , true ); g_ticket = Gui_Add(GUI_OBJ_ORDERTICKET, w, "ticket" , _Symbol , 10 , 10 , 340 , 212 ); Gui_Set(g_ticket, GUI_PROP_LOTS, "" , 0.10 ); Gui_Set(g_ticket, GUI_PROP_STOP_POINTS, "" , 300 ); Gui_Set(g_ticket, GUI_PROP_TP_POINTS, "" , 600 ); Gui_Set(g_ticket, GUI_PROP_SHOW_LINES, "" , true ); // SL and TP lines on the chart Gui_Set( 0 , GUI_PROP_CLEAR_EVENTS); return INIT_SUCCEEDED ; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void MyTrade( const bool buy, const double lots, const double sl, const double tp) { if (!InpLiveTrading) { Print ( "Trading is off. Would " , buy ? "buy " : "sell " , lots, " lots" ); return ; } #ifdef __MQL5__ if (buy) g_trade.Buy(lots, _Symbol , 0.0 , sl, tp); else g_trade.Sell(lots, _Symbol , 0.0 , sl, tp); #else if (buy) OrderSend ( _Symbol , OP_BUY, lots, Ask, 3 , sl, tp, "GUI" , 0 , 0 , clrGreen ); else OrderSend ( _Symbol , OP_SELL, lots, Bid, 3 , sl, tp, "GUI" , 0 , 0 , clrRed ); #endif } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ProcessEvents() { ENUM_GUI_EVENT ev; int sender; long l; double d; string s; while (Gui_NextEvent(ev, sender, l, d, s)) if (ev == GUI_EVENT_TRADE) // l: 0 buy, 1 sell d: lots s: "sl|tp" prices { string p[]; StringSplit (s, '|' , p); double sl = ( ArraySize (p) > 0 ) ? StringToDouble (p[ 0 ]) : 0.0 ; double tp = ( ArraySize (p) > 1 ) ? StringToDouble (p[ 1 ]) : 0.0 ; MyTrade(l == 0 , d, sl, tp); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit ( const int r) { Gui_Destroy(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTimer () { Gui_Timer(); ProcessEvents(); Gui_Update(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnChartEvent ( const int id, const long &l, const double &d, const string &s) { Gui_ChartEvent(id, l, d, s); ProcessEvents(); Gui_Update(); }
먼저 데모 계정에서 테스트해 보세요. 실제 주문을 보내기 전에, 로트 크기가 해당 종목의 최소, 최대 및 스텝과 일치하는지, 그리고 손절매 거리가 브로커의 손절매 수준과 일치하는지 확인하십시오.
위치도 같은 방식으로 작동합니다. GUI_OBJ_POSITIONS를 추가한 다음 GUI_EVENT_POSITION에 반응합니다(lparam은 티켓이고, dparam은 닫기의 경우 1, 수정의 경우 2입니다).
8. 지표에 활용하기
인디케이터는 자체 하위 창에 GUI를 그릴 수 있습니다. Gui_Create 함수에 해당 창의 번호를 전달하세요.
#property indicator_separate_window int OnInit () { int sub= ChartWindowFind (); Gui_Create( 0 , "GUI_MyIndicator" ,sub); // add windows and controls as usual return INIT_SUCCEEDED ; }
지표를 사용하여 가격 차트에 그림을 그리려면 하위 창 0을 사용하십시오. 두 가지 지표 데모는 완전한 예제입니다. 프로그램과 차트당 하나의 GUI가 있으므로 각 프로그램에 고유한 GUI 이름을 지정하십시오.
9. 메타트레이더 4 및 메타트레이더 5
| 주제 | 메타트레이더 4 | 메타트레이더 5 |
|---|---|---|
| 라이브러리 파일 | .ex4 | .ex5 |
| 컨텍스트 메뉴 | 왼쪽 버튼을 길게 누르거나 Ctrl 키를 누른 상태에서 클릭하세요. | 마우스 오른쪽 클릭 |
| 마우스 휠 | 터미널에서 전송되지 않습니다. 스크롤 막대를 사용하세요. | 공장 |
| 시장 깊이 | 레벨을 직접 추가하세요 | 시장 관련 서적을 읽습니다. |
| 경제 캘린더 | 행을 직접 추가하세요 | 터미널에서 로드됨 |
| 타자 | 내장된 미국 주요 지도 | 모든 키보드 레이아웃이 작동합니다. |
10. 만약 어떤 것이 작동하지 않는다면
| 문제 | 어떻게 해야 할까요? |
|---|---|
| 차트에 아무것도 나타나지 않습니다. | Gui_Create 함수가 true를 반환했는지 확인하고 전문가 탭의 마지막 줄을 읽으십시오. |
| 컴파일러가 GUI_Graphic_Library.mqh 파일을 열 수 없습니다. | 포함 파일이 프로그램이 설치된 데이터 폴더 내의 Include 폴더에 없습니다. |
| 프로그램이 실행 시 라이브러리를 로드할 수 없습니다. | 라이브러리에서 .ex5 또는 .ex4 파일이 없거나 파일 이름이 변경되었습니다. |
| 코드에서 값이 변경되어도 표시되지 않습니다. | 핸들러의 끝에서 Gui_Update()를 호출하세요. |
| 전문가 탭에는 해당 속성이 지원되지 않는다고 표시됩니다. | 해당 요소에는 해당 속성이 존재하지 않습니다. API 참조를 확인하십시오. |
| 두 프로그램이 하나의 차트에서 경쟁합니다. | Gui_Create 함수에서 각각에 고유한 이름을 지정하세요. |
| 차트 선이 GUI를 덮고 있습니다. | 차트 객체를 생성한 후 Gui_BringToFront() 함수를 호출하세요. |
| 글자 크기가 너무 작거나 너무 큽니다. | Gui_Set(0,GUI_PROP_SCALE,"",1.5)를 설정하거나 Windows 배율을 변경한 후 터미널을 다시 시작하십시오. |
| 도서관이 무슨 일을 하고 있는지 보고 싶으신가요? | 디버그 오버레이를 활성화하려면 Gui_Set(0,GUI_PROP_DEBUG,"",true)를 켜십시오. |
11. 팁
- 각 핸들러의 끝에서 Gui_Update()를 호출하세요. 그러면 변경된 부분만 다시 그려집니다.
- 숨겨진 탭 페이지와 접힌 창은 화면 재표시를 발생시키지 않으므로 타이머를 이용한 업데이트는 비용이 저렴합니다.
- 차트를 많이 실행하는 경우 GUI_PROP_MAX_FPS를 사용하여 프레임 속도를 제한하십시오.
- 패널을 생성하는 동안 대기 중인 이벤트를 삭제하려면 OnInit 메서드 끝에 GUI_PROP_CLEAR_EVENTS를 사용하십시오.
- 웹사이트의 이미지-코드 변환 도구를 사용하여 PNG 로고 또는 아이콘을 Gui_AddImage 함수에서 사용할 배열로 변환하세요.
- 새로운 열거형 값은 마지막에만 추가되므로 이전 버전의 포함 파일을 사용하여 빌드된 프로그램은 업데이트 후에도 계속 작동합니다. 라이브러리 파일과 포함 파일을 함께 교체하십시오.
12. 다음 행선지는 어디인가요?
- 요소 갤러리, 설치, 가이드, API 참조, 이미지-코드 변환 및 도움말: https://www.betasoft.dev/gui-graphic-library
- MetaTrader 5 버전: https://www.mql5.com/en/market/product/206761
- MetaTrader 4 버전: https://www.mql5.com/en/market/product/206760
여러분의 의견을 환영합니다. 질문이나 개선 아이디어가 있으시면 제품 댓글에 남겨주시거나 MQL5.com에서 메시지를 보내주세요.





