요소 프레임의 색상을 프로그래밍 방식으로 변경하고 매개변수 값과 연결할 수 있는 기능이 추가되었습니다. 이는 입력한 값의 위험 수준을 빠르게 파악하는 데 도움이 되는 유익하고 유용한 지표입니다. 실용적이고 명확한 것으로 밝혀졌습니다. 또한 설정된 한도를 초과하는 경우 경고 창이 나타납니다.
시차를 두고 매개변수 경계 보호 및 사용자 경고를 구현하는 주제를 계속하기 전에 그 바로 앞에 있는 또 다른 주제에 대해 언급해야 합니다. 바로 매개변수 사전 설정입니다.
잘 알려진 것부터 시작하겠습니다. 대부분의 MQL 프로그램에는 입력 범주의 변수가 있습니다. 이러한 변수는 전역 수준에서 선언되며 단일 설정 창에서 볼 수 있습니다. 이 창은 프로그램을 시작할 때 나타나며, 그 안에서 사용자는 필요한 경우 "외부" 변수의 초기 값을 변경할 수 있습니다. 그러나 그 전에 사용자는 프로그램 내부에서 외부 변수를 초기화합니다. 요점은 프로그램 사전 설정이 보편적이지 않기 때문에 시작할 때마다 설정할 수 있는 변수 범주가 있다는 것입니다. 또한 프로그램 실행 중에 외부 변수에 수동으로 액세스하려는 시도는 불가능하며 재부팅이 필요한 것으로 알려져 있습니다. 그래픽 인터페이스를 사용하면 이러한 필요성이 제거됩니다. 프로그램 설정은 런타임에 열 수 있습니다.
그러나 처음 시작할 때 프로그램 매개변수에 초기값을 설정해야 하는 필요성은 여전히 동일합니다.
그래픽 인터페이스가 있다면 표준 설정 창이 더 이상 필요하지 않기 때문에입력 유형의 변수를 선언하는 것은 의미가 없지만 본질은 동일하게 유지됩니다. 입력 변수 대신 컨트롤의 매개 변수에 초기 값을 설정해야 합니다.
프로그램을 초기화할 때 표준 창이 아닌 자체 창에 초기값을 설정하는 함수를 호출해야 합니다. 옵션으로 인터페이스 빌드 단계, V_CURRENT 값 설정 또는 ON/OFF 상태 등에서 KIB 생성자에서 이 작업을 수행할 수 있지만 이제 프로그래밍 방식으로 요소를 초기화할 수 있습니다. 이제 생성자와 프로그램에서 요소의 초기화를 결합할 수 있습니다.
따라서 이 작업을 수행하려면 OnInit() 에서 호출되는 특수 함수가 필요합니다.
이 함수가 정확히 무엇을 할까요?
프로그램 시작 시 필요한 창을 엽니다.
대상 컨트롤에 값을 설정합니다.
함수는 무엇으로 호출될까요?
저는 Initialize() 라고 부르지만 누구나 자신만의 변형을 생각해낼 수 있습니다.
가장 중요한 것은이 함수가 모든 인터페이스 Expert Advisor에 있어야 한다는 것입니다. 이 함수는 Expert Advisor의OnTick() 함수 또는 인디케이터의 OnCalculate() 와 비교할 수 있습니다. 이를 이해하는 것이 중요합니다.
함수는 어떤 값을 반환하나요?
함수는 무효 타입을 갖습니다 . 값을 반환할 필요가 없습니다. 호출되면 필요한 창을 열고 요소의 매개 변수를 초기화하며 일부 속성을 미리 설정할 수 있습니다. 기본적으로 그게 전부입니다. 이론적으로는 초기 매개 변수 범위를 설정할 수 있지만 값 제어는 API 파일과 타이머에서 요소 이벤트에 대해 호출되는 별도의 함수에서 구현 될 것이라고 생각합니다. 아마 다음 버전에서 컨트롤 호출에 대한 출력물을 작성할 것입니다.
*현재 인터페이스 전문가 어드바이저의 개념이 막 형성되고 있으며 많은 발견이 우리 앞에 있다는 점을 고려하는 것이 중요합니다.
다음은 현재 데모 프로젝트의 맥락에서 인터페이스 Expert Advisor의 초기화 기능의 예입니다:
1. 함수 호출:
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int _OnInit()
{
//------------------------------------------------//Initializing program interface://------------------------------------------------Initialize();//------------------------------------------------
2. 함수 구현:
voidInitialize()
{
//------------------------------------------------//Opening the windows://------------------------------------------------//1. "Main Parameters".
w_14_Main_Parameters();//------------------------------------------------//------------------------------------------------//2. "Input parameters".w_10_Input_parameters();//------------------------------------------------//------------------------------------------------//3. "Setting example 1"w_6_Settings_example_1();//------------------------------------------------//------------------------------------------------//Initializing the elements://------------------------------------------------w6_d_p5_S_EDIT_Spin_the_value(55);w6_i_p3_H_SLIDER_Roll_the_value(55);w14_i_p3_V_SLIDER_Vertical_slider(55);w14_s_p4_EDIT_Max("100");w14_s_p4_EDIT_Min("0");w14_s_p4_EDIT_Selected("55");w15_i_p2_P_BAR_P1(55);w15_s_p4_VALUE_V1("55");//------------------------------------------------
}
지금까지 함수의 구조는 다음과 같습니다. 매우 간단한 함수입니다. 창을 열고 필요한 값을 요소 매개 변수로 보냅니다. 창을 열면 추가 다시 그리기 없이 요소의 필요한 값이 즉시 표시되므로 요소의 초기화 및 창 열기를 변경할 수 있습니다. 그러나 이는 사소한 일입니다.
구현의 첫 번째 부분은 선택한 요소의 매개 변수의 초기 값을 설정하고 필요한 창을 여는 것입니다. 이를 위해 Initialise() 함수를 작성하고 _OnInit() 함수에 호출을 넣을 것입니다.
구현의 두 번째 부분 - API 파일을 열고 요소의 연결을 작성해 보겠습니다. 공통 체인의 각 요소의 경우 호출을 작성하고 다른 대상 요소에 값을 전달합니다. 예를 들어 버튼이 있는 필드의 이벤트에서 가로 슬라이더를 호출하고 값을 전달합니다. 그런 다음 이벤트가 슬라이더 케이스에 오면 버튼이있는 필드에 다시 전달하고 추가로 수직 슬라이더에 전달합니다. 후자는 차례로 값을 근처의 입력 필드와 진행률 표시줄 창에 전달합니다.... 전체적으로 체인에는 여러 방향으로 값을 전달하는 7가지 주요 요소가 있습니다. 다음은 그 예시입니다:"설정 예제 1"(요소"값 회전" 및"값 롤" 포함),"주요 매개변수"( 요소"V_SLIDER" 포함),"선택한" 및"퍼센트" 필드,"데이터 처리..."(요소 VALUE 및 P_BAR 포함 ).
3부: 연결 테스트하기.
네 번째 파트: 조건부 이름을 가진 매개변수 제어 함수를 작성해 보겠습니다: void Risk_management_group_1(). 이 함수의 임무는 이 요소 그룹 내에서 위험한 값의 경계에 접근하고 허용된 한계를 초과할 때 사용자에게 경고하는 것입니다. 이 함수는 관련 요소의 값을 받아 조건 내부의 설정된 필터를 통과합니다. 적절한 위험 수준의 텍스트와 프레임 색상 변경을 통해 경고를 구현하고 체인의 모든 요소에 경고를 보냅니다. 이와 동시에 사용자가 추가 확인 없이 작업을 계속할 수 없도록 차단 창을 호출합니다.
1. 선택한 요소의 매개 변수의 초기 값을 설정하고 필요한 창을 엽니 다. 이를 위해Initialise() 함수를 작성하고 _OnInit() 함수에서 호출해 보겠습니다.
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int_OnInit()
{
//------------------------------------------------//Initializing program interface://------------------------------------------------Initialize();//------------------------------------------------
voidInitialize()
{
//------------------------------------------------//Opening the windows://------------------------------------------------//1. "Main Parameters". w_14_Main_Parameters();//2. "Input parameters".w_10_Input_parameters();//3. "Setting example 1"w_6_Settings_example_1();
//------------------------------------------------//Initializing the elements://------------------------------------------------ w6_d_p5_S_EDIT_Spin_the_value(55);
w6_i_p3_H_SLIDER_Roll_the_value(55);
w14_i_p3_V_SLIDER_Vertical_slider(55);
w14_s_p4_EDIT_Max("100");
w14_s_p4_EDIT_Min("0");
w14_s_p4_EDIT_Selected("55");
w15_i_p2_P_BAR_P1(55);
w15_s_p4_VALUE_V1("55");//------------------------------------------------
}
결과: 필요한 창이 열리고 대상 요소에 초기값이 설정됩니다.
2. API 파일을 열고 요소의 연결을 작성합니다.각 요소의 경우 호출을 작성하고 체인의 다른 대상 요소에 값을 전달합니다:
case Settings_example_1___Spin_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the value is set?//------------------------------------------------------------------------------------------------------//Min value: NOT SET | Max value: NOT SET | V_step: 1.7 | Default value: 468.99 | Digits: 3//------------------------------------------------------------------------------------------------------w6_i_p3_H_SLIDER_Roll_the_value((int)value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Settings_example_1___Roll_the_value:
//------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 55 | Digits: Integer value//------------------------------------------------------------------------------------------------------
//Transferring the value:
w14_i_p3_V_SLIDER_Vertical_slider((int)value);
w6_d_p5_S_EDIT_Spin_the_value((double)value);
//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------break;
case Main_Parameters___Vertical_slider:
//------------------------------------------------------------------------------------------------------//What to do when the slider's handle is moved?//------------------------------------------------------------------------------------------------------//Min value: 0 | Max value: 100 | V_step: 1 | Default value: 50 | Digits: Integer value//------------------------------------------------------------------------------------------------------
{
//----------------------------------------------------- //Transferring value to other destinations://----------------------------------------------------- w14_s_p4_EDIT_Percent(value);//-----------------------------------------------------w14_s_p4_EDIT_Selected(value);//-----------------------------------------------------w15_i_p2_P_BAR_P1((int)value);//-----------------------------------------------------w15_s_p4_VALUE_V1(value);//-----------------------------------------------------w6_i_p3_H_SLIDER_Roll_the_value((int)value);//-----------------------------------------------------w6_d_p5_S_EDIT_Spin_the_value((double)value);//-----------------------------------------------------w8_s_p4_CELL_Account_balance__Value(value);//------------------------------------------------------------------------------------------------------//Your comment://------------------------------------------------------------------------------------------------------
}
break;
3. 연결을 테스트합니다:
결과: 요소 값이 의도한 대로 연결되었습니다.
4. 요소 그룹의 매개변수를 제어하는 함수를 작성합니다: void Risk_management_group_1().
OnInit() 함수에서 Risk_management_group_1() 함수를 호출합니다:
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+int _OnInit()
{
//------------------------------------------------//Initializing program interface://------------------------------------------------
Initialize();
//----------------------------------------------------------//Checking default value of the parameters in the group: //----------------------------------------------------------Risk_management_group_1();//----------------------------------------------------------
색상 표시 외에도 프레임, 텍스트 및 바탕의 깜박임을 구현하고 있습니다. 내일이면 준비될 것 같습니다. 다음은 취소 버튼으로 입력한 값을 취소하는 기능입니다.
문제는 요소에 값을 입력하면 커널에서 즉시 값을 받아 API 파일로 전달하여 논리적으로 사용자 정의 코드 처리를 유발한다는 것입니다. 매개 변수에 값이 도착하기 전에 확인 버튼이있는 창에서 값 수락을 지연시키고 "확인"또는 "확인"(또는 "적용")을 클릭하는 데 연결해야합니다.
또한 사용자가 취소 버튼(취소)을 클릭하면 변경 전의 이전 값으로 요소로 돌아갈 필요가 있습니다.
이것은 매우 흥미로운 문제이며 그 해결책은 인터페이스의 실질적인 유용성을 새로운 차원으로 즉시 끌어 올립니다. 다행히도 대부분의 경우 목표는 오래 전에 달성되었습니다. 4년 전에 이미 얼마나 많은 흥미로운 것들이 구현되었는지 놀라울 따름입니다.
지난 분석에서는 설정된 매개변수 한도를 넘을 때 위험의 색상 표시를 적용하고 차단 창을 여는 방법을 보여드렸습니다. 하지만 예상치 못한 두 가지 문제가 발견되었습니다.
1. 위험 관리 기능은 위험 수준을 넘으면 첫 번째 경고 창을 열지만 그 순간에 커서를 요소에 계속 누르고 있으면 값이 계속 증가하여 다음 조건부 수준에 도달합니다. - 위험.
2. 위험 값을 넘으면 마지막 경고 창이 열리지만 사용자가 마우스 왼쪽 버튼을 계속 누르고 있어도 값이 변경되는 것을 막지는 못합니다.
3. 사용자가 마우스 버튼에서 손을 떼고 경고 창을 닫으려는 경우이를 수행 할 수 없습니다. 더 정확히 말하면, 그는 할 수 없습니다. 그 이유는 두 개의 차단 창이 서로를 차단하기 시작하기 때문입니다. 차단 창 중 하나가 열려 있으면 쉽게 닫을 수 있지만 두 개의 창이 동시에 열려 있으면 인터페이스의 다른 어떤 것도 작동 할 수 없습니다. 프로그램은 여전히 작동하지만 무감각 상태가 됩니다.
거기에 무언가의 저장소 (IMHO는 소스 코드라고 할 수 없음 ) 와 문서가 있습니다 .
요소 프레임의 색상을 프로그래밍 방식으로 변경하고 매개변수 값과 연결할 수 있는 기능이 추가되었습니다. 이는 입력한 값의 위험 수준을 빠르게 파악하는 데 도움이 되는 유익하고 유용한 지표입니다. 실용적이고 명확한 것으로 밝혀졌습니다. 또한 설정된 한도를 초과하는 경우 경고 창이 나타납니다.
몇 가지 예시입니다:
내일 예제와 코드를 통해 살펴보겠습니다.
시차를 두고 매개변수 경계 보호 및 사용자 경고를 구현하는 주제를 계속하기 전에 그 바로 앞에 있는 또 다른 주제에 대해 언급해야 합니다. 바로 매개변수 사전 설정입니다.
잘 알려진 것부터 시작하겠습니다. 대부분의 MQL 프로그램에는 입력 범주의 변수가 있습니다. 이러한 변수는 전역 수준에서 선언되며 단일 설정 창에서 볼 수 있습니다. 이 창은 프로그램을 시작할 때 나타나며, 그 안에서 사용자는 필요한 경우 "외부" 변수의 초기 값을 변경할 수 있습니다. 그러나 그 전에 사용자는 프로그램 내부에서 외부 변수를 초기화합니다. 요점은 프로그램 사전 설정이 보편적이지 않기 때문에 시작할 때마다 설정할 수 있는 변수 범주가 있다는 것입니다. 또한 프로그램 실행 중에 외부 변수에 수동으로 액세스하려는 시도는 불가능하며 재부팅이 필요한 것으로 알려져 있습니다. 그래픽 인터페이스를 사용하면 이러한 필요성이 제거됩니다. 프로그램 설정은 런타임에 열 수 있습니다.
그러나 처음 시작할 때 프로그램 매개변수에 초기값을 설정해야 하는 필요성은 여전히 동일합니다.
그래픽 인터페이스가 있다면 표준 설정 창이 더 이상 필요하지 않기 때문에 입력 유형의 변수를 선언하는 것은 의미가 없지만 본질은 동일하게 유지됩니다. 입력 변수 대신 컨트롤의 매개 변수에 초기 값을 설정해야 합니다.
프로그램을 초기화할 때 표준 창이 아닌 자체 창에 초기값을 설정하는 함수를 호출해야 합니다. 옵션으로 인터페이스 빌드 단계, V_CURRENT 값 설정 또는 ON/OFF 상태 등에서 KIB 생성자에서 이 작업을 수행할 수 있지만 이제 프로그래밍 방식으로 요소를 초기화할 수 있습니다. 이제 생성자와 프로그램에서 요소의 초기화를 결합할 수 있습니다.
따라서 이 작업을 수행하려면 OnInit() 에서 호출되는 특수 함수가 필요합니다.
이 함수가 정확히 무엇을 할까요?
함수는 무엇으로 호출될까요?
저는 Initialize() 라고 부르지만 누구나 자신만의 변형을 생각해낼 수 있습니다.
가장 중요한 것은 이 함수가 모든 인터페이스 Expert Advisor에 있어야 한다는 것입니다. 이 함수는 Expert Advisor의 OnTick() 함수 또는 인디케이터의 OnCalculate() 와 비교할 수 있습니다. 이를 이해하는 것이 중요합니다.
함수는 어떤 값을 반환하나요?
함수는 무효 타입을 갖습니다 . 값을 반환할 필요가 없습니다. 호출되면 필요한 창을 열고 요소의 매개 변수를 초기화하며 일부 속성을 미리 설정할 수 있습니다. 기본적으로 그게 전부입니다. 이론적으로는 초기 매개 변수 범위를 설정할 수 있지만 값 제어는 API 파일과 타이머에서 요소 이벤트에 대해 호출되는 별도의 함수에서 구현 될 것이라고 생각합니다. 아마 다음 버전에서 컨트롤 호출에 대한 출력물을 작성할 것입니다.
*현재 인터페이스 전문가 어드바이저의 개념이 막 형성되고 있으며 많은 발견이 우리 앞에 있다는 점을 고려하는 것이 중요합니다.
다음은 현재 데모 프로젝트의 맥락에서 인터페이스 Expert Advisor의 초기화 기능의 예입니다:
1. 함수 호출:
2. 함수 구현:
지금까지 함수의 구조는 다음과 같습니다. 매우 간단한 함수입니다. 창을 열고 필요한 값을 요소 매개 변수로 보냅니다. 창을 열면 추가 다시 그리기 없이 요소의 필요한 값이 즉시 표시되므로 요소의 초기화 및 창 열기를 변경할 수 있습니다. 그러나 이는 사소한 일입니다.
이제 주요 주제인 매개변수의 단계별 보호 구현으로 넘어가 보겠습니다.
14.매개변수 경계의 단계적 보호 실현:
//------------------------------------------------------------------------------------------------------------
사전 설정된 한도 내에서 설정을 제어하는 로직을 작성하고 경고 시스템을 생성합니다:
//-----------------------------------------------------------------------------
계속 진행하겠습니다:
1. 선택한 요소의 매개 변수의 초기 값을 설정하고 필요한 창을 엽니 다. 이를 위해Initialise() 함수를 작성하고 _OnInit() 함수에서 호출해 보겠습니다.
결과: 필요한 창이 열리고 대상 요소에 초기값이 설정됩니다.
2. API 파일을 열고 요소의 연결을 작성합니다.각 요소의 경우 호출을 작성하고 체인의 다른 대상 요소에 값을 전달합니다:
3. 연결을 테스트합니다:
결과: 요소 값이 의도한 대로 연결되었습니다.
4. 요소 그룹의 매개변수를 제어하는 함수를 작성합니다: void Risk_management_group_1().
OnInit() 함수에서 Risk_management_group_1() 함수를 호출합니다:
결과: 정상적으로 작동하지만 입력 필드에 값을 입력할 때 경고창이 표시될 때 입력한 값이 초기화되지 않습니다(개선 필요).
(*또한 - 프레임 색상 설정은 업데이트에서 추가되었지만 현재 버전에는 없습니다.)
다음 작업은 "취소" 버튼을 눌러 입력한 매개변수를 취소하는 것입니다.
이것은 매우 어려운 작업이지만 이미 부분적으로 구현했습니다. 이전 기능을 복원해 보겠습니다.
지난 분석에서는 설정된 매개변수 한도를 넘을 때 위험의 색상 표시를 적용하고 차단 창을 여는 방법을 보여드렸습니다. 하지만 예상치 못한 두 가지 문제가 발견되었습니다.
1. 위험 관리 기능은 위험 수준을 넘으면 첫 번째 경고 창을 열지만 그 순간에 커서를 요소에 계속 누르고 있으면 값이 계속 증가하여 다음 조건부 수준에 도달합니다. - 위험.
2. 위험 값을 넘으면 마지막 경고 창이 열리지만 사용자가 마우스 왼쪽 버튼을 계속 누르고 있어도 값이 변경되는 것을 막지는 못합니다.
3. 사용자가 마우스 버튼에서 손을 떼고 경고 창을 닫으려는 경우이를 수행 할 수 없습니다. 더 정확히 말하면, 그는 할 수 없습니다. 그 이유는 두 개의 차단 창이 서로를 차단하기 시작하기 때문입니다. 차단 창 중 하나가 열려 있으면 쉽게 닫을 수 있지만 두 개의 창이 동시에 열려 있으면 인터페이스의 다른 어떤 것도 작동 할 수 없습니다. 프로그램은 여전히 작동하지만 무감각 상태가 됩니다.
아래 이미지는 이런 일이 어떻게 발생하는지 보여줍니다:
그런 다음 설정 창의 상호 잠금 문제를 수정하여 이제 창이 서로 간섭하지 않습니다. 서로 충돌하지 않고 함께 잠금 기능을 수행합니다.
이제 마우스 왼쪽 버튼을 누르고 항목이 활성화되어 있어도 경고 창이 자동으로 매개 변수 값 변경을 중지하도록 만들어야 합니다.