English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
Connecting NeuroSolutions Neuronets

Connecting NeuroSolutions Neuronets

MetaTrader 5統合 | 14 10月 2015, 15:18
509 0
ds2
ds2

はじめに

ニューロネットをご存じのトレーダーの方はすべてマーケット分析でそれを使えばどんなにすばらしいだろうとお考えだろうと思います。都合よくあらゆる構成の自前のネットワークを作成し、それらに教えビジュアルモードで検証できることを可能にするプログラムは数多くあります。クライアント端末からニューロネットプログラムに必要な情報をエクスポートし、そこで分析することができるのです。

しかし、作成したニューロネットを自動トレーディングで使いたい場合どうしますか?ニューロネットに連携した Expert Advisorを作成し、リアルタイムモデルでトレードするのは可能でしょうか?

可能なんですよ。数種のニューロネットプログラムが要求されるプログラムインターフェースを備えています。そのひとつがNeuroSolutionsと呼ばれるものです。最新バージョン6は、みなさんがお持ちとは限りませんし、今最も人気のバージョンは、バージョン5です。そのため、本稿はバージョン5と連携してお話していきます。そこで必要なのがプログラムのフルの配布版です。そこに必要とする「ソリューションウィザード」が含まれています。


戦略について考えます。

ここでの検証例用戦略は簡単なものです。それを WeekPatternとしましょう。それは、ニューロネットを使用し D1 時間枠の開始バーの終値を予測します。取得された情報により、「売り」または「買い」ディールをマークし、またそれを一日中保持します。価格予測は5本の前回バーの OHLC 価格に基づきます。ニューロネットを処理の精度を高めるために、価格そのものに代えて現在バー(ゼロ)の始値に相対的に変化する唯一の価格を送信します。


トレーニング用データ準備

ネット作成前に、MQL5 スクリプトを書きます。それはクライアント端末からの全クオートを要求される形式でエクスポートします。この情報はニューロネットをトレーニングするのに要求されます。データはテキストファイルにエクスポートされます。リストフィールドはファイルの最初のリストでコンマで区切られて名前をつけます。次の行はコンマ区切りのデータです。それぞれの行はニューロネットのインプットおよびアウトプットの組み合せです。今回の場合、スクリプトは各行の価格履歴バーが1本うしろに移動し、表にバー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!データエクスポート用ファイル作成失敗", 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で理解可能なフォーマットです。これからネットを作成しトレーニングします。


ニューロネット作成

NeuroSolutions では、速くニューロネット作成が行えます。このプログラムを見るのが初めてで、ニューロネットについてほとんど知識がなかったとしても、です。それを行うには、プログラムの冒頭で初心者用ウィザードNeuralExpert (Beginner) を選択します。

そこでニューロネットによって解決すべき問題タイプを指定します。

そして、トレーニング情報を持つファイルを指定します。それは前章で作成したものです。

ネットのインプットで、ゼロバー以外、ファイルの全フィールドを選択します。

テキストフィールドは持たないので、なにも選択しません。

情報と共にわれわれのフィールドを再び指定します。

われわれのネットのアウトプットを一つだけ選択します。

ウィザードは初期設定でもっともシンプルなネットを作成するよう提案します。では作成しましょう。

ニューロネットを作成し、ウィザードは作業を終えます。

それではわれわれが作業できます。それをトレーニングし、検証、そしてデータ分析に使用します。

テスト ボタンを押すと、トレーニングされていないネットがどのようにわれわれの問題を解決するか確認することが可能です。検証ウィザードの質問に答えます。

同じファイルからの情報を基に検証を行います。

検証終了です。『アウトプットvs希望のプロット』ウィンドウでは、履歴と実際の値(ブルー)についてネット(赤色)から取得された値が表示されたチャートを確認できます。それらがひじょうに異なるのが判ります。

ではネットのトレーニングそしましょう。それを行うためには、メニューの下にあるツールバーのグリーンのボタン開始 を押します。トレーニングは数秒で終了し、チャートが変化します。

チャートには、ネットが真実だと思われる結果を示しているのがわかります。というわけで、それをトレー二ングに使用できます。ネットを WeekPatternの名前で保存します。


ニューロネットをDLLにエクスポートします。

NeuroSolutionsを出ずに カスタムソリューションウィザードを起動するCSW ボタンを押します。現在のニューロネットからDLL を生成する必要があります。

ウィザードは異なるプログラムのためのDLLを作成可能です。私が理解している限りでは、DLL のコンパイルには以下の内どれからのバージョンのVisual C++が必要です。:5.0/6.0/7.0 (.NET 2002)/7.1 (.NET 2003)/8.0 (.NET 2005). いくつかの理由により、それは Express バージョン(確認済みです)は使用しません。

対象アプリケーションの中にMetaTrader は含まれていません。そのためVisual C++を選択するのです。

結果保存のパス

すべてが通過したら、ウィザードがその旨伝えてくれます。

ファイルはすべてウィザードの指定フォルダに入ります。もっとも必要なのは、WeekPattern.dllで、これにはそれへのプログラムインターフェースを備えたニューロネットが含まれます。またファイル WeekPattern.nsw tはトレーニング後のニューロネットのバランス設定が含まれます。他のファイルの中にはこの DLLニューロネットと連携する例を持つファイルがひとつ認められます。今回の場合、それはIVisual C++ 6 プロジェクトです。


DLLニューロネットのMetaTraderへの連携

前章で作成された DLLニューロネットは Visual C++ プロジェクトで使用するためのものです。それは MQL5 での記載が困難、または不可能な複雑なストレクチャのオブジェクトを処理します。この DLLを MetaTrader に直接連結するのはこの理由によります。その代わりに、小さなDLL アダプタを作成します。このアダプタはニューロネットと連携するための簡単な関数を持ちます。それはネットワークを作成し、インプット情報を渡し、アウトプットデータを返します。

このアダプタは MetaTrader 5から簡単に呼ばれます。そしてアダプタは NeuroSolutions内に作成されたDLLニューロネットに連結します。アダプタは Visual C++で書かれているので、この DLLのオブジェクトとの間で問題になるようなことはありません。

ご自身で DLL アダプタを作成する必要はありませんよ。本稿には既製の DLL が添付されています。そのアダプタは NeuroSolutionsで作成されたどんなDLLニューロネットとも連携します。本章これ以降は読み飛ばしていただいて結構です。

が、C++ 言語でのプログラミング経験がおありで、そのようなアダプタをどのように作成するかご興味がおありなら、この章を最後まで読んでください。おそらく改良にご興味がおありでしょう。なぜならDLLニューロネットからいくつか別の関数がエクスポートすることができるからです。たとえば、トレーニング関数です。(Expert Advisorに対して変動するマーケットに適応させ、自動でトレーニングを行います。)「カスタムソリューションウィザード」(前章で図示)で生成された例を分析することで関数のフルリストを学習可能です。

その例からは数種のファイルが必要なだけです。

Visual C++ (「カスタムソリューションウィザード」で使用されているのと同じもの)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でのニューロネットの使用

すでにファイルは複数種類作成ずみです。Expert Advisor の動作に必要なファイルとファイルを入れるフォルダを挙げます。ここで挙げているファイルはすべて本稿に添付しています。

ファイル 内容 どこに入れるか(ターミナルフォルダ内の)
WeekPattern.dll NeuroSolutionsに作成されたわれわれのDLLニューロネット MQL5\Files\NeuroSolutions\
WeekPattern.nsw われわれのニューロネットのバランス設定 MQL5\Files\NeuroSolutions\
NeuroSolutionsAdapter.dll どんな DLLニューロネットにも対応する汎用DLLアダプタ MQL5\Libraries\

以下はExpert AdvisorWeekPattern.mq5のフルコードです。検索と将来的な変更がしやすいように、ニューロネットに関するものはすべて個別クラス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);
     }
  }
//+------------------------------------------------------------------+

ニューロネットを正しく連携しているか確認するよい方法は、ニューロネットのトレーニングに使用したと同じ期間についてストラテジーテスタExpert Advisor を実行することです。

経験豊かなトレーダーがおっしゃるように、ニューロネットはその期間向けの「アダプタ」です。よってそれは、まさしくこのデータパターンの収益シグナルに関する情報を認識するようトレーニングされています。それはこの特定期間に影響します。その期間に対して描かれた Expert Advisor の収益性グラフは上昇グラフです。

確認します。われわれの場合は、グラフは次のような美しいチャートです。

これはすべてが正しく連結されていることを意味します。

統計としてはExpert Advisorの別の検証レポートがあります。

まんいちに備え、トレーディング戦略およびニューロネットの開発初心者のために説明します。

最適化(ニューロネットのトレーニング)のために使用されたある期間 Expert Advisorの収益性は EA全体の収益性を語るものではありません。言い換えれば、それは他の期間における収益性を保証しない、ということです。別の顕著なバターンがあります。

トレーニング期間以降収益性を確保するトレーディング戦略の作成は複雑なタスクです。euroSolutions またはその他あらゆるニューロネットアプリケーションをたよりにしてこの問題を解決するのは不可能です。それはみなさんのデータにたいしてニューロネットを作成するだけなのです。

私がここで取得したExpert Advisorのフォワード検証結果を提示しなかったのはこのためです。収益性のあるトレーディング戦略作成は本稿の狙いではありません。ここでの目標はExpert Advisorにニューロネットを連携することです。


おわりに

今や、トレーダーは自動トレーディング分析とトレーニングに使用する力強く簡単なツールを持っています。原理の深い知識やニューロネットの可能性、トレーニングルールとともにそれを使うことで、収益性のある Expert Advisors作成の道を進んでいくことができるでしょう。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/236

添付されたファイル |
dll_nsw.zip (383.37 KB)
weekpattern.mq5 (3.78 KB)
移動ミニマックス法:テクニカル分析用新インディケータと MQL5への実装実装 移動ミニマックス法:テクニカル分析用新インディケータと MQL5への実装実装
本稿ではZ.G.Silagadze氏による論文 'Moving Mini-max: a new indicator for technical analysis'を基にした移動ミニマックス インディケータの実装手順について述べます。このインディケータの考え方は、G. Gamov 氏のα 崩壊で提案される量子トンネル現象を基にしています。
MetaTrader 5のマルチ通貨モードの実行 MetaTrader 5のマルチ通貨モードの実行
長い間、マルチ通貨分析やマルチ通貨トレーディングは人々の関心の的でした。完全なマルチ通貨システムを達成する機会は、MetaTrader5とMQL5プログラミング言語のリリースによりようやく可能になりました。この記事では、複数のシンボルにおけるすべてのティックを処理し分析する方法を紹介します。例として、USDドルインデックスのマルチ通貨RSIインジケーターを見てみます。
取引き履歴に基づくトレーディングのプレーヤー 取引き履歴に基づくトレーディングのプレーヤー
トレーディングのプレーヤーたったこれだけの短い言葉です。説明は必要ありませんね。ボタンのある小さな箱が心に浮かびます。ボタンを1つ押すと再現します。レバーを動かすと再現スピードが変化します。それとても似ています。本稿では、ほとんどリアルタイムでトレード履歴を再現するプログラムを紹介したいと思います。本稿はOOPの意味、インディケータとの連携、チャート管理についてもいくらか取り上げます。
MQL5 ウィザード:オープンポジションのトレーリングモジュール作成方法 MQL5 ウィザード:オープンポジションのトレーリングモジュール作成方法
MQL5ウィザードのトレーディング戦略ジェネレータはトレーディングの考え方を検証することをひじょうに簡素化します。本稿では、MQL5 ウィザードでトレーディング戦略を書く方法、ジェネレータを、価格がポジション方向に行くときストップロスを無損失ゼロレベルへ移動させることでトレーディングの際減益ドローダウンを守ることのできるオープンポジションを管理する独自のクラスと連携させる方法について述べます。MQL5 ウィザード用に作成されたクラスのストラクチャおよび記述フォーマットについても述べます。