English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
MQL5 마법사 및 Hlaiman EA 생성기를 사용하여 신경망 EA 생성

MQL5 마법사 및 Hlaiman EA 생성기를 사용하여 신경망 EA 생성

MetaTrader 5전문 어드바이저 | 3 9월 2021, 09:48
104 0
Ivan Negreshniy
Ivan Negreshniy

소개

거의 모든 거래자는 신경망의 존재에 대해 알고 있습니다. 그러나 그들 대부분은 블랙박스로 남아 있으며, 신경망이 패턴을 인식하고 솔루션에 대한 연관 검색을 생성하고 학습하며 시장 행동을 예측하는 데 그리고 자동 거래에서 효과적일 수 있다는 사실만 알려져 있습니다. 신경망의 적용에 초점을 맞춘 많은 정보 출처는 종종 이 주제를 잘 배우고 미래에 신경망을 사용할 수 있으려면 많은 시간과 노력을 투자해야 한다고 강조하면서 그 어려움에 대해 이야기합니다.

이 글은 이러한 주장을 반박하고 고급 자동화 방법을 통해 거래자가 신경망을 쉽게 시작하고 긴 학습 과정을 피할 수 있음을 증명하는 것을 목표로 합니다. 신경망에 대한 자신의 경험을 얻는 데 어려운 것은 없습니다. 확실히 기술적 분석보다 쉽습니다.

이를 고려하여 MQL5 WizardHlaiman EA Generator를 사용하여 MetaTrader 5용 신경망 EA를 자동으로 생성하는 방법을 설명합니다.

당면한 작업을 해결하기 위한 도구 선택은 무작위가 아닙니다.

  1. MQL5 마법사는 추가 모듈을 사용하여 생성된 코드를 확장할 수 있는 현재까지 자동 MQL5 코드 생성의 효율적이고 가장 빠른 메커니즘입니다.
  2. Hlaiman EA Generator는 Expert Advisor의 MQL5 코드에서 직접 프로그래밍할 수 있는 유연한 개체 통합 메커니즘을 갖춘 신경망 엔진입니다.

인지 및 학습과 관련된 인간과 같은 속성이 신경망 EA에서 우세하므로 이름에 'EA'를 사용하는 것이 종종 오해의 소지가 있고 사물의 본질을 반영하지 않습니다.


일반적인 설명

이 글의 목적에 설명된 이유 때문에 신경망의 이론적 정보, 분류 및 구조 또는 금융 시장과 관련된 연구 데이터를 여기에서 찾을 수 없습니다. 해당 정보는 다른 출처에서 확인할 수 있습니다. 이 글에서는 그래픽 가격 패턴 인식을 기반으로 시장 진입을 예측하고 연관 사고가 가능한 블랙박스로서의 신경망 개념에 의도적으로 자신을 국한시킬 것입니다. 같은 이유로 우리는 수익성 있는 가격 움직임에 앞서 거래 상품 차트에서 연속적인 바 시퀀스라는 패턴의 가장 단순한 개념을 사용할 것입니다.

문제 해결 도구에 대한 몇 마디. Hlaiman과 달리 MQL5 마법사는 종종 다양한 글와 문서의 주제였으며 MetaTrader 5처럼 소개가 필요하지 않습니다. 사회 지향적인 Hlaiman 프로젝트는 플러그인 형태의 다목적 소프트웨어 개발 및 홍보를 목적으로 하며 EA Generator가 그 중 하나입니다. 앞서 언급했듯이 기능적으로 EA Generator는 통합 메커니즘이 있는 신경망 엔진을 나타냅니다.

Hlaiman EA Generator에는 <hlaim.exe>가 포함되어 있습니다. 이 쉘은 동적으로 로드할 수 있는 구성 요소 라이브러리 형태의 플러그인과 다중 문서 인터페이스가 있는 Windows GUI 응용 프로그램을 나타냅니다. 이 시스템은 표준이 될 수 있고 플러그인의 일부로 로드할 수 있는 광범위한 수동 및 알고리즘 조정 및 구성 요소 제어 방법을 제공합니다. 시스템 작동 과정에서 Object Inspector 및 자동화 소프트웨어 도구(예: 스크립트.

Hlaiman EA Generator와 MQL5의 통합에는 Object Pascal 스크립트 인터프리터가 포함되며 소스 코드는 Named Pipes를 통해 전달됩니다. 다층 퍼셉트론(MLP)은 주요 신경망 구성 요소로 사용됩니다.

Hlaiman EA Generator는 신호 라이브러리 모듈인 SignalHNN.mqh를 사용하여 MQL5 마법사와 통합됩니다. 일단 자동으로 생성되면 Expert Advisor는 원하는 수의 상품과 시간 프레임에서 거래하도록 가르칠 수 있습니다. MetaТrader 5 터미널에서 신호를 나타내는 화살표는 화살표에 대한 그래픽 개체를 사용하여 수동으로 가격 차트에 그려지거나 동시에 교육 프로세스를 시작하는 TeachHNN.mq5 스크립트를 사용하여 자동으로 그릴 수 있습니다. Expert Advisor.

이것으로 이론적 설명을 마칩니다. 이제 운영 원칙 및 구현이라는 두 섹션으로 나누어진 실용적인 부분으로 진행합니다.

두 번째 섹션은 소프트웨어 개발자를 대상으로 하며 주로 이 웹사이트와 관련하여 여기에 제공됩니다. 따라서 특히 프로그래밍 기술을 얻는 데 관심이 거의 또는 전혀 없지만 신경망 EA를 만들고 거래 측면에서 효율성 또는 무익함을 평가하는 데 관심이 있는 거래자에게는 선택 사항입니다.


작동 원리

MQL5.community에서 계속 진행하려면 MetaTrader 5 터미널이 필요하다고 언급하는 것은 불필요할 것입니다. 없으시다면 다운로드하여 설치하세요. 또한 Hlaiman EA Generator의 데모 버전을 다운로드하여 설치해야 합니다.

MetaTrader 5 터미널을 실행하고 MetaEditor를 시작합니다. MQL5 마법사를 엽니다. 표준 도구 모음이나 파일 메뉴에서 '새로 만들기' 옵션을 사용하거나 'Ctrl+N' 단축키를 사용하여 수행할 수 있습니다.

MQL5 마법사 창에서 'Expert Advisor(생성)'를 선택하고 '다음'을 클릭합니다.

그림 1. MQL5 마법사에서 Expert Advisor 만들기

그림 1. MQL5 마법사에서 Expert Advisor 만들기

Expert Advisor의 위치와 이름을 지정하십시오. 'Experts\SampleHNN'을 클릭하고 '다음'을 클릭합니다.

그림 2. Expert Advisor의 일반 속성

그림 2. Expert Advisor의 일반 속성

'추가' 버튼을 클릭합니다. 드롭다운 목록에서 '패턴 Hlaiman 신경망 EA 생성기의 신호'를 선택하고 '확인'을 클릭해야 하는 '신호 모듈의 매개변수' 창이 표시됩니다.

그림 3. Hlaiman Neural Network EA 생성기의 거래 신호 모듈 선택

그림 3. Hlaiman Neural Network EA 생성기의 거래 신호 모듈 선택

매우 기본적인 구현의 경우 MQL5 마법사의 나머지 모든 단계에서 '다음'을 클릭할 수 있습니다. 필요한 경우 추가 옵션을 선택하여 Expert Advisor를 향상시킬 수 있습니다.

코드 생성이 완료되면 '컴파일'을 클릭하고 MetaEdior 창을 닫습니다. 생성된 Expert Advisor는 'Expert Advisors' 아래 MetaTrader 5 터미널의 네비게이터 패널에 나타납니다.

그림 4. SampleHNN Expert Advisor

그림 4. SampleHNN Expert Advisor

생성된 Expert Advisor 교육을 진행하기 전에 터미널에서 필요한 기호와 시간 프레임이 있는 차트를 열어야 합니다. Hlaiman EA Generator 애플리케이션이 실행 중이어야 합니다.

그림 5. 신경망 교육 준비

그림 5. 신경망 교육 준비

Expert Advisor를 가르치려면 터미널의 네비게이터 패널에서 'Scripts' 아래의 'TeachHNN'을 선택하고 지정된 차트에 대해 활성화합니다.

'TeachHNN' 스크립트를 실행하기 전에 모든 적절한 설정이 있는지 확인해야 합니다. 다음 매개변수가 있습니다.

  • 문서 이름 - 교육을 위한 Expert Advisor의 이름.
  • 신경망 레이어 - 신경망 레이어의 수;
  • 중간 뉴런 - 뉴런의 수;
  • Teaching epochs - 교육 에포크의 수;
  • 패턴 바 - 패턴의 바 수;
  • Teaching net? - 신경망 교육 과정(또는 단순히 신호 생성)을 시작합니다.
  • SignalsCreate - 신호의 그래픽 이미지를 자동으로 생성합니다.
  • SignalsBarPoints - 포인트로 표시되는 신호 생성 임계값;
  • SignalsBarsCount - 포인트 계산을 위한 바 수;
  • SignalsStartTime, SignalsEndTime - 신호 생성 기간의 시작 및 종료 시간;
  • SignalsClear - 티칭 완료 시 신호 이미지를 자동으로 삭제합니다.

그림 6. TeachHNN 스크립트 매개변수

그림 6. TeachHNN 스크립트 매개변수

모든 것이 준비되면 '확인'을 클릭하여 Expert Advisor 교육 프로세스를 시작합니다. 이렇게 하면 차트에서 사용 가능한 각 신호에 대한 그래픽 패턴의 자동 생성이 시작됩니다.

관련 정보는 터미널의 '도구 상자' 패널의 'Expert' 탭에 표시되고 해당 개체는 Hlaiman EA Generator 창에 표시됩니다.

패턴 생성이 완료되면 티칭 프로세스가 시작됩니다. 화면에 나타나는 티칭 진행 표시줄에 표시됩니다.

Hlaiman EA 생성기 교육

그림 7. 교육 진행 패널

프로세스가 완료될 때까지 기다리십시오. 교육 진행률 표시줄을 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 적절한 옵션을 선택하여 교육 프로세스가 완료되기 전에 종료할 수 있습니다.

교육 과정 및 스크립트 작업이 완료되면 관련 메시지가 'Expert' 탭의 로그에 추가됩니다. '신경망 만들기 성공! On 431 패턴'은 431 신호를 사용하여 Expert Advisor의 교육이 성공적으로 완료되었음을 나타냅니다.

이 메시지는 교육 과정에 포함된 패턴의 수를 보여주고 해당 패턴의 수를 찾습니다. 특히 BUY 및 SELL은 '패턴 #211에서 감지된 판매 신호' 유형의 메시지를 사용하여 결정됩니다.

그림 8. 교육 과정에서 TeachHNN 스크립트 메시지

그림 8. 교육 과정에서 TeachHNN 스크립트 메시지

Expert Advisor를 가르치는 과정이 오류로 시작되는 이유는 다음과 같습니다.

  1. Hlaiman 응용 프로그램은 필요에 따라 시작하기 전에 실행되지 않았습니다. 이 경우 오류 메시지는 "CSignalHNN::InitHNN: Error! 파이프 서버를 초기화하는 중입니다(가능한 이유: HLAIMAN APPLICATION IS NOT RUNNING!)".
  2. 신호 자동 생성이 비활성화된 경우 차트에 신호를 나타내는 화살표가 없습니다(SignalsCreate 변수 = false). 이 경우 표시되는 오류 메시지는 다음과 같습니다. "OnStart: 오류, 주문 화살표를 찾을 수 없습니다!" 신호 자동 생성이 활성화된 경우(SignalsCreate 변수 = true) 오류가 발생할 수 있습니다. 사용자 정의 표시가 프로그램에서 엉망이되어서는 안되기 때문에 차트에 다른 그래픽 개체가 있기 때문에 발생합니다. 따라서 신호의 자동 생성을 위해 모든 차트를 별도로 여는 것이 좋습니다.

Expert Advisor의 교육이 완료되면 GUI Hlaiman으로 전환하고 적절한 개체 및 시각화 패널을 선택하여 관련 결과를 볼 수 있습니다.

그림 9. Hlaiman 애플리케이션의 '텍스트' 탭

그림 9. Hlaiman 애플리케이션의 '텍스트' 탭


그림 10. Hlaiman 애플리케이션의 '그래프' 탭

그림 10. Hlaiman 애플리케이션의 '그래프' 탭

하나 이상의 거래 상품에 대해 Expert Advisor를 성공적으로 교육한 후 테스트 및/또는 최적화를 진행할 수 있습니다.

이렇게 하려면 Strategy Tester에서 훈련된 Expert Advisor의 이름, 기호, 시간 프레임, 간격 및 기타 테스트 매개변수를 선택합니다. 필요한 경우 외부 변수를 설정하고 테스트를 실행합니다.

그림 11. 백테스팅을 위한 SampleHNN Expert Advisor 설정

그림 11. 백테스팅을 위한 SampleHNN Expert Advisor 설정


그림 12. SampleHNN Expert Advisor의 외부 변수 수정 가능

그림 12. SampleHNN의 외부 변수 Expert Advisor 수정 가능

다음은 Strategy Tester의 Expert Advisor 운영 보고서 예시입니다. Expert Advisor는 기본적으로 설정되는 교육 스크립트의 모든 외부 매개변수와 함께 자동으로 생성된 신호를 사용하여 교육되었습니다. 교육 기간: 01.01.2010-01.07.2013, 악기: EURUSD H4.


전략 테스터 보고서

전략가 보고:SampleHNN
기호: EURUSD
기간: H4 (2010.01.01-2013.07.12)
통화: USD
초기 입금: 10,000.00
영향력: 0,111111111
백테스팅
기록 품질: 100%
바: 5497
순이익: 9,159.58
총 이익: 29,735.97
총 손실: -20,576.39
이익 계수: 1.45
회복 계수: 12.81
AHPR: 1.0005 (0.05%)
GHPR: 1.0005 (0.05%)
총 거래: 1417
총 거래: 2246
틱: 60211228
밸런스 드로다운 절대값: 0.00
잔액 감소 최대: 679.98 (3.81%)
잔액 하락 상대: 4.00% (715.08)
예상 수익: 6.46
샤프 비율: 0.16
LR 상관관계: 0.98
LR 표준 오차: 595.06
공매도(원 %): 703 (56.61%)
이익 거래(총 %): 793 (55.96%)
최대 이익 거래: 53.00
평균 이익 거래: 37.50
최대 연속 승리: 9 (450.38)
최대 연속 이익: 450.38 (9)
평균 연속 승리: 2
기호: 1
자기자본절감 절대: 6.60
자기자본 손실 최대치: 715.08 (4.00%)
자기자본 드로다운 상대: 4.00% (715.08)
마진 수준: 6929.24%
Z 계정: -1.24 (78.50%)
온테스터 결과: 0
장기 거래(원 %): 714 (55.32%)
손실 거래(총 %): 624 (44.04%)
최대 손실 거래: -53.30
평균 손실 거래: -32.97
최대 연속 손실: 9 (-234.00)
최대 연속 손실: -276.67 (7)
평균 연속 손실: 2

그림 13. SampleHNN Expert Advisor 백테스팅 결과

그림 13. SampleHNN Expert Advisor 백테스팅 결과


그림 14. SampleHNN Expert Advisor 시장 진입 통계

그림 14. SampleHNN Expert Advisor 시장 진입 통계


그림 15. SampleHNN Expert Advisor의 수익과 MFE/MAE의 상관관계

그림 15. SampleHNN Expert Advisor의 수익과 MFE/MAE의 상관관계


그림 16. SampleHNN Expert Advisor 포지션 보유 시간 통계

그림 16. SampleHNN Expert Advisor 포지션 보유 시간 통계

구현

주요 MQL5 구현 구성 요소는 SignalHNN.mqh 신호 모듈에 설명된 CSignalHNN 클래스입니다. 이 클래스는 CExpertSignal 기본 클래스에서 상속되며 Hlaiman의 작업 및 통합과 MQL5 마법사를 사용하여 생성된 Expert Advisors 작업에 필요한 모든 데이터 필드와 를 포함합니다.

클래스 템플릿은 다음과 같습니다.

//+------------------------------------------------------------------+
//| Class CSignalHNN.                                                |
//| Purpose: Class of generator of trade signals based on            |
//|          the 'Hlaiman EA Generator Neural Net' indicator.        |
//| Is derived from the CExpertSignal class.                         |
//+------------------------------------------------------------------+
class CSignalHNN :public CExpertSignal
  {
protected:
   //--- variables
   int               m_hnn;                   // handle of HNN connect
   string            hnn_path;                // MT5 Terminal data path
   string            hnn_fil;                 // HNN file w neural net 
   string            hnn_nam;                 // Expert name
   string            hnn_sym;                 // Symbol name
   string            hnn_per;                 // Period name
   ENUM_TIMEFRAMES   hnn_period;              // Period timeframe
   int               hnn_index;               // Index ext multinet
   int               hnn_bar;                 // index of last bar
   int               hnn_in;                  // input layer 
   int               hnn_out;                 // output layer
   int               hnn_layers;              // layers count
   int               hnn_neurons;             // neurons count
   int               hnn_epoch;               // learn epoch
   double            hnn_signal;              // value of last signal
   double            pattern[];               // values of the pattern
   bool              hnn_norm;                // normalize pattern

public:
                     CSignalHNN(void);        // class constructor
                    ~CSignalHNN(void);        // class destructor
   //--- methods of setting adjustable parameters
   void              PatternBarsCount(int value) { hnn_in = value; ArrayResize(pattern, value + 1);  }
   void              LayersCount(int value)      { hnn_layers = value;  }
   void              NeuronsCount(int value)     { hnn_neurons = value;  }
   void              EpochCount(int value)       { hnn_epoch = value;  }
   void              Normalize(bool value)       { hnn_norm = value;  }
   //--- method of verification of settings
   virtual bool      ValidationSettings(void);
   //--- method of creating the indicator and timeseries
   virtual bool      InitIndicators(CIndicators *indicators);
   //--- methods of checking conditions of entering the market
   virtual double    Direction(void);

   bool              FillPattern(datetime tim = 0);      // prepare pattern
   bool              AddPattern(string name, int ptype);  // add new pattern
   bool              TeachHNN(void);                     // learn neural net
   bool              SaveFileHNN(void);                  // neural net file
   double            CalculateHNN(void);                 // calc neural signal

                                                        //protected:
   //--- method of initialization of the Hlaiman Application
   bool              InitHNN(bool openn);                // Hlaiman App Init
   void              FreeHNN(void)
     {                     // Hlaiman App Deinit
      if(m_hnn!=0 && m_hnn!=INVALID_HANDLE)
        {
         FileClose(m_hnn);
         m_hnn=0;
        }
     };
  };

생성자를 사용하여 클래스 인스턴스를 만든 후 이 개체는 두 가지 주요 모드에서 작동할 수 있습니다.

  1. 교육 모드: 이 모드는 시장 패턴 수집 및 신경망 교육과 관련이 있습니다.
  2. 지표 모드: 이 모드에서 신경망 신호는 현재 패턴을 사용하여 계산됩니다.

모드는 부울 매개변수 openn을 사용하여 InitHNN 초기화 모드를 호출할 때 식별됩니다. 이 매개변수의 실제 값은 지표 모드(2)에서 학습된 신경망의 데이터 파일의 검색 및 열기, 로드 및 작동을 시작합니다. 이 모드는 작동 모드로 간주되며 거래를 위해 Expert Advisor에서 사용됩니다.

openn=false로 InitHNN 메소드를 호출할 때 초기화되는 티칭 모드(1)와 달리 지표 모드는 Expert Advisor를 위한 준비 모드로 티칭 스크립트 동작에 사용된다.

초기화 방법은 다음과 같이 구현됩니다.

//+------------------------------------------------------------------+
//| Initialize HNN                                                   |
//+------------------------------------------------------------------+
bool CSignalHNN::InitHNN(bool openn)
  {
//--- initialize Hlaiman Application
   int num=0;
   ulong res=0;
   if(m_symbol!=NULL)
     {
      hnn_sym=m_symbol.Name();
      hnn_period=m_period;
        } else {
      hnn_sym=_Symbol;
      hnn_period=_Period;
     }
   hnn_per = string(PeriodSeconds(hnn_period) / 60);
   hnn_fil = hnn_nam + NAME_DELIM + hnn_sym + hnn_per + NAME_DELIM + string(hnn_index) + TYPE_NEURO;
   if(m_hnn== 0|| m_hnn == INVALID_HANDLE)
      m_hnn=FileOpen(HLAIMAN_PIPE,FILE_READ|FILE_WRITE|FILE_BIN);
   if(m_hnn!=0 && m_hnn!=INVALID_HANDLE)
     {
      string source,result="";
      if(openn==true)
        {
         result=CON_OPENN+CON_TRUE;
         if(!FileIsExist(hnn_fil,FILE_READ))
           {
            if(FileIsExist(hnn_fil,FILE_READ|FILE_COMMON))
               hnn_fil=TerminalInfoString(TERMINAL_COMMONDATA_PATH)+PATH_FILES+hnn_fil;
            else
              {
               //              hnn_fil = hnn_path + PATH_MQL5 + PATH_FILES + hnn_fil;
               hnn_fil=TerminalInfoString(TERMINAL_DATA_PATH)+PATH_MQL5+PATH_FILES+hnn_fil;
              }
           }
         else hnn_fil=TerminalInfoString(TERMINAL_DATA_PATH)+PATH_MQL5+PATH_FILES+hnn_fil;
           } else {
         result=CON_OPENN+CON_FALSE;
         hnn_fil=TerminalInfoString(TERMINAL_DATA_PATH)+PATH_MQL5+PATH_FILES+hnn_fil;
        }
      source="unit InitHNN; Interface "+result+" var libr, term, exp, sym: TObject;"
             " Implementation function main: integer;\n\r" // Line #1
             " begin"
             " Result := 0;"
             " libr := Open('mt45.dll');\n\r" // Line #2
             " if (libr <> nil) then"
             " begin"
             " term := Open('"+hnn_path+"');\n\r" // Line #3
             " if (term <> nil) then"
             " begin"
             " exp := term.ObjectOfName('"+hnn_nam+"');"
             " if (exp = nil) then exp := term.AddObject('TMT45Expert');\n\r" // Line #5
             " if (exp <> nil) then"
             " begin"
             " if (exp.Name <> '"+hnn_nam+"') then exp.Name := '"+hnn_nam+"';\n\r" // Line #6
             " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');"
             " if (sym = nil) then sym := exp.AddObject('TMT45Symbol');"
             " if (sym <> nil) then"
             " begin"
             " sym.Log.Add('"+hnn_sym+hnn_per+"');\n\r"
             " if (sym.Name <> '"+hnn_sym+hnn_per+"') then sym.Name := '"+hnn_sym+hnn_per+"';"
             " if (sym.Period <> "+hnn_per+") then sym.Period := "+hnn_per+";"
             " if (openn = true) then"
             " begin"
             //                   " sym.Log.Add('" + hnn_fil + "');"
             " if (sym.Open('"+hnn_fil+"')) then Result := sym.TeachInput;\n\r" // ret input Line #8
             " end else"
             " begin"
             " sym.TeachInput := "+IntegerToString(hnn_in)+";"
             " sym.TeachOutput := "+IntegerToString(hnn_out)+";"
             " sym.TeachLayer := "+IntegerToString(hnn_layers)+";"
             " sym.TeachNeurons := "+IntegerToString(hnn_neurons)+";"
             " sym.TeachEpoch := "+IntegerToString(hnn_epoch)+";"
             " sym.FileName := '"+hnn_fil+"';"
             " Result := sym.TeachInput;\n\r" // ret input Line #9
             " end;"
             " end;"
             " end;"
             " end;"
             " end;"
             " end; end.";
      FileWriteString(m_hnn,source,StringLen(source));
      FileFlush(m_hnn);
      while(res<=0 && (MQL5InfoInteger(MQL5_TESTER) || num<WAIT_TIMES))
        {
         Sleep(SLEEP_TIM);
         res=FileSize(m_hnn);
         num++;
        }
      if(res>0)
        {
         result=FileReadString(m_hnn,int(res/2));
         res=StringToInteger(result);
         if(res<=RES_OK)
            printf(__FUNCTION__+": Error! Initialization data(possible reason: FILE NOT EXIST OR CORRUPTED "+hnn_fil);
         else
           {
            printf(__FUNCTION__+": Initialization successful! NEURAL PATTERN "+string(res));
            ArrayResize(pattern,int(res+1));
            return(true);
           }
        }
      else
         printf(__FUNCTION__+": Error! pipe server not responding(possible elimination: RESTART HLAIMAN APPLICATION)");
     }
   else
      printf(__FUNCTION__+": Error! initializing pipe server (possible reason: HLAIMAN APPLICATION IS NOT RUNNING!)");
//--- ok
   return(false);
  }

코드에서 볼 수 있듯이 첫 번째 초기화 단계에서는 Hlaiman 응용 프로그램과의 연결을 위해 명명된 파이프를 열려는 시도를 다룹니다. 이 시도가 실패하면(예: <hlaim.exe>가 실행되지 않을 때) 부정적인 상태로 종료가 수행됩니다. 두 번째 단계(첫 번째 단계 및 동작 지표 모드가 성공적으로 완료되면)에서는 터미널의 로컬 및 공통 폴더에서 신경망 데이터와 함께 필요한 파일 이름을 검색합니다. 세 번째 단계는 Hlaiman 애플리케이션에서 직접 초기화를 위해 ObjectPascal(Delphi)에서 코드를 준비하는 것입니다.

그런 다음 코드 텍스트가 소스 문자열로 이동됩니다. 서식 지정의 편의를 위해 '\n\r'을 사용하여 하위 문자열로 분류되며 Hlaiman 개체 속성 및 호출을 포함합니다(주석 참조). 본문에 정의된 대로 MetaTrader 5 Hlaiman 플러그인의 개체 기반 환경은 플러그인의 개체가 루트에 있는 트리 아키텍처를 나타냅니다.

MetaTrader 5 터미널 개체는 다음 수준에 있으며 Expert Advisor 및 기호 개체가 있습니다. 명명된 파이프를 통해 전달된 소스 코드의 성공적인 번역 및 실행의 경우 반환된 결과 값에는 신경망 입력 벡터의 요소 수가 포함됩니다. 코드에서 알 수 있듯이 이 값은 패턴 배열을 초기화하는 데 사용되며 실행은 긍정적인 상태로 완료됩니다.

CSignalHNN 클래스의 다른 주요 메소드는 CalculateHNN, AddPattern 및 TeachHNN입니다. 첫 번째는 지표 모드에서 신경망 계산 결과를 반환합니다. 나머지 두 가지 방법은 각각 패턴을 수집하고 신경망 교육 프로세스를 시작할 때 교육 모드에서 사용됩니다.

<SignalHNN.mqh>에서 이러한 메소드의 구현은 다음과 같습니다.

//+------------------------------------------------------------------+
//| Calculate HNN signal                                             |
//+------------------------------------------------------------------+
double CSignalHNN::CalculateHNN(void)
  {
   if(m_hnn==0 || m_hnn==INVALID_HANDLE) return(0.0);
   int num = 0;
   ulong siz = 0;
   double res=0.0;
   string source,result="";
   if(FillPattern(0)==true)
     {
      result=CON_START;
      for(int i=1; i<(ArraySize(pattern)-1); i++)
         result= result+DoubleToString(pattern[i])+CON_ADD;
      result = result + DoubleToString(pattern[ArraySize(pattern) - 1]) + CON_END;
      source = "unit CalcHNN; Interface " + result + " var i: integer; libr, term, exp, sym, lst: TObject;"
              " Implementation function main: double;\n\r" // Line #1
              " begin"
              " Result := 0.0;"
              " libr := Open('mt45.dll');\n\r" // Line #2
              " if (libr <> nil) then"
              " begin"
              " term := Open('"+hnn_path+"');\n\r" // Line #3
              " if (term <> nil) then"
              " begin"
              " exp := term.ObjectOfName('"+hnn_nam+"');\n\r" // Line #4
              " if (exp <> nil) then"
              " begin"
              " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');\n\r" // Line #5
              " if (sym <> nil) then"
              " begin"
              " lst := TStringList.Create;"
              " if (lst <> nil) then"
              " begin"
              " lst.Text := cons;"
              " if (lst.Count >= sym.NetInputs.Count) then"
              " begin"
              " for i := 0 to sym.NetInputs.Count - 1 do"
              " begin"
              " sym.NetInputs.Objects[i].NetValue := StrToFloat(lst[i]);\n\r" // Line #6
              //                    " sym.Log.Add('Input ' + IntToStr(i) + ' = ' + lst[i]);"              
              " end;"
              " sym.Computed := true;"
              " Result := sym.NetOutputs.Objects[0].NetValue;\n\r" // ret input Line #7
              " end;"
              " lst.Free;"
              " end;"
              " end;"
              " end;"
              " end;"
              " end;"
              " end; end.";
      FileWriteString(m_hnn,source,StringLen(source));
      FileFlush(m_hnn);
      while(siz<=0 && (MQL5InfoInteger(MQL5_TESTER) || num<WAIT_TIMES))
        {
         Sleep(SLEEP_TIM);
         siz=FileSize(m_hnn);
         num++;
        }
      if(siz>0)
        {
         result=FileReadString(m_hnn,int(siz/2));
         res=StringToDouble(result);
        }
     } //else Print("fill pattern error!");
   return(res);
  }
//+------------------------------------------------------------------+
//| AddPattern                                                       |
//+------------------------------------------------------------------+
bool CSignalHNN::AddPattern(string name,int ptype)
  {
   int num=0;
   long res=0;
   ulong siz=0;
   string result,source,nam=name;
   if(m_hnn!=0 || m_hnn!=INVALID_HANDLE)
     {
      pattern[0]=ptype;
      result=CON_START;
      for(int i=0; i<(ArraySize(pattern)-1); i++)
         result= result+DoubleToString(pattern[i])+CON_ADD;
      result = result + DoubleToString(pattern[ArraySize(pattern) - 1]) + CON_END;
      source = "unit AddPatternHNN; Interface " + result + " Implementation function main: integer;"
              " var i: integer; out: double; onam: string;"
              " libr, term, exp, sym, ord, tck, lst: TObject;\n\r" // Line #1
              " begin"
              " Result := 0;"
              " libr := Open('mt45.dll');\n\r" // Line #2
              " if (libr <> nil) then"
              " begin"
              " term := Open('"+hnn_path+"');\n\r" // Line #3
              " if (term <> nil) then"
              " begin"
              " exp := term.ObjectOfName('"+hnn_nam+"');\n\r" // Line #4
              " if (exp <> nil) then"
              " begin"
              " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');\n\r" // Line #5
              " if (sym <> nil) then"
              " begin"
              " lst := TStringList.Create;"
              " if (lst <> nil) then"
              " begin"
              " lst.Text := cons;"
              " if (lst.Count >= (sym.TeachInput + sym.TeachOutput)) then"
              " begin"
              " out := StrToFloat(lst[0]);"
              " if(out >= 0) then onam := 'BUY-"+nam+"'"
              " else onam := 'SELL-"+nam+"';"
              " ord := sym.ObjectOfName(onam);"
              " if (ord = nil) then ord := sym.AddObject('TMT45Order');\n\r" // Line #6                    
              " if (ord <> nil) then"
              " begin"
              " if (ord.Name <> onam) then ord.Name := onam;\n\r" // Line #7
              " if (out >= 0) then ord.OrderType := 0 else ord.OrderType := 1;"
              " if (ord.NetOutput <> out) then ord.NetOutput := out;\n\r" // Line #8
              " for i := 1 to sym.TeachInput do"
              " begin"
              " if(i <= ord.Count) then tck := ord.Items[i - 1] else"
              " tck := ord.AddObject('TMT45Tick');\n\r" // Line #10                    
              " if (tck <> nil) then"
              " begin"
              " tck.x := i;"
              " tck.y := StrToFloat(lst[i]);\n\r" // Line #11
              " end;"
              " end;"
              " end;"
              " Result := sym.Count;\n\r" // ret input Line #12
              " end;"
              " lst.Free;"
              " end;"
              " end;"
              " end;"
              " end;"
              " end;"
              " end; end.";
      FileWriteString(m_hnn,source,StringLen(source));
      FileFlush(m_hnn);
      while(siz<=0 && (MQL5InfoInteger(MQL5_TESTER) || num<WAIT_TIMES))
        {
         Sleep(SLEEP_TIM);
         siz=FileSize(m_hnn);
         num++;
        }
      if(siz>0)
        {
         result=FileReadString(m_hnn,int(siz/2));
         res=StringToInteger(result);
        }
     }
   return(res>0);
  }
//+------------------------------------------------------------------+
//| TeachHNN                                                         |
//+------------------------------------------------------------------+
bool CSignalHNN::TeachHNN(void)
  {
   int num=0;
   long res=0;
   ulong siz=0;
   string result,source;
   if(m_hnn!=0 || m_hnn!=INVALID_HANDLE)
     {
      source="unit TeachHNN; Interface const WAIT_TIM = 100; WAIT_CNT = 100;"
             "  var i: integer; libr, term, exp, sym: TObject;"
             " Implementation function main: integer;\n\r" // Line #1
             " begin"
             " Result := 0;"
             " libr := Open('mt45.dll');\n\r" // Line #2
             " if (libr <> nil) then"
             " begin"
             " term := Open('"+hnn_path+"');\n\r" // Line #3
             " if (term <> nil) then"
             " begin"
             " exp := term.ObjectOfName('"+hnn_nam+"');\n\r" // Line #4
             " if (exp <> nil) then"
             " begin"
             " sym := exp.ObjectOfName('"+hnn_sym+hnn_per+"');\n\r" // Line #5
             " if (sym <> nil) then"
             " begin"
             " if (sym.Teached) then sym.Teached := false;\n\r" // Line #6
             " sym.Teached := true;\n\r" // Line #7
             " Result := sym.Count;\n\r" // ret input Line #8
             " end;"
             " end;"
             " end;"
             " end;"
             " end; end.";
      FileWriteString(m_hnn,source,StringLen(source));
      FileFlush(m_hnn);
      while(siz<=0)
        {// && (MQL5InfoInteger(MQL5_TESTER) || num < WAIT_TIMES)) {
         Sleep(SLEEP_TIM);
         siz=FileSize(m_hnn);
         num++;
        }
      if(siz>0)
        {
         result=FileReadString(m_hnn,int(siz/2));
         res=StringToInteger(result);
        }
     }
   return(res>0);
  }

코드에서 볼 수 있듯이 본문은 주로 InitHNN 설명에서 고려한 텍스트와 유사하게 정렬된 텍스트 행으로 구성됩니다. 유일한 차이점은 플러그인의 개체 기반 계층 구조에는 패턴 표현을 위한 두 가지 수준(순서 및 틱)이 더 있다는 것입니다. 또한 코드에는 추가 개체 속성과 가 포함되어 있습니다. 예를 들어 신경망 계산의 시작은 'symbol' 개체의 Computed 플래그에 의해 플래그가 지정되며, 티칭 프로세스를 시작할 때 Teached 플래그가 사용됩니다.

또한, 이 경우 함수가 반환하는 'main' 값의 유형이 'double'이라는 점에서도 CalculateHNN 방식이 다른 방식과 다릅니다. 이 값은 신경망 출력 - 신호로, BUY 레벨은 범위 0..1에 있고 SELL 레벨은 범위 0..-1에 있습니다. 이 신호는 거래 포지션의 개설 또는 마감에 관한 결정을 내릴 때 Expert Advisor가 사용하며 방향 방식에 의해 제어됩니다. 이 메소드는 새로운 바의 경우 재계산을 수행하고 백분율로 표시된 값을 리턴합니다.

//+------------------------------------------------------------------+
//| Check conditions for trading signals.                            |
//+------------------------------------------------------------------+
double CSignalHNN::Direction(void)
  {
   if( m_hnn == 0 || m_hnn == INVALID_HANDLE) return(EMPTY_VALUE);
//--- check new bar condition
   int cur_bar = Bars(hnn_sym, hnn_period);
   if (hnn_bar != cur_bar) {
//--- condition OK
      hnn_signal = CalculateHNN() * 100;
      hnn_bar = cur_bar;
   }
   return(hnn_signal);
  }

거래 포지션을 열고 닫는 신호와 관련하여 Expert Advisor의 신호 응답 임계값을 설정하려면 다음 외부 변수를 사용할 수 있습니다.

  • 입력 정수 Signal_ThresholdOpen =10; // 열릴 신호 임계값 [0...100]
  • 입력 정수 Signal_ThresholdClose=10; // 닫을 신호 임계값 [0...100]

실제로 신호 수준은 신경망 교육 품질 및 강도에 따라 달라지며, 일반적으로 교육 과정에서 지표에 표시되는 계산 오류의 감소 역학을 모니터링하여 시각적으로 평가할 수 있습니다.


결론

Hlaiman EA Generator는 MQL5와의 통합을 위해 구성 요소와 투명하게 제어되는 개체 기반 환경을 제공합니다.

  1. MQL5 Wizard 인터페이스는 신호 및 패턴 인식과 신경망 EA 생성 가능성을 기반으로 추가 유형을 얻습니다.
  2. 신경망 EA를 빠르게 생성하는 기능 외에도 변화하는 시장 행동에 빠르게 적응하고 다양한 거래 수단과 기간에 대해 반복적으로 가르칠 수 있습니다.
  3. MQL5 마법사가 여러 신호 모듈을 활성화할 수 있기 때문에 복잡한 다중 통화 신경망 EA 및/또는 복합 지표 기반 신경망 EA를 만들 수 있습니다. 또한 다양한 추가 필터와 결합할 수도 있습니다 (예: 시간 필터).
  4. 그리고 마지막으로 신경망 모듈 자체를 추가 필터로 사용하여 기성품 Expert Advisor의 효율성을 높일 수 있습니다. 이것은 원래 Expert Advisor의 테스트 결과 시각화 차트를 사용하여 학습할 수 있는 신경망의 기능으로 인해 가능합니다.

스크립트 인터프리터를 사용하여 통합 컴퓨팅 시스템의 성능이 그다지 높지 않은 것처럼 보이는 것은 위에 제공된 구현의 단점 중 하나로 간주될 수 있습니다. 그러나 먼저 스크립트 코드 해석과 Hlaiman 플러그인 작동이 EX5와 비동기식이라는 점에 유의해야 합니다. 즉, 작업 병렬화를 처리합니다. 둘째, 시간이 많이 걸리는 계산의 속도를 높이기 위해. 대규모 신경망을 다룰 때 MetaTrader 5와 Hlaiman은 명명된 네트워크 파이프를 통해 연결된 다른 컴퓨터에서 실행할 수 있습니다. 별도의 컴퓨터에서 거래 단말기를 실행하면 성능이 향상될 뿐만 아니라 보안도 향상될 수 있습니다.

관점에서 볼 때 거래 과정에서 스스로 학습할 수 있는 Expert Advisors의 개발을 살펴볼 수 있습니다. 이 시점에서 가장 쉬운 방법은 Expert Advisor의 코드와 교육 스크립트 코드를 결합하는 것입니다. 둘 다 필요한 기능을 제공하는 동일한 CSignalHNN 클래스를 사용하기 때문입니다. 이 자료는 관심 있는 것으로 보이는 경우 후속 글의 주제가 되거나 완전히 새로운 자료의 기초가 될 수 있습니다.

Hlaiman EA Generator의 데모 버전은 여기에서 다운로드할 수 있습니다.

첨부 파일:

  • SignalHNN.mqh - 신호 모듈 "MQL5\Include\Expert\Signal\".
  • TeachHNN.mq5 - 교육 스크립트 "MQL5\Scripts\".
  • SampleHNN.mq5 - 거래 신호 모듈 '신호 패턴 Hlaiman 신경망 EA 생성기'를 기반으로 하고 MQL5 마법사를 사용하여 생성된 Expert Advisor입니다.

MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/706

파일 첨부됨 |
signalhnn.mqh (23.88 KB)
teachhnn.mq5 (9.67 KB)
samplehnn.mq5 (6.35 KB)
자동 뉴스 거래자 구축 자동 뉴스 거래자 구축
이것은 처음부터 간단한 OO EA를 빌드하는 방법을 보여주고 객체 지향 프로그래밍에 대한 몇 가지 팁을 제공한 또 다른 MQL5 OOP 클래스 글의 연속입니다. 오늘은 뉴스를 거래할 수 있는 EA를 개발하는 데 필요한 기술적인 기본 사항을 보여 드리겠습니다. 제 목표는 계속해서 OOP에 대한 아이디어를 제공하고 파일 시스템으로 작업하는 이 일련의 글에서 새로운 주제를 다루는 것입니다.
또 다른 MQL5 OOP 클래스 또 다른 MQL5 OOP 클래스
이 글은 이론적인 거래 아이디어를 구상하는 것부터 그 아이디어를 경험적 세계에서 현실로 만드는 MQL5 EA를 프로그래밍하는 것에 이르기까지 처음부터 객체 지향 Expert Advisor를 구축하는 방법을 보여줍니다. 행동으로 배우는 것은 IMHO 성공을 위한 확실한 접근 방식입니다. 그래서 저는 여러분이 Forex 로봇을 최종적으로 코딩하기 위해 아이디어를 주문하는 방법을 볼 수 있도록 실용적인 예를 보여주고 있습니다. 저의 목표는 또한 당신이 OO 원칙을 준수하도록 초대하는 것입니다.
MQL5 마법사: EA가 모든 가격으로 보류 중인 주문을 열도록 가르치는 방법 MQL5 마법사: EA가 모든 가격으로 보류 중인 주문을 열도록 가르치는 방법
이 글은 현재 가격에서 어떤 거리에서도 보류 주문을 설정할 수 있도록 하는 기능의 구현을 위해 거래 신호 모듈의 코드를 수정하는 방법을 설명합니다. 즉, 이는 이전 바의 종가 또는 시가 또는 이동 평균 닫거나 오픈할 수 있습니다. 많은 옵션이 있습니다. 중요한 것은 보류 중인 주문에 대해 시작 가격을 설정할 수 있다는 것입니다. 이 글은 보류 중인 주문으로 거래하는 거래자에게 유용합니다.
계산을 위해 OpenCL을 설치하고 사용하는 방법 계산을 위해 OpenCL을 설치하고 사용하는 방법
MQL5가 OpenCL에 대한 기본 지원을 제공하기 시작한 지 1년이 넘었습니다. 그러나 Expert Advisors, 지표 또는 스크립트에서 병렬 컴퓨팅 사용의 진정한 가치를 본 사용자는 많지 않습니다. 이 문서는 MetaTrader 5 거래 터미널에서 이 기술을 사용할 수 있도록 컴퓨터에 OpenCL을 설치하고 설정하는 데 도움이 됩니다.