
하나의 차트에 여러 개의 지표 넣기(파트 04): Expert Advisor 만들기
소개
이전 글에서 사용자 지정 지표를 사용할 때 여러 개의 하위 창으로 지표를 만드는 방법을 설명했습니다. 이것은 꽤 쉬웠습니다. 그러나 Expert Advisor에서 동일한 기능을 구현하려고 하면 상황이 조금 더 복잡해 집니다. 사용자 지정 지표에서 사용한 도구가 없기 때문입니다. 이 시점에서 프로그래밍은 필수가 됩니다. 올바른 코드를 작성하여 하위 창을 만드는 것이 가장 중요합니다. 이 작업이 쉽지는 않지만 EA에 하위 창을 넣는 방법은 많은 코딩을 필요로 하지 않으며 MQL5가 작동하는 방식에 대한 지식만 있으면 됩니다.
계획
우리는 이미 작동하고 있는 사용자 정의 지표를 가지고 있습니다. 즉, 객체 클래스가 이미 작동하고 있으며 이것이 객체 클래스이므로 다른 모델로 쉽게 올길 수 있습니다. 그러나 단순히 EA에서 클래스를 선언하고 사용하려고 하면 사용자 지정 지표에서 작동하던 것과는 다르게 작동합니다. 그 이유는 EA에는 하위 창 기능이 없기 때문입니다. 그러나 다음과 같은 아이디어가 떠올랐습니다. "이미 컴파일 되고 작동하는 사용자 지정 지표를 사용하고iCustom명령을 사용하여 EA에서 이것을 호출하면 어떻게 될까요? 아마도 하위 창이 필요하지 않을 것이고 명령이 다음과 같다면 실제로 작동할 수 있을 것입니다.
#property copyright "Daniel Jose" //+------------------------------------------------------------------+ input string user01 = ""; //Used indicators input string user02 = ""; //Assets to follow //+------------------------------------------------------------------+ int OnInit() { int m_handleSub; //... Expert Advisor code ... if ((m_handleSub = iCustom(NULL, 0, "Chart In SubWindows\\Chart In SubWindow.ex5", user01, user02)) == INVALID_HANDLE) return INIT_FAILED; if (!ChartIndicatorAdd(ChartID(), 0, m_handleSub)) return INIT_FAILED; //... Expert Advisor code ... ChartRedraw(); return(INIT_SUCCEEDED); } //...The rest of the Expert Advisor code ...
이 간단한 코드 조각은 사용자 지정 지표를 로드 할 수 있지만 하위 창이 없기 때문에 제대로 작동하지 않습니다. 이러한 경우 EA에서 코드가 실행될 때 EA는 기본 창에 지표를 적용합니다. 즉 차트가 지표에 의해 로드 된 템플릿에 의해 숨겨지게 되고 이는 분명히 우리가 찾고 있는 것이 아닙니다.
따라서 우리가 당면한 문제는 이미 작동하는 지표를 사용할 수 있도록 해주는 하위 창을 만드는 것입니다. 지표의 실행을 위해 하위 창을 만드는 이유는 무엇일까요? 그럴 이유가 없습니다. EA에 기능을 직접 추가하고 이를 통해 발생할 수 있는 제한사항들을 극복해 나아가는 것이 좋습니다.
이를 기반으로 몇 가지 작업을 수행해야 합니다.
일 | 목적 |
---|---|
1 => 범용 지표를 생성합니다. | 차트를 오염시키지 않고 iCustom 명령을 만들고 사용할 수 있습니다. |
2 => 이 지표를 어떤 식으로든 EA에 포함시키십시오. | 이를 통해 문제 없이 모든 기능을 갖춘 Expert Advisor를 이전할 수 있습니다. |
3 => 하위 창에 대한 일반 객체 클래스 생성 | EA를 통해 하위 창을 추가할 수 있습니다. |
4 => 창 클래스에 바인딩된 C_TemplateChart 클래스를 가져옵니다. | 이렇게 하면 이미 실행 중인 코드에서 아무 것도 변경하지 않고 하위 창의 내용을 관리할 수 있습니다. |
이것이 어려워 보일 수 있지만 아주 간단하게 해결됩니다. 그럼 각각의 포인트에 대해 알아보겠습니다.
구현: 범용 지표 생성하기
이 부분은 사용자 지정 지표 코드를 생성하여 해결할 수 있습니다. 이 경우 코드는 다음과 같습니다.
#property copyright "Daniel Jose" #property version "1.00" #property description "This file only enables support of indicators in SubWin." #property indicator_chart_window #property indicator_plots 0 //+------------------------------------------------------------------+ int OnInit() { return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { return rates_total; } //+------------------------------------------------------------------+
이것 뿐이고 더 이상은 없습니다. 이 파일을 SubSupport.mq5로 저장합시다. 그러나 다른 지표와 함께 위치하지 않습니다. 대신 Expert Advisor의RESOURCE디렉토리로 이동하겠습니다. 따라서 파일 구조는 아래 그림과 같습니다.
구현: EA에 일반 지표 포함하기
이렇게 하려면 EA 상단에 다음 코드를 추가해야 합니다.
//+------------------------------------------------------------------+ #define def_Resource "Resources\\SubSupport.ex5" //+------------------------------------------------------------------+ #resource def_Resource //+------------------------------------------------------------------+
여기에는 일반 지표의 컴파일 된 코드가 EA에 포함됩니다. 이 작업이 완료되면 더 이상 필요하지 않으므로 일반 지표에서 .ex5 파일이 삭제됩니다. 이제 EA 코드가 컴파일 될 때SubSupport.ex5파일이 발견되지 않으면 컴파일러가 자동으로SubSupport.mp5의 일반 지표의 코드를 컴파일한다는 사실에 주의해야 합니다. 그리고 컴파일러는 이 새로 컴파일된 실행 파일을 Expert Advisor에 추가합니다. 따라서SubSupport.mq5파일을 편집하고 Expert Advisor에 변경 사항을 추가해야 하는 경우SubSupport.ex5를 삭제해야 합니다. 그렇지 않으면 변경 사항이 추가되지 않습니다.
이렇게 하는 것은 중요합니다: 리소스에 새로 구현된 변경 사항을 추가하는 방법을 반드시 알아야 하기 때문입니다.
자, 이제 일반 지표는 Expert Advisor의 일부이므로 다음 작업으로 넘어가겠습니다.
구현 : 하위 창 객체 클래스 생성하기
이 부분도 간단합니다. 이 부분을 코딩하기 전에 몇 가지 사항을 정의해야 합니다. 즉, 이 클래스에서 실제로 필요한 기능은 무엇일까요? 처음에는 다음과 같이 사용하기로 결정했습니다:
기능 | 설명 |
---|---|
Init | EA를 통해 하위 창을 추가할 수 있습니다. |
Close | EA를 통해 하위 창을 추가할 수 있습니다. |
이들 함수는 테스트 되지 않으므로 EA가 실행되면 한 번만 호출될 것이라고 가정합니다. 하지만 우리의 EA가 앞으로도 계속 사용 될 것이라고 생각하면 더 실용적으로 만드는 방법에 대해 생각해 보는 것이 좋습니다. 이와 관련하여 C_Terminal이라는 새로운 객체 클래스를 만들어 보겠습니다. 이 클래스는 그래픽 터미널과 관련된 몇 가지 사항을 지원합니다. 이에 대해서는 나중에 자세히 알아보겠습니다. 우선은 마지막 작업을 살펴보겠습니다. 왜냐하면 솔루션을 부분적으로 구현할 수 있는 방법이 없기 때문입니다.
구현: C_TemplateChart 클래스 상속
OOP(객체 지향 프로그래밍)를 사용하여 새로운 것을 만들기로 결정했을 때 보안이나 상속을 포함하여 이 접근 방식을 사용하면 큰 이점이 있다는 것을 이미 알고 있었기 때문에 이 작업을 수행했습니다. 다형성도 있지만 다형성은 나중에 교차 주문 시스템을 만들 때 사용합니다. 이 경우 우리는 OOP의 장점 중 하나인 상속을 사용할 것입니다. C_TemplateChart는 이미 완전한 기능을 갖춘 클래스입니다. 이것을 보면 모든 것을 다시 프로그래밍하는 번거로움을 겪거나 클래스에 코드를 추가하는 위험을 감수하고 싶지 않을 것입니다. 해결책은 원래 코드를 전혀 변경하지 않고 새 코드나 기능을 추가할 수 있는 상속을 사용하는 것입니다.
상속을 사용하면 다음과 같은 사항을 포함하여 많은 이점이 있습니다: 이미 테스트된 코드는 테스트된 상태로 유지됩니다; 복잡하게 확장 되더라도 코드의 크기가 그만큼 증가하는 것은 아닙니다; 새로운 기능만 테스트하면 됩니다; 변하지 않는 것들은 상속되어 안정성을 제공합니다. 다시 말해 최소한의 노력을 들여 최대의 보안을 만드는 식으로 프로그램이 개선됩니다. 이를 이해하기 위해 아래 다이어그램을 살펴보겠습니다.
조부모 클래스는 가장 낮은 수준에서 데이터를 다루는 가장 기본적인 클래스이지만 부모 클래스가 조부모로부터 무언가를 상속받을 때 조부모 클래스에서 public으로 선언된 모든 것을 부모 클래스에서 볼 수 있고 사용할 수 있습니다. 또한 우리는 부모 클래스에 새로운 것을 추가할 수도 있습니다. 이것은 상속되고 상속에 의해 지원되는 것들에 영향을 미치지 않습니다. 부모 클래스가 이미 완료되어 작동 중이고 그 하위 클래스에서 아무 것도 변경하지 않고 확장하려는 경우 자식 클래스를 만들어야 하고 자식 클래스는 이전 클래스의 모든 기능을 갖게 됩니다. 우리는 또한 작동 방식을 변경할 수 있으며 이는 상속과 관련한 흥미로운 점입니다. 이러한 변경 사항은 다른 클래스에 영향을 미치지 않기 때문입니다. 그러나 여기에는 다중 상속을 허용하는 C++와 달리 제한이 있습니다. 자식이 아버지 쪽과 어머니 쪽 모두에서 함수들을 상속하는 경우가 MQL5에서는 불가능합니다. 그러나 여전히 상속의 이점을 누릴수 있습니다. 다중 상속의 예는 다음과 같습니다:
하지만 MQL5에서 어떻게 해야 할까요? 우리가 그러한 상속을 선언하는 방법은 무엇일까요? 이것을 이해하는 가장 정확한 방법은 객체 지향 프로그래밍(OOP) 내용을 읽어 보는 것이지만 여기에서는 요점으로 바로 갈 것입니다. 상속은 다음 줄을 사용하여 수행됩니다.
#include "C_TemplateChart.mqh" //+------------------------------------------------------------------+ class C_SubWindow : public C_TemplateChart { // ... Class code };
C_SubWindow 클래스는C_TemplateChart클래스를 공개적으로 상속하므로 이제C_SubWindow클래스를 사용하여C_TemplateChart클래스 기능에 액세스할수있습니다.
위의 코드 스니펫에서 저는 한 가지를 강조했습니다. 꺾쇠 괄호( < > )가 아닌 따옴표( " ) 부분입니다. 제가 왜 그렇게 했을까요? C++ 언어와 마찬가지로 MQL5에도 몇 가지 매우 흥미로운 점들이 있습니다. 그러나 프로그래밍 기술을 막 배우기 시작하는 사람들을 혼란스럽게 만드는 몇 가지 사항도 존재합니다. 꺾쇠 괄호( < > ) 사이에 헤더 파일을 배치하면 이는 절대 경로를 의미합니다 - 이 경우 컴파일러는 우리가 지정한 경로를 정확히 따릅니다. 그러나 우리가 따옴표를 사용하면(이번에 했던 것처럼) 컴파일러는 상대 경로를 사용하거나 혹은 더 명확하게 하기 위해 작업 파일이 있는 현재 디렉토리에서부터 먼저 시작합니다. 이상하게 보일 수 있지만 파일의 내용은 다르지만 동일한 이름을 갖고 있거나 다른 디렉토리에 있지만 여전히 현재 디렉토리를 참조하고 싶은 경우에 따옴표를 사용합니다.
이전에 우리가 만든 두 가지 함수 INIT와 CLOSE는 다음과 같습니다:
//+------------------------------------------------------------------+ bool Init(void) { if (m_handleSub != INVALID_HANDLE) return true; if ((m_handleSub = iCustom(NULL, 0, "::" + def_Resource)) == INVALID_HANDLE) return false; m_IdSub = (int) ChartGetInteger(Terminal.Get_ID(), CHART_WINDOWS_TOTAL); if (!ChartIndicatorAdd(Terminal.Get_ID(), m_IdSub, m_handleSub)) return false; return true; } //+------------------------------------------------------------------+ void Close(void) { ClearTemplateChart(); if (m_handleSub == INVALID_HANDLE) return; IndicatorRelease(m_IdSub); ChartIndicatorDelete(Terminal.Get_ID(), m_IdSub, ChartIndicatorName(Terminal.Get_ID(), m_IdSub, 0)); ChartRedraw(); m_handleSub = INVALID_HANDLE; } //+------------------------------------------------------------------+
코드는 매우 간단하고 짧습니다. 그러나 우리가 주의해야 할 것이 있습니다. 강조 표시된 부분에 주의하십시오. 이 부분을 추가할 때 실수하지 않도록 주의해야 합니다. 그대로 두지 않으면 EA에 추가하도록 요청한 SubSupport.ex5 실행 파일이 EA 내부에서 보이지 않기 때문입니다 - 대신 EA 외부에서 볼 수 있습니다. 자세한 내용은Resources에서 찾아 보시기 바랍니다. 그러나 기본적으로 ( :: )를 사용하면 이는 EA가 내부에서 사용 가능한 내부 리소스를 사용해야 함을 의미합니다. 하지만 리소스의 이름을 표시하면 EA는 MQL5 디렉터리 내부에서 검색하고 지정된 위치에 파일이 없으면 함수는 실패하게 됩니다. EA 리소스로 파일을 추가해도 함수가 실패하는 건 마찬가지입니다.
그런 다음 리소스가 로드되면 존재하는 하위 창의 수를 확인하고 해당 하위 창에 지표를 추가합니다.
코드가 실제로 수행하는 작업은 아래와 같습니다:
input string user01 = ""; //Used indicators input string user02 = ""; //Assets to follows //+------------------------------------------------------------------+ int OnInit() { int m_handleSub; //... if ((m_handleSub = iCustom(NULL, 0, "Chart In SubWindows\\Chart In SubWindow.ex5", user01, user02)) == INVALID_HANDLE) return INIT_FAILED; if (!ChartIndicatorAdd(ChartID(), (int) ChartGetInteger(ChartID(), CHART_WINDOWS_TOTAL), m_handleSub)) return INIT_FAILED; //... ChartRedraw(); return(INIT_SUCCEEDED); } //...The rest of the Expert Advisor code ...
두 코드 모두 동일하게 작동하지만 위의 버전은 통합 버전이고 변경되지 않습니다. 그러므로 객체 클래스 버전을 사용하면 시간이 지남에 따라 더 많은 것을 추가할 수 있습니다. 두 버전 모두 동일한 작업을 수행합니다. EA에서 하위 창을 만들고 이전에 만든 모든 사용자 지정 지표를 이 하위 창에 넣습니다. 이 글의 시작 부분의 코드와 비교하여 코드 변경 사항에 주의하십시오. - 변경 사항은 색상으로 강조 표시됩니다.
결론
우리가 목표를 달성 하기 위한 방법을 결정하는 방법은 매우 흥미롭습니다. 때때로 우리는 어려움에 직면하고 목표를 달성하는 것이 어렵다고 생각할 수 있지만 약간의 인내와 헌신이 있으면 처음에는 넘을 수 없을 것 같았던 장애물을 극복할 수 있습니다. 이 기사에서는 상속을 통해 클래스를 수정하지 않고 기능을 확장하는 방법을 보여드렸습니다. 동시에 차트에 지표를 추가하여 이미 테스트한 대로 작동하는 방법을 보여드렸습니다. 우리는 EA 내부에 ex5 프로그램을 추가하고 EA를 로드 하여 원래 ex5를 포트 할 필요 없이 사용하면 됩니다.
첨부 파일에는 지금까지 개발된 모든 사항이 포함되어 있습니다. 그리고 곧 이 코드에 더 흥미로운 내용이 포함될 것입니다. 😁👍
MetaQuotes 소프트웨어 사를 통해 포르투갈어가 번역됨
원본 기고글: https://www.mql5.com/pt/articles/10241
경고: 이 자료들에 대한 모든 권한은 MetaQuotes(MetaQuotes Ltd.)에 있습니다. 이 자료들의 전부 또는 일부에 대한 복제 및 재출력은 금지됩니다.
이 글은 사이트 사용자가 작성했으며 개인의 견해를 반영합니다. Metaquotes Ltd는 제시된 정보의 정확성 또는 설명 된 솔루션, 전략 또는 권장 사항의 사용으로 인한 결과에 대해 책임을 지지 않습니다.




새 문서 하나의 차트에 여러 인디케이터 표시하기(04부): EA로 시작하는 시작이 게시되었습니다:
작성자: Daniel Jose
안녕하세요, 다니엘 님, 기사를 잘 보고 있는데 파트 03은 어떻게 되나요?
출판을 위해 릴리스를 요청할 때 작은 문제가 있었지만 이미 Part 03의 출판을 승인했으며 곧 사용할 수있을 것입니다.이 문제는 내가 이미 보낸 기사의 수로 인해 더 많이 발생했습니다 ... 현재 분석 할 기사가 15 개 더 있으며, 모두이 EA 개발에 참여하고 있으며 각 기사가 점점 더 복잡해집니다 .... 하지만 시리즈를 팔로우 해주셔서 감사합니다 ... 기사 05부터 많은 새로운 것들을 기대하세요, 그때부터는 정말 큰 일이 될 것이기 때문에 정말 가치가있을 것입니다...😁👍이 처음 몇 개는 앞으로 나올 것을 소개하기위한 것입니다.
안녕하세요 다니엘,
여러 가지 색상의 인디케이터에 문제가 있으며 귀하의 기사를 통해 해결책을 알고있을 수 있습니다.
속성 옵션을 사용하지 않고 모든 표시기 속성을 설정하는 함수를 만들고 싶습니다(예: #property indicator_color1 clrCrimson, clrWhite, clrLime).
아래 테스트 프로그램에서 발견한 것은 #property indicator_color1 clrCrimson,clrWhite,clrLime을 포함하면 프로그램이 제대로 작동하는 반면, 이를 주석으로 처리하면 프로그램이 제대로 작동하지 않는다는 것입니다.이 경우 "더 높은?" 시간 프레임을 사용하거나 여러 데이터 포인트를 건너뛰는 것처럼 일부 데이터 포인트만 표시하는 것 같습니다. 여러 색상을 지정할 때 속성 색상 지시문이 제가 확인하지 않은 속성을 더 설정하고 있다고 생각합니다.
두 번째 문제는 제가 다중 색상 플롯 사용의 세부 사항과 요구 사항을 이해하지 못한다는 것입니다. 문서를 검색했지만 다중 색상 표시기를 사용하는 방법에 대한 개요를 제공하는 문서를 찾지 못했습니다. 첫 번째 플롯은 색상이 올바르게 변경되지만 최저값을 표시하는 두 번째 플롯은 제 함수 호출에 따라 색상이 변경되지 않습니다. 이 플롯이 제대로 작동하려면 유형2, 색상2 및 너비2의 세 가지 속성이 모두 필요합니다. 또한 속성 선언에 3 대신 2를 사용하는 이유도 당황스럽습니다. Mladen의 라구에르 적응 필터 표시기를 사용하여 속성 표시기가 표시기 번호 3이 아닌 플롯 번호 2를 사용하여 올바르게 표시되는지 확인했습니다.
어떤 제안, 참조 또는 도움을 주시면 대단히 감사하겠습니다.
안부, 케이프 코다
어떤 제안, 참조 또는 도움을 주시면 대단히 감사하겠습니다.
진심으로, 케이프 코다
약간 혼란스럽다는 것은 이해할 수 있지만 모든 혼란은 코드의 세부 사항을 실제로 보지 않고 있다는 사실에 있습니다. 댓글에있는 몇 가지 세부 사항을 설명한 다음 코드에 대해 조금 이야기하겠습니다....
첫 번째 요점은 #property indicator_colorN을 사용하지 않고도 여러 색상의 표시기를 생성 할 수도 있지만 사용자와 사용자에게도 코드를 이해하고 수정하는 것이 더 실용적이고 안전하며 간단하다는 것입니다. 왜냐하면 속성으로 이동하기 만하면 거기에있는 색상을 수정하기 만하면되고 사용자에게는 MT5가 표시기를 위해 생성하는 표준 창에서 수정할 색상을 선택하고 변경하기 만하면되기 때문에 더 간단하기 때문입니다. 색상 변경을 생성하기 위해 PlotIndexSetInteger 명령을 사용할 때 어떻게 든 이미 올바른 작업을 수행하고 있으며, 이것은 #property indicator_colorN을 사용하지 않을 때의 방법이지만 속성을 사용할 때 다른 색상을 설정하기 위해 PlotIndexSetInteger 명령을 사용하는 것이 합리적이지 않은 경우가 종종 있습니다, 이는 유지 관리가 더 복잡하고 사용자가 색상 표준이 무엇을 말하려는지 제대로 이해하지 못할 수 있기 때문에 사용자에게 더 혼란스러울 수 있으며, 코드가 사용자 코드이고 표시기를 사용하는 유일한 사람이 되더라도 동적 색상 패턴을 만드는 드문 경우를 제외하고는 큰 의미가 없기 때문입니다.
이제 두 번째 요점에 대해 설명하겠습니다: 이 경우 문제는 표시기가 플롯 할 항목 수 (2 개의 선의 경우 2 개)와 개체 속성 (이 경우 선)을 혼동하고 있으며 선을 플롯하려면 실제로 최소 3 개의 정보를 선언해야하며, 여기서 N은 개체의 수를 나타내는 TypeN, ColorN, WidthN, 연습과 시간을 통해 표시기 속성과 그가 사용하는 개체 속성 간의 이러한 작은 차이를 이해하게 될 것입니다.... 포기하지 마세요... 계속 공부하면 곧 상황이 더 명확해질 것입니다 ... 😁👍
이제 코드 일부를 보겠습니다... 나는 그것을 고치는 방법을 정확히 보여주지 않을 것입니다 (내가 이렇게하면 재미 없을 것입니다... .... 😁👍✌ ) 다음 사실에주의를 기울이시기 바라며 이것은 중요합니다:
코드에 두 가지를 표시했습니다... 이제 그래프에서 재생 될 때 어떤 일이 발생하는지 살펴 보겠습니다....
레이블 중 하나만 코드에서 선언 한대로 HIGH .... 와 LOW ?!!! 그녀는 어디에 있습니까 ?!!! LOW 태그가 표시되지 않는다는 사실은 사용중인 색상 패턴이 #property indicator_color2에 선언 된 것임을 나타내므로이 시점에서 오류가 발생했습니다. 즉, 나머지 코드를 유지하더라도 실제로 LOW 라인을 생성하는 표시기 2의 속성을 제거하려고하면 HIGH 라인은 표시되지만 LOW 라인은 표시되지 않기 때문에이 점이 수정해야 할 첫 번째 요점입니다.... 왜요?!! 실제로는 PlotIndexSetInteger 호출을 사용하여 동적으로 LOW 라인을 그리는 데 필요한 정보를 정의하지 않기 때문입니다... 이상하게 보이지만 이것이 일어나고있는 일입니다. ....
이 문제를 해결하면 필요한 데이터가 동적으로 설정되므로 PlotIndexSetInteger를 사용하여 행 개체의 데이터를 선언하는 동적 방법을 정말로 사용하려는 경우 장면에서 #property indicator_color 컴파일 명령을 제거 할 수 있지만 그러한 노력을 기울이고 싶지 않다면 괜찮습니다.....
이제 위의 이미지를보고 #property indicator_color에서 사용중인 색상과 비교해 보겠습니다 ...이 색상을 매우주의 깊게보십시오 .... 이렇게하면 이상한 점을 발견하게 될 것입니다 .... 다시 재미를 잃지 말라고 말하지 않고 반복하지 않고 다른 색상을 사용해보십시오... 반복하면 실수가 어디에 있는지 이해하기가 더 어려워집니다 .... 😁👍
이제 마지막 세부 사항입니다: 그가 일부 포인트만 그리고 다른 포인트를 건너뛰고 있다고 생각하는 것은 두 가지 이유 때문일 수 있습니다: 색상 패턴이 그래프의 배경과 대조되지 않고 그래프의 배경과 대조되는 색상을 사용하려고 시도하고 두 번째는 실제로는 그렇지 않다고 생각하지만 OnCalcule 이벤트에 오류가있을 수 있으며 -1 또는 i 값을 반환하고 있으며 올바른 것은 rates_total을 반환하는 것이므로 코드에서이를 변경하여 향후 문제를 방지하십시오....
안녕하세요 다니엘,
혼란스러웠습니다. 드로잉 특성은 MQ4와 같은 버퍼 사양을 사용하여 정의되는 반면, 적어도 DRAW_COLOR... 사양의 경우 순차적 플롯 식별자를 사용하여 드로잉 특성이 정의되는 것으로 생각했습니다. DRAW_LINE 등에도 플롯 사양이 필요한지는 확인하지 못했습니다. 또한 indicator_colorX 속성에는 실제로 두 가지 기능이 있는데, 먼저 색상 수를 세고 설정한 다음 지정된 각 색상을 적절한 배열 위치에 설정하는 것입니다.더 많은 개선이 필요하지만 현재 올바르게 작동하는 색상 테스트와 약간 수정 된 MLADEN의 MACD Original2_1 두 파일을 첨부합니다. Mladen의 프로그램은 두 개의 플롯을 정의했지만 하나의 색상 인덱스 버퍼 만 사용하기 때문에 흥미 롭습니다.
도움을 주셔서 감사합니다.