English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
NeuroSolutions Neuronet 연결

NeuroSolutions Neuronet 연결

MetaTrader 5통합 | 4 8월 2021, 16:58
97 0
ds2
ds2

소개

뉴로넷 (Neuronet)에 대해 알게 된 모든 트레이더는 시장 분석에 뉴로넷 (Neuronet)을 사용하는 것이 얼마나 좋을지 생각합니다. 모든 구성의 네트워크를 편리하게 만들고 시각적 모드에서 교육 및 테스트할 수 있는 프로그램이 많이 있습니다. 클라이언트 터미널에서 필요한 정보를 뉴로넷 (Neuronet) 프로그램으로 내보내어 분석할 수 있습니다.

하지만 생성된 뉴로넷 (Neuronet)을 자동 거래에 사용하려면 어떻게 해야 할까요? Expert Advisor를 뉴로넷 (Neuronet)에 연결하여 실시간 모드로 거래할 수 있습니까?

예, 그렇습니다. 몇몇 뉴로넷 (Neuronet) 프로그램에는 필요한 프로그램 인터페이스가 있습니다. 그 중 하나가 NeuroSolutions입니다. 최신 버전은 6이지만 모든 사람이 가지고 있는 것은 아니며 현재 가장 인기 있는 버전은 5번째 버전입니다. 그렇기 때문에 이 글에서는 5번째 버전과의 상호 작용에 대해 설명합니다. 프로그램의 전체 배포가 필요합니다. 여기에는 우리에게 필요한 맞춤형 솔루션 마법사가 포함되어 있습니다.


전략 생각하기

테스트 예제의 전략은 간단합니다. WeekPattern이라고 합시다. 그것은 뉴로넷 (Neuronet)을 사용하여 D1 시간대에 개장할 때 바의 종가를 예측합니다. 획득한 정보에 따라 매수 또는 매도 거래를 하고 하루 종일 보유합니다. 가격 예측은 이전 바 5개의 OHLC 값을 기반으로 합니다. 뉴로넷 (Neuronet) 작동의 정확도를 높이기 위해 가격 자체가 아닌 현재(0) 바의 오픈 가격에 상대적인 가격 변동만 보낼 것입니다.


훈련을 위한 데이터 준비

네트 생성을 시작하기 전에 MQL5 스크립트를 작성해 보겠습니다. 이 스크립트는 클라이언트 터미널에서 필요한 형식으로 모든 따옴표를 내보냅니다. 이 정보는 뉴로넷 (Neuronet)을 훈련하는 데 필요합니다. 데이터는 텍스트 파일로 내보내집니다. 파일의 첫 번째 목록에서 필드 이름을 쉼표로 구분하여 나열합니다. 다음 줄은 쉼표로 구분된 데이터에 사용됩니다. 각 라인은 뉴로넷 (Neuronet)의 입력과 출력의 조합입니다. 우리의 경우 스크립트는 각 행에서 가격 기록의 한 바만큼 뒤로 이동하고 행에 6개의 바의 OHLC 값을 씁니다(과거의 5개 바는 입력이고 현재 바 1개는 출력입니다).

스크립트 скрипт WeekPattern-Export.mq5는 필수 기호의 필수 기간에 시작되어야 합니다(이 예에서는 D1 EURUSD). 설정에서 파일 이름과 필요한 라인 수를 지정해야 합니다(D1의 경우 260줄은 약 1년 기록입니다). 스크립트의 전체 코드:

#property script_show_inputs
//+------------------------------------------------------------------+
input string    Export_FileName = "NeuroSolutions\\data.csv"; // File for exporting (in the folder "MQL5\Files")
input int       Export_Bars     = 260; // Number of lines to be exported
//+------------------------------------------------------------------+
void OnStart() 
  {
  
   // Create the file
   int file = FileOpen(Export_FileName, FILE_WRITE|FILE_CSV|FILE_ANSI, ',');
   
   if (file != INVALID_HANDLE)
     {
      // Write the heading of data
      
      string row="";
      for (int i=0; i<=5; i++)
        {
         if (StringLen(row)) row += ",";
         row += "Open"+i+",High"+i+",Low"+i+",Close"+i;
        }
      FileWrite(file, row);
      
      // Copy all required information from the history
      
      MqlRates rates[], rate;
      int count = Export_Bars + 5;
      if (CopyRates(Symbol(), Period(), 1, count, rates) < count)
        {
         Print("Error! Not enough history for exporting of data.");
         return;
        }
      ArraySetAsSeries(rates, true);
      
      // Write data      
      
      for (int bar=0; bar<Export_Bars; bar++)
        {
         row="";
         double zlevel=0;
         for (int i=0; i<=5; i++)
           {
            if (StringLen(row)) row += ",";
            rate = rates[bar+i];
            if (i==0) zlevel = rate.open; // level for counting of prices
            row += NormalizeDouble(rate.open -zlevel, Digits()) + ","
                 + NormalizeDouble(rate.high -zlevel, Digits()) + ","
                 + NormalizeDouble(rate.low  -zlevel, Digits()) + ","
                 + NormalizeDouble(rate.close-zlevel, Digits());
           }
         FileWrite(file, row);
        }

      FileClose(file);
      Print("Export of data finished successfully.");
     }
   else Print("Error! Failed to create the file for data export. ", GetLastError());
  }
//+------------------------------------------------------------------+

데이터를 내보낸 후 data.csv 파일을 얻습니다. 첫 번째 줄(예:)은 다음과 같습니다.

Open0,High0,Low0,Close0,Open1,High1,Low1,Close1,Open2,High2,Low2,Close2,Open3,High3,Low3,Close3,Open4,High4,Low4,Close4,Open5,High5,Low5,Close5
0,0.00463,-0.0041,0.00274,-0.00518,0.00182,-0.00721,-6e-005,0.00561,0.00749,-0.00413,-0.00402,0.02038,0.02242,0.00377,0.00565,0.03642,0.0379,0.01798,0.02028,0.0405,0.04873,0.03462,0.03647
0,0.007,-0.00203,0.00512,0.01079,0.01267,0.00105,0.00116,0.02556,0.0276,0.00895,0.01083,0.0416,0.04308,0.02316,0.02546,0.04568,0.05391,0.0398,0.04165,0.04504,0.05006,0.03562,0.0456
0,0.00188,-0.00974,-0.00963,0.01477,0.01681,-0.00184,4e-005,0.03081,0.03229,0.01237,0.01467,0.03489,0.04312,0.02901,0.03086,0.03425,0.03927,0.02483,0.03481,0.02883,0.04205,0.02845,0.03809

이것은 NeuroSolutions에서 이해할 수 있는 형식입니다. 이제 네트 생성 및 훈련을 시작할 수 있습니다.


뉴로넷 (Neuronet) 만들기

NeuroSolutions에서는 이 프로그램을 처음 보고 뉴로넷 (Neuronet)에 대해 거의 알지 못하더라도 빠르게 뉴로넷 (Neuronet)을 생성할 수 있습니다. 이를 수행하려면 프로그램 시작 시 초보자용 마법사 NeuralExpert(초보자)를 선택하십시오.

여기에는 뉴로넷 (Neuronet)이 해결해야 하는 문제 유형을 지정해야 합니다.

그런 다음 이전 장에서 만든 훈련 정보가 있는 파일을 지정합니다.

net의 입력으로 0 바의 필드를 제외한 파일의 모든 필드를 선택하십시오.

텍스트 필드가 없으므로 아무 것도 선택하지 마십시오.

정보가 포함된 파일을 다시 지정합니다.

우리 네트의 출력을 하나만 선택하십시오.

마법사는 기본적으로 가장 단순한 네트를 생성할 것을 제안합니다. 그렇게 합시다::

마법사는 우리를 위한 뉴로넷 (Neuronet) 생성 작업을 완료했습니다(훈련된 네트워크가 아니라 단순한 구조).

이제 작업할 수 있습니다. 우리는 그것을 훈련하고 테스트하고 데이터 분석에 사용할 수 있습니다.

테스트 버튼을 클릭하면 훈련되지 않은 네트가 문제를 어떻게 해결할 수 있는지 확인할 수 있습니다. 테스트 마법사의 질문에 답하십시오.

동일한 파일의 정보를 기반으로 테스트를 수행합니다.

테스트가 끝났습니다. "Output vs. Desired Plot" 창에서 우리의 기록에 있는 net에서 얻은 값(빨간색)과 실제 값(파란색)을 보여주는 차트를 볼 수 있습니다. 다음과 같이 상당히 다르다는 것을 알 수 있습니다.

이제 그물을 훈련시켜 봅시다. 이를 수행하려면 메뉴 아래의 도구 모음에서 녹색 버튼 시작을 클릭하십시오. 몇 초 후에 교육이 완료되고 차트가 변경됩니다.


이제 차트에서 그물이 사실처럼 보이는 결과를 보여주고 있음을 알 수 있습니다. 따라서 거래에 사용할 수 있습니다. WeekPattern이라는 이름으로 네트를 저장합니다.


DLL에서 뉴로넷 (Neuronet) 내보내기

NeuroSolutions를 종료하지 않고 Custom Solution Wizard를 시작하는 CSW 버튼을 클릭하십시오. 현재 뉴로넷 (Neuronet)에서 DLL을 생성해야 합니다.

마법사는 다른 프로그램에 대한 DLL을 생성할 수 있습니다. 내가 아는 한 DLL을 컴파일하려면 5.0/6.0/7.0(.NET 2002)/7.1(.NET 2003)/8.0(.NET 2005) 버전 중 하나의 Visual C++가 필요합니다. 어떤 이유로 Express 버전을 사용하지 않습니다(확인했습니다).

대상 응용 프로그램 목록에 MetaTrader가 없습니다. 이것이 Visual C++를 선택하는 이유입니다.

결과를 저장하는 경로:

모든 것이 성공적으로 통과되면 마법사는 다음에 대해 알려줍니다.

마법사에서 지정한 폴더에 많은 파일이 나타납니다. 우리에게 가장 필요한 것은 다음과 같습니다. WeekPattern.dll, 여기에는 프로그램 인터페이스가 있는 뉴로넷 (Neuronet)과 훈련 후 뉴로넷 (Neuronet)의 균형 설정을 포함하는 WeekPattern.nsw 파일이 포함되어 있습니다. 다른 파일 중에서 이 DLL-뉴로넷 (Neuronet)으로 작업하는 예가 있는 파일을 찾을 수 있습니다. 이 경우 Visual C++ 6 프로젝트입니다.


DLL-Neuronet을 MetaTrader에 연결하기

이전 장에서 만든 DLL-neuronet은 Visual C++ 프로젝트에서 사용하기 위한 것입니다. MQL5에서는 설명하기 어렵거나 불가능한 복잡한 구조의 객체로 작동합니다. 이것이 바로 이 DLL을 MetaTrader에 직접 연결하지 않는 이유입니다. 그 대신 우리는 작은 DLL 어댑터를 만들 것입니다. 이 어댑터에는 뉴로넷 (Neuronet) 작업을 위한 하나의 간단한 기능이 포함되어 있습니다. 네트워크를 생성하고 입력 정보를 전달하고 출력 데이터를 반환합니다.

이 어댑터는 MetaTrader 5에서 쉽게 호출됩니다. 그리고 어댑터는 NeuroSolutions에서 생성된 DLL-Neuronet에 연결됩니다. 어댑터는 Visual C++로 작성되므로 이 DLL의 개체에는 문제가 없습니다.




DLL 어댑터를 직접 만들 필요가 없습니다. 기성품 DLL이 이 문서에 첨부되어 있습니다. 어댑터는 NeuroSolutions에서 생성된 모든 DLL-Neuronet과 함께 작동합니다. 이 장의 추가 읽기를 건너뛸 수 있습니다.

그러나 C++ 프로그래밍 경험이 있고 그러한 어댑터를 만드는 방법에 관심이 있다면 이 장을 끝까지 읽으십시오. 아마도 DLL-Neuronet에서 일부 다른 기능을 내보낼 수 있기 때문에 이를 개선하는 데 관심이 있을 것입니다. 예를 들어, 교육 기능(Expert Advisor의 경우 변화하는 시장에 적응하여 네트워크를 자동으로 재교육함). 이전 장에서 설명한 Custom Solution Wizard에서 생성된 예제를 분석하여 전체 기능 목록을 학습할 수 있습니다.

해당 예제에서 몇 개의 파일만 필요합니다.

Visual C++(Custom Solution Wizard에서 사용된 것과 동일한 버전)에서 NeuroSolutionsAdapter라는 빈 DLL 프로젝트를 만들고 예제에서 NSNetwork.h, NSNetwork.cpp 및 StdAfx.h 파일을 복사합니다. 또한 빈 main.cpp 파일을 만듭니다.


main.cpp 파일에 다음 코드를 작성합니다.

#include "stdafx.h"
#include "NSNetwork.h"

extern "C" __declspec(dllexport) int __stdcall CalcNeuralNet(
                LPCWSTR dllPath_u, LPCWSTR weightsPath_u,
                double* inputs, double* outputs)
{       
    // Transform the lines from Unicode to normal ones
    CString dllPath     (dllPath_u);
    CString weightsPath (weightsPath_u);

    // Create neuronet
    NSRecallNetwork nn(dllPath);
    if (!nn.IsLoaded()) return (1);

    // Load balances
    if (nn.LoadWeights(weightsPath) != 0) return (2);
        
    // Pass input data and calculate the output
    if (nn.GetResponse(1, inputs, outputs) != 0) return (3);

    return 0;
}

빌드. DLL 어댑터가 준비되었습니다!


Expert Advisor에서 Neuronet 사용하기

글쎄, 우리는 이미 여러 파일을 만들었습니다. Expert Advisor가 작동하는 데 필요한 파일과 파일을 넣어야 하는 폴더를 나열하겠습니다. 해당 파일은 모두 글에 첨부되어 있습니다.

파일
기술
넣을 위치(터미널 ​​폴더)
WeekPattern.dll
NeuroSolutions에서 만든 DLL-Neuronet
MQL5\Files\NeuroSolutions\
WeekPattern.nsw우리 신경망의 균형 설정
MQL5\Files\NeuroSolutions\
NeuroSolutionsAdapter.dll
모든 DLL-Neuronet을 위한 범용 DLL-adapter
MQL5\Libraries\


다음은 Expert AdvisorWeekPattern.mq5의 전체 코드입니다. 검색 및 추가 수정의 편의를 위해 뉴로넷 (Neuronet)과 관련된 모든 사항은 별도의 클래스 CNeuroSolutionsNeuralNet에 배치됩니다.

input double    Lots = 0.1;
//+------------------------------------------------------------------+
// Connect the DLL adapter, using which we are going to use the DLL neuronet created in NeuroSolutions
#import "NeuroSolutionsAdapter.dll"
int CalcNeuralNet(string dllPath, string weightsPath, double& inputs[], double& outputs[]);
#import 
//+------------------------------------------------------------------+
class CNeuroSolutionsNeuralNet
{
private:
   string dllPath;     // Path to a DLL neuronet created in NeuroSolutions
   string weightsPath; // Path to a file of the neuronet balances
public:
   double in[20]; // Neuronet inputs - OHLC of 5 bars
   double out[1]; // Neuronet outputs - Close of a current bar

   CNeuroSolutionsNeuralNet();
   bool Calc();
};
//+------------------------------------------------------------------+
void CNeuroSolutionsNeuralNet::CNeuroSolutionsNeuralNet()
{
   string terminal = TerminalInfoString(TERMINAL_PATH);
   dllPath     = terminal + "\\MQL5\\Files\\NeuroSolutions\\WeekPattern.dll";
   weightsPath = terminal + "\\MQL5\\Files\\NeuroSolutions\\WeekPattern.nsw";
}
//+------------------------------------------------------------------+
bool CNeuroSolutionsNeuralNet::Calc()
  {
   // Get current quotes for the neuronet
   MqlRates rates[], rate;
   CopyRates(Symbol(), Period(), 0, 6, rates);
   ArraySetAsSeries(rates, true);
      
   // Fill the array of input data of the neuronet
   double zlevel=0;   
   for (int bar=0; bar<=5; bar++)
     {
      rate = rates[bar];
      // 0 bar is not taken for input
      if (bar==0) zlevel=rate.open; // level of price calculation
      // 1-5 bars are inputed
      else
        {
         int i=(bar-1)*4; // input number
         in[i  ] = rate.open -zlevel;
         in[i+1] = rate.high -zlevel;
         in[i+2] = rate.low  -zlevel;
         in[i+3] = rate.close-zlevel;
        }
     }
 
   // Calculate the neuronet in the NeuroSolutions DLL (though the DLL adapter)
   int res = CalcNeuralNet(dllPath, weightsPath, in, out);
   switch (res)
     {
      case 1: Print("Error of creating neuronet from DLL \"", dllPath, "\""); return (false);
      case 2: Print("Error of loading balances to neuronet from the file \"", weightsPath, "\""); return (false);
      case 3: Print("Error of calculation of neuronet");  return (false);
     }
     
   // Output of the neuronet has appeared in the array out, you shouldn't do anything with it

   return (true);
  }
//+------------------------------------------------------------------+

CNeuroSolutionsNeuralNet NN;
double Prognoze;

//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
void OnTick() 
  {
   // Get the price prediction from the neuronet
   if (NN.Calc()) Prognoze = NN.out[0];
   else           Prognoze = 0;

   // Perform necessary trade actions
   Trade();
  }
//+------------------------------------------------------------------+
void Trade() 
  {

   // Close an open position if it is opposite to the prediction

   if(PositionSelect(_Symbol)) 
     {
      long type=PositionGetInteger(POSITION_TYPE);
      bool close=false;
      if((type == POSITION_TYPE_BUY)  && (Prognoze <= 0)) close = true;
      if((type == POSITION_TYPE_SELL) && (Prognoze >= 0)) close = true;
      if(close) 
        {
         CTrade trade;
         trade.PositionClose(_Symbol);
        }
     }

   // If there is no positions, open one according to the prediction

   if((Prognoze!=0) && (!PositionSelect(_Symbol))) 
     {
      CTrade trade;
      if(Prognoze > 0) trade.Buy (Lots);
      if(Prognoze < 0) trade.Sell(Lots);
     }
  }
//+------------------------------------------------------------------+


뉴로넷 (Neuronet)이 제대로 연결되었는지 확인하는 좋은 방법은 뉴로넷 (Neuronet) 훈련에 사용한 것과 같은 시간에 전략 테스터에서 Expert Advisor를 실행하는 것입니다.

글쎄요, 경험 많은 거래자들이 말했듯이, 뉴로넷 (Neuronet)은 그 기간 동안 "어댑터"가 됩니다. 따라서 이 특정 기간에 지배적인 정확한 데이터 패턴에 대한 이익 신호를 인식하고 알리도록 훈련되었습니다. 이러한 기간 동안 그려진 Expert Advisor의 수익성 그래프는 오름차순이어야 합니다.

확인해 봅시다. 우리의 경우 다음과 같은 아름다운 차트가 될 것입니다.


모든 것이 올바르게 연결되었음을 의미합니다.

그리고 통계를 위해 다음은 Expert Advisor 테스트에 대한 다른 보고서입니다.




만일을 대비하여 트레이딩 전략과 뉴로넷 (Neuronet)의 초보 개발자를 위해 설명하겠습니다.

최적화(뉴로넷 교육)에 사용된 기간 동안 Expert Advisor의 수익성은 EA의 총 수익성에 대해 말해주지 않습니다. 즉, 다른 기간의 수익성을 보장하지 않습니다. 다른 지배적인 패턴이 있을 수 있습니다.

교육 기간 뒤에도 수익성을 유지하는 트레이딩 전략을 수립하는 것은 복잡하고도 복잡한 작업입니다. 이 문제를 해결하기 위해 NeuroSolutions나 다른 뉴로넷 (Neuronet) 애플리케이션에 의존해서는 안 됩니다. 이는 데이터에 대한 뉴로넷 (Neuronet)만 생성합니다.

이것이 제가 얻은 Expert Advisor의 전방 테스트 결과를 여기에 제공하지 않은 이유입니다. 수익성 있는 트레이딩 전략을 수립하는 것은 이 글의 목적이 아닙니다. 목표는 뉴로넷 (Neuronet)을 Expert Advisor에 연결하는 방법을 알려주는 것입니다.


결론

이제 거래자는 자동 거래 분석 및 거래를 위한 강력하고 쉬운 또 다른 도구를 갖게 되었습니다. 뉴로넷 (Neuronet)의 원리와 가능성, 훈련 규칙에 대한 깊은 이해와 함께 사용하면 수익성 있는 Expert Advisor를 만드는 길을 따라갈 수 있습니다.


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

파일 첨부됨 |
dll_nsw.zip (383.37 KB)
weekpattern.mq5 (3.78 KB)
움직이는 Mini-Max: MQL5의 기술적 분석 및 구현을 위한 새로운 지표 움직이는 Mini-Max: MQL5의 기술적 분석 및 구현을 위한 새로운 지표
다음 글에서는 Z.G.Silagadze의 논문 'Moving Mini-max: 기술 분석을 위한 새로운 지표'를 기반으로 Moving Mini-Max 지표를 구현하는 과정을 설명합니다. 지표의 아이디어는 알파 붕괴 이론에서 G. Gamov가 제안한 양자 터널링 현상의 시뮬레이션을 기반으로 합니다.
MetaTrader 5의 다중 통화 모드 구현 MetaTrader 5의 다중 통화 모드 구현
오랫동안 다중 통화 분석 및 다중 통화 거래는 많은 사람들의 관심을 불러일으켜왔습니다. 완전한 다중 통화 체제를 구현할 수 있는 기회는 MetaTrader 5 및 MQL5 프로그래밍 언어의 공개 릴리스에서만 가능했습니다. 이 글에서는 여러 기호에 대해 들어오는 모든 틱을 분석하고 처리하는 방법을 제안합니다. 예를 들어 USDx 달러 인덱스의 다중 통화 RSI 지표를 살펴보겠습니다.
거래 내역을 기반으로 한 거래 플레이어 거래 내역을 기반으로 한 거래 플레이어
트레이딩 플레이어. 설명이 필요없는 딱 네 단어. 버튼이 있는 작은 상자에 대한 생각이 떠오릅니다. 버튼 하나 누르기 - 재생, 레버 이동 - 재생 속도가 변경됩니다. 실제로는 꽤 비슷합니다. 이 글에서는 거의 실시간으로 트레이딩 히스토리를 재생하는 제 발전을 보여주고 싶습니다. 이 글에서는 지표 작업 및 차트 관리, OOP의 일부 뉘앙스를 다룹니다.
MQL5 마법사: 미결 포지션의 후행 모듈을 만드는 방법 MQL5 마법사: 미결 포지션의 후행 모듈을 만드는 방법
거래 전략 생성기 MQL5 Wizard는 거래 아이디어 테스트를 크게 단순화합니다. 이 글에서는 거래 시 가격이 포지션 방향으로 이동할 때 손절매 수준을 무손실 영역으로 이동하여 오픈 포지션을 관리하는 MQL5 Wizard 자신의 클래스를 작성하고 거래 전략 생성기에 연결하여 이익 감소 드로다운을 보호할 수 있는 방법에 대해 설명합니다. 또한 MQL5 마법사에 대해 생성된 클래스 설명의 구조 및 형식에 대해서도 알려줍니다.