English Русский 中文 Español Deutsch Português
MetaTrader5 での MATLAB 2018 計算関数の使用

MetaTrader5 での MATLAB 2018 計算関数の使用

MetaTrader 5 | 13 5月 2019, 11:38
836 0
Roman Korotchenko
Roman Korotchenko

イントロダクション

この記事では、Emelyanov による「MetaTrader4 と MATLAB」の記事の開発について説明し、ユーザーが利用するすべてのプラットフォームの最新の64ビットバージョンについて、同様のタスクを解決するための情報を提供します。 過去にわたって、共有DLLライブラリを生成するためのメソッドは継続的にMATLABパッケージにおいてアップグレードされてきました。 したがって、元の記事で説明されているメソッドは変更が必要です。 これは、MATLABコンパイラSDK または MATLAB コーダーがMATLABコンパイルに代わって使用されるために起こります。 さらに、MATLABで動的メモリを操作するメソッドが変更されており、 MATLAB 言語で書かれたライブラリをアドレス指定するソースコードの特定の調整が必要です。 

この記事の名前は、ここでのタスクがMQL5 プログラムと MATLAB の計算能力をマージする開発者のタスクを促進することを目的としていると述べています。 このため、この記事では、価格時系列のシーズナル自己回帰統合移動平均 (SARIMA) モデルに基づく予測インジケータを作成する例を使用して、適切なモデルを選択してデータを推定するタスクを配置します。 

MATLAB 2018 環境の計算能力を MQL5 に接続するメソッドの詳細を説明するために、この記事では MATLAB コンパイラ SDK に焦点を当て、MATLAB ライブラリと MQL5 をペアリングするための Visual C++ のアダプタライブラリを作成します。 プログラムを作成するためのクイックガイドを受信し、途中でよくあるミスを避けます。 

Emelyanov によって記事の第1章で説明されているシンプルで複雑なデータ型は変更されません。 定性的に述べられたマテリアルを複製しないようにするために、そこに提示された説明を自分で理解しておくことをお勧めします。 MATLAB 環境から共有 C++ ライブラリを作成する段階で差が生じます。 

この記事では、次のスキームに従ってマテリアルを提示します。

  1. 自己回帰統合移動平均モデルに基づくカルマンフィルタリングとデータ予測を含む C++ 共有ライブラリは、このインジケータの PREPREPARED の MATLAB モジュールのセットを使用して作成されます。 
  2. この計算モジュールは MQL5 プログラムに含まれています。 これを行うために、中間ライブラリがさらに作成され、MQL5 間でデータを転送する問題 (C/C++ スタイルで構成されるメモリ) と MATLAB (メモリをマトリクス形式で編成したもの) を解決します。
  3. 予測モデルが記述され、作成されたインジケータに埋め込まれると、そのパフォーマンスが示されます。

1. MATLAB コンパイラ SDK を使用して MATLAB 関数から共有 C++ ライブラリを作成

2015年に、MATLAB で.dll ライブラリを作成するステップは変更されています。 MQL5 プログラムとの統合に関しては、この問題は MATLAB コンパイラがライブラリを作成するためのものではなくなり、自律実行可能ファイルの生成に向けられるようになりました。 2015年以降、DLL ライブラリを作成するための関数が MATLAB コンパイラ SDK に転送されました。 MATLAB コンパイラ SDK は MATLAB コンパイラの関数を拡張し、MATLAB プログラムから C/C++ 共有ライブラリ、Microsoft.NET アセンブリ、Java クラスを作成できるようにしました。

以前と同様に、MATLAB コンパイラ SDK パッケージのプログラムコンポーネントを使用して作成されたアプリケーションは、MATLAB を必要としないユーザーの間で無償で再配布できます。 これらのアプリケーションは、MATLAB ランタイムと、コンパイル済みアプリケーションまたは MATLAB コンポーネントを使用する共有ライブラリのセットを使用します。

MATLAB コンパイラー・アプリケーションに以前に割り当てられていたタスクが、ライブラリー・コンパイラー・プログラムに割り当てられます。 完全な状態を提供するために、MATLAB 環境から C/C++ 共有ライブラリを作成するステップを考えてみましょう。 この記事に添付されている ZIP アーカイブには、ライブラリの作成に使用した、m 拡張子のファイルがあります。 MATLAB では、ライブラリコンパイラアプリケーションが起動され (APPS タブで)、LibSARIMA プロジェクトが開かれ、下図に示すような構造が形成されます。

図1. ライブラリコンパイラインターフェイス

図1. ライブラリコンパイラインターフェイス。

 

ここでは、図1で強調されている位置に、線と数字1-4 で注意を払うことが重要です。 

  1. C++ 標準の共有ライブラリが作成されます。
  2. 他の関数はエクスポートされず、外部プログラムへのアクセスは与えられませんが、ForecastSARIMA で示された関数はエクスポートされます。
  3. 標準インタフェースでリンクするファイルが生成されます (matlabsarima.dll、matlabsarima.h、matlabsarima.lib)。 
  4. MATLAB マトリックスアクセスインターフェイスは、 mwArray構造体を介して使用します。

「Package 」ボタンを押すと、ライブラリが生成されます。 インターネットから MATLAB エンジンをダウンロードするように、ユーザーにリクエストするライブラリ生成モードを選択することも、必要な MATLAB エンジンコンポーネントをパッケージコンテンツにインクルードすることもできます。 

この段階では、SARIMA モデルと予測を構築し、時系列をフィルタリングするためのプログラムを含むライブラリが作成されます。 アーカイブ MatlabSArima.zip には、一連のソースコードとその結果のライブラリビルドが用意されています。

2. Microsoft Visual C++ で中間ライブラリを作成する

メインライブラリが作成されたら、次のタスクは、それに接続し、データを渡し、計算後に結果を収集することです。 これには、(C/C + + スタイルで編成されたメモリを使用した) MQL5 間のデータ変換を提供するアダプターライブラリの作成と、MATLAB (メモリをマトリクス形式で編成したもの) があります。

MATLABx64 の新しいバージョンでは、Visual C++ コンパイラは主要なもの1つであり、必要なすべてのソフトウェアが準備されています。 したがって、補助アダプターライブラリを準備する最も高速で最も便利で信頼性の高いメソッドは、Studio 2017 で Visual C++ を使用することです。

 

MetaTrader5 および MATLAB 2018 インタラクション

図2. アダプタDLLを経由したMetaTrader5とMATLAB2018のインタラクションのダイアグラム

2017の重要なイノベーションとして、パッケージ化された関数を C++ アプリケーションに組み込むことを可能にする、MATLAB へのMWARRAY APIなどの構造の導入がありました。 以前使用したmxArrayは、新しいマトリクスインターフェイスにアップグレードされました。 共有ライブラリ ( MATLAB DATA APIインターフェイス) を統合するためのもう1つのオプションがありますが、この場合は意味はありません。

データ用のアダプターの書き込みを開始するには、オペレーティング・システムで3つのシステム環境変数を準備して登録することが望ましいです。 たとえば、"システムプロパティ " を使用してエクスプローラを実行すると、 "高度なシステム設定 " と "環境変数 " に進むことができます。

  1. 最初の変数— MATLAB_2018は、MATLABまたはMATLAB Runtimeがインストールされているディレクトリを指していなければなりません; 
  2. 2番目の変数— MATLAB_2018_LIB64は外部ライブラリを含むディレクトリを指している必要があります: <MATLAB_2018>externlibwin64;
  3. 3番目の変数— MATLIB_USERは、元のライブラリが配置されるディレクトリを指している必要があります。 元のユーザー・ライブラリーの検索の問題を解決するために、このディレクトリーをシステム変数 "Path" に追加する必要もあります。  

2.1 ビジュアルスタジオ2017でのアダプターの作成

Visual Studio 2017 でダイナミックリンクライブラリのプロジェクトを作成した後、プロパティを設定する必要があります。 どのプロパティを制御する必要があるかを明確にするために、次にアセンブリプロジェクトの構成を容易にする数値を示します。

アダプタプロジェクトオプション #0

図3. 変更が必要なプロパティページ (A、B、C、D、E)

アダプタ SArima オプション #1

図4. 必要なプロジェクトファイルを検索するディレクトリ

図4では、 "ライブラリディレクトリ " というラベルの付いたフィールドに$ (MatLib_User)ディレクトリが追加されています。 このディレクトリは、Visual C/C + + でのプログラミングと MetaTrader5 での計算の両方に必要な汎用ライブラリを配置するのに便利です。 この場合、 matlabsarima.lib および matlabsarima.dll です。

マクロページ

図5. プリプロセッサ定義の設定


呼び出し規則

図6. MQL5 の要件に従った呼び出し規則

追加の依存関係 (*. lib)

図7. 追加の依存関係の指定 (* lib)

プロジェクト設定で必要な変更の一覧を次に示します。

  1. 必要なヘッダファイルを持つディレクトリを指定します。
  2. 必要なライブラリファイルを持つディレクトリを指定します。
  3. プリプロセッサ定義を設定します—マクロ、その関数は以下に考慮されます。
  4. タスクに必要な特定のライブラリ (MATLAB で準備) を指定します。

MATLAB を使用して生成された2つのファイル: matlabsarima.lib および matlabsarima.dll は、システム変数に $ (MATLIB_USER) としてマークされた共有ディレクトリに配置する必要があります。 ファイル matlabsarima.h は、プロジェクトがアセンブルされたディレクトリに配置する必要があります。 これはプロジェクトの "ヘッダファイル " に含まれている必要があります。

アダプタを組み立てるには、ファイルを作成する必要がありますが、そのうちの2つは検討する価値があります。

1. AdapterSArima ファイル 

#pragma once
#ifdef ADAPTERSARIMA_EXPORTS
#define _DLLAPI extern "C" __declspec(dllexport)  //この定義は、DLL と LIB ライブラリをペアリングするために必要です
#else
#define _DLLAPI extern "C" __declspec(dllimport)  //この定義は、DLL ライブラリをバインドするために必要です。
#endif
_DLLAPI int prepareSARIMA(void);
_DLLAPI int goSarima(double *Res, double *DataArray, int idx0, int nLoad, int iSeasonPriod = 28, int npredict = 25, int filterOn = 1, int PlotOn = 0);
_DLLAPI void closeSARIMA(void);

AdapterSArima ファイルは、設定で指定されたマクロを使用して、 prepareSARIMA()、closeSARIMA()、および goSarima (. ..) が外部プログラムとのバンドルに使用できることを示します。

2. GoSArima.cpp ファイル

#pragma once
#include "stdafx.h"
#include "matlabsarima.h"
#include "AdapterSArima.h"

bool  SAriMAtarted = false;
bool  MLBEngineStarted = false;

//-----------------------------------------------------------------------------------
_DLLAPI int prepareSARIMA(void)
{
        if (!MLBEngineStarted)
        {
                MLBEngineStarted = mclInitializeApplication(nullptr, 0);
                if (!MLBEngineStarted)
                {
                        std::cerr << "Could not initialize the Matlab Runtime (MCR)" << std::endl;
                        return 0;
                }
        }       
        if (!SAriMAtarted)
        {
                try
                {
                        SAriMAtarted = matlabsarimaInitialize();
                        if (!SAriMAtarted)
                        {
                                std::cerr << "Could not initialize the library properly" << std::endl;
                                return false;
                        }                       
                        return (SAriMAtarted)?1:0;
                }
                catch (const mwException &e)
                {
                        std::cerr << e.what() << std::endl;
                        return -2;
                }
                catch (...)
                {
                        std::cerr << "Unexpected error thrown" << std::endl;
                        return -3;
                }
        }
        return 1;
}
//-----------------------------------------------------------------------------------

_DLLAPI void closeSARIMA(void)
{
        //アプリケーションおよびライブラリーの終了ルーチンの呼び出し 
        //if (SAriMAtarted)
        {
                matlabsarimaTerminate();
                SAriMAtarted = false;
        }
}
//-----------------------------------------------------------------------------------

_DLLAPI int goSarima(double *Res, double *DataSeries, int idx0, int nLoad, int iSeasonPeriod, int npredict, int filterOn, int PlotOn)
{       // 
        //結果のメモリは、インジケータの予測を考慮して、事前に割り当てられなければなりません
        //Res[] 用のメモリを割り当てる必要があります。 Length = nLoad+npredict !!!
        //
        if (!SAriMAtarted)
        {
                SAriMAtarted = (prepareSARIMA() > 0) ? true : false;
        }
        
        mwArray nSeries(1, 1, mxDOUBLE_CLASS), TimeHor(1, 1, mxDOUBLE_CLASS), MAlen(1, 1, mxDOUBLE_CLASS);
        mwArray SeasonLag(1, 1, mxDOUBLE_CLASS), DoPlot(1, 1, mxDOUBLE_CLASS), DoFilter(1, 1, mxDOUBLE_CLASS);

        if (SAriMAtarted)
        {
                try
                {               
                    MAlen  = 20;         //MA 平均化ウィンドウ
                        DoFilter  = (filterOn != 0) ? 1 : 0;
                        TimeHor   = npredict; //予測ポイント
                        SeasonLag = iSeasonPeriod;     //SARIMA モデルの期間
                        
                        DoPlot = PlotOn;    //テストモードでのプロット

                        nSeries = nLoad;    //データフラグメントの長さ nLoad
                                        
                        mwArray Series(nLoad,1, mxDOUBLE_CLASS, mxREAL);
                        mwArray Result; //結果 (フィルタ (指定された場合 filterOn! = 0) データと予測)
                        
                //MATLAB 行列にデータをロードします。
                        Series.SetData(&DataSeries[idx0], nLoad); //フラグメント系列 [idx0: idx + nLoad]
        
                        ForecastBySARIMA(1, Result, nSeries, TimeHor, Series, SeasonLag, DoFilter, MAlen, DoPlot);
                        size_t nres = Result.NumberOfElements();
                        Result.GetData(Res, nres);

                  return 0;
                }
                catch (const mwException& e)
                {
                        std::cerr << e.what() << std::endl;
                        return -2;
                }
                catch (...)
                {
                        std::cerr << "Unexpected error thrown" << std::endl;
                        return -3;
                }               
        }       
        return 0;
}

完全性を期すために、zip アーカイブには AdapterSArima.dll 中間ライブラリをアセンブルするためのすべてのファイルがあります。 必要に応じて、アーカイブを解凍し、 "C:\temp" でアダプタを再構成することをお勧めします。

3. インジケータの作成

3.1 問題の定義と解決メソッド

自己回帰と移動平均モデルは、実際に遭遇した時系列のいくつかを記述するために有用です。 このモデルは、次数qの移動平均と自己回帰のプロセスのフィルタリングされた値の形でローパスフィルタを組み合わせたものです。 モデルが時系列値ではなく、次数dの差を使用する場合 (実際にはdを決定する必要がありますが、ほとんどの場合d ≤ 2) はインプットデータとして、モデルは統合移動平均の自己回帰と呼ばれます。 このようなモデルは、ARIMA (p, d, q) (自己回帰統合移動平均) により、元の系列の非定常性を減らすことができます。

長期変動の影響をシミュレートするには、Seasonal ARIMA と呼ばれる変更があります。 このモデルは、周期的な要因にさらされる時系列に対応します。 株式相場はシーズナル要因の影響を受けるため、モデルにインクルードすることで、インジケータの価格予測を構築するのに適します。 

株式における雑音因子の影響を軽減するために、追加のフィルタリングとエラーからのデータのクリーニングの関数を提供することが望ましいです。 データにノイズが多いほど、処理が難しくなります。 カルマンフィルタは、様々な分野で使用する効果的な再帰的フィルタリングアルゴリズムです。 このアルゴリズムは、予測と調整という2つの繰り返しフェーズで構成されます。 まず、次の時点での状態の予測が計算されます (測定の不正確さを考慮して)。 そして、新しい情報を考慮して、予測値が修正されます (この情報の不正確さとノイズも考慮に入れています)。 

3.2 MQL5 のインジケータプログラム

インジケータに必要な AdapterSArima.dll と matlabsarima.dll ライブラリは、MetaTrader5 タスクディレクトリのライブラリディレクトリに配置する必要があります。

デバッグとテストには特定の仕様があります。 このモードでは、メタエディタ は、<MetaQuotes\Tester\....\Agent-127.0.0.1-300x>の、値が3000、3001、3002などを取る補助ディレクトリからライブラリを起動します。 この例では、AdapterSArima.dll ライブラリが自動的にコピーされますが、matlabsarima.dll はありません。 これをインジケータ操作に影響させないようにするには、matlabsarima.dll ライブラリをシステム検索ディレクトリに配置する必要があります。 このようなディレクトリを $(MATLIB_USER) として指定し、検索パスのシステムリストに指定するか、Windows または WindowsSystem32. にコピーすることをお勧めします。 その後、ライブラリが検出され、接続し、インジケータが起動します。 

考慮されたモデルに従って予測を実装するインジケータプログラムは、ISArimaForecast.mq5 ファイルと添付アーカイブで利用可能です。

//+------------------------------------------------------------------+
//|                                              ISArimaForecast.mq5 |
//|                                                Roman Korotchenko |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Roman Korotchenko"
#property link        "https://login.mql5.com/ru/users/Solitonic"
#property description "This indicator demonstrates forecast by model SARIMA(2,1,2)."
#property description "The program actively uses MATLAB with professionally developed toolboxes and the ability to scale."
#property version   "1.00"
#property indicator_chart_window 

#import "AdapterSArima.dll"
int  prepareSARIMA(void);
int  goSarima(double &Res[],double &DataArray[],int idx0,int nLoad,int iSeasonPeriod,int npredict,int filterOn,int PlotOn);
void closeSARIMA(void);
#import

#property indicator_buffers 2    //----インジケータを計算し、描画するためのバッファ
#property indicator_plots   1    //----グラフィック構造
#property indicator_type1  DRAW_COLOR_LINE   
#property indicator_color1  clrChocolate, clrBlue //clrWhite, clrBlue
#property indicator_width1  3 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum ENUM_TIMERECALC
  {
   TimeRecalc05 = 5,   //5秒
   TimeRecalc10 = 10,  //10秒
   TimeRecalc15 = 15,  //15秒
   TimeRecalc30 = 30,  //30秒
   TimeRecalc60 = 60   //60秒
  };
//---インプットパラメータ
input ENUM_TIMERECALC RefreshPeriod=TimeRecalc30;         //期間の再計算
input int      SegmentLength  = 450; //N: データフラグメント
input int      BackwardShift  = 0;   //後方シフト (テスト)
input int      ForecastPoints = 25;  //予測のポイント
input int      SeasonLag=32;         //SARIMA のシーズンラグ (2, 1, 2)
input bool     DoFilter=true;        //データ系列のカルマンフィルタリングを行う

                                     // input string   _INTERFACE_   = "* INTERFACE *"; 
//input long     magic_numb=19661021777;       // Magic Number 

//---インジケータバッファ
double   DataBuffer[],ColorBuffer[];
//double   LastTrend[],LastData[];

double   wrkResult[],wrkSegment[];
static int wRKLength;

uint CalcCounter;
//
uint calc_data;
uint start_data;    //チャートを作成するための開始時刻
uint now_data;      //現在の時刻

static int libReady=0,ErrorHFRange,ErrorDataLength;
static bool   IsCalcFinished;

//+------------------------------------------------------------------+
//|カスタムインジケータ初期化関数                                         |
//+------------------------------------------------------------------+
static int LengthWithPrediction;

static int PlotOn;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit()
  {
   closeSARIMA();
   Alert("SARIMA.dll - DeInit");
   Print("SARIMA.dll - DeInit");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED))
      Alert("Check the connection permission in the terminal settings DLL!");
   else
     {
      libReady=prepareSARIMA();
      if(libReady<0)
        {
         Alert("Dll DOES NOT CONNECTED!");
         return(INIT_FAILED);
        }

     }

   LengthWithPrediction=SegmentLength+ForecastPoints;
//---インジケータバッファマッピング
   SetIndexBuffer(0,DataBuffer,INDICATOR_DATA);            ArraySetAsSeries(DataBuffer,true);
   SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX);    ArraySetAsSeries(ColorBuffer,true);
// SetIndexBuffer(2,LastTrend,   INDICATOR_CALCULATIONS);   ArraySetAsSeries(LastTrend,true);      //for Expert
// SetIndexBuffer(3,LastData,    INDICATOR_CALCULATIONS);   ArraySetAsSeries(LastData,true);       //for Expert

   PlotIndexSetInteger(0,PLOT_SHIFT,ForecastPoints-BackwardShift);

   wRKLength = ForecastPoints+ SegmentLength; // The number of elements in the array with the results
   ArrayResize(wrkResult,wRKLength,0);        //関数の結果にメモリを割り当てる
   ArrayResize(wrkSegment,SegmentLength,0);   //インプットデータ用にメモリを割り当て

//---   
   string shortname;
   StringConcatenate(shortname,"SARIMA(2,1,2). Season Lag: ",SeasonLag,"  //");
//---DataWindow に表示するラベル
   PlotIndexSetString(0,PLOT_LABEL,shortname);
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);

   now_data  = 0.001*GetTickCount();
   start_data= 0.001*GetTickCount();
   calc_data = 0;

   CalcCounter    = 1;
   IsCalcFinished = true;

   ErrorHFRange   = 0;
   ErrorDataLength= 0;

   PlotOn=0; //MATLAB によって実行される補助図面 (テスト用)

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|カスタムインジケータ繰り返し関数                                             |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                constint prev_calculated、
                constint begin,
                const double &price[]
                )
  {
//---
   int ShiftIdx=rates_total-SegmentLength-BackwardShift; //ワーク・セグメント・データの開始インデックス

   if(ShiftIdx<0)
     {
      if(!ErrorDataLength)
        {
         PrintFormat("SARIMA INDI FAULT: there are not enough data.");
         ErrorDataLength=1;
        }
      return(0);
     }

   ErrorDataLength=0;

//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

   now_data=0.001*GetTickCount();

   if(now_data-calc_data<RefreshPeriod || !IsCalcFinished) //計算が不要または完了していません
     {
      //ReloadBuffers(prev_calculated,rates_total);
      return(prev_calculated);
     }
   if(prev_calculated!=0 && !IsCalcFinished)
     {
      return(prev_calculated);  //新しいデータは、現在の計算が完了したよりも速く来る
     }
//---------------------------------------------------------------------------     

   IsCalcFinished=false; //現在のものが実行されるまで、リクエストを新しい計算にブロックする

   int idx=0,iBnd2=ShiftIdx+SegmentLength;
   for(int icnt=ShiftIdx; icnt<iBnd2; icnt++)
     {
      wrkSegment[idx++]=price[icnt];
     }

   ErrorHFRange=0;
// MATLAB SUBROUTINE   
   goSarima(wrkResult,wrkSegment,0,SegmentLength,SeasonLag,ForecastPoints,DoFilter,PlotOn);

   ReloadBuffers(LengthWithPrediction,rates_total);

   ++CalcCounter;
   IsCalcFinished=true; //新しい計算を作成する準備ができました

   calc_data=0.001*GetTickCount();

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void EmptyBuffers(int n)
  {
   for(int i=0; i<n; i++)
     {
      DataBuffer[i] = EMPTY_VALUE;
      ColorBuffer[i]= EMPTY_VALUE;
     }
  }
//+------------------------------------------------------------------+ 

void ReloadBuffers(int npoint,int ntotal)
  {
   ResetLastError();
   EmptyBuffers(ntotal); //ntotal = rates_total

   if(npoint== 0) return;
   int k=0;//BackwardShift;
   for(int i=0; i<npoint; i++) //npoint = LengthWithPrediction
     {
      if(i>=ntotal) break;
      DataBuffer [k]=wrkResult[LengthWithPrediction-1-i];
      ColorBuffer[k]=(i<ForecastPoints)? 1:0;
      k++;
     }
  }
//=============================================================================

4. インジケータ操作の図

このインジケータのパフォーマンスは、メタトレーダープラットフォームによって提供される EURUSD H1 トレードデータでテストしました。 それほど大きくないデータ・セグメントを選択しました (450ユニット)。 長期間の "シーズナル " は、28、30および32のユニットに等しいラグがテストされました。 32ユニットの期間のラグは、ヒストリーの考慮された期間に最高でした。

さまざまなヒストリーフラグメントの一連の計算が実行されました。 このモデルでは、450ユニットのデータセグメントの長さ、32ユニットのシーズナルラグ、および予測長30ユニットが1回設定され、変更されませんでした。 予測の質を評価するために、異なる断片について得られた結果を実際のデータと比較しました。

以下はインジケータ操作の結果を示す数値です。 すべての図で、チョコレート色は、SARIMA (2, 1, 2) モデルを選択するために使用するフラグメントの完了を示し、その基礎で得られた結果は青色で示されます。

EURUSDH1_450(32)-180

図8. トレードセッション 30.12.2018. カルマンフィルタリングを使用しています。 データに基づいて構築されたモデル180ユニットを過去にシフト


 EURUSDH1_450(32)-170

図9. 日のトレードセッション 30.12.2018. カルマンフィルタリングは使用されません。 データに基づいて構築されたモデル170ユニットを過去にシフト


EURUSDH1_450(32)-140

図10. カルマンフィルタリングを使用しています。 データに基づいて構築されたモデル140単位を過去にシフト


EURUSDH1_450(32)-120

図11. 取引セッション 1.02.2019. カルマンフィルタリングを使用しています。 データに基づいて構築されたモデル120ユニットを過去にシフト


EURUSDH1_450(32)-100

図12. トレードセッション 4.02.2019. カルマンフィルタリングを使用しています。 データに基づいて構築されたモデル100ユニットを過去にシフト


EURUSDH1_450(32)-50

図13. トレードセッション 6.02.2019. カルマンフィルタリングを使用しています。 データに基づいて構築されたモデル50ユニットを過去にシフト 


EURUSDH1_450(32)-20

図14. トレードセッション 7.02.2019. カルマンフィルタリングを使用しています。 データ上に構築されたモデルは過去に20ユニットシフトしました 


EURUSDH1_450(32)-10

図15. トレードセッション 8.02.2019. カルマンフィルタリングを使用しています。 データ上に構築されたモデルを過去に10ユニットシフト

このモデリングの結果は、最初の10-12 ユニットで生成された価格の確率が良好であり、リアルタイムで観測した値と一致していることを示しています。 さらに、興味深いことに、トレーダーがモデルを設定するために必要なのはほんの少しの作業だけです。 このモデルには、最新のヒストリーデータに対して連続したスイープを使用して選択できる2つのパラメータ (セグメント長とシーズナル期間) が必要です。 計算されたロードの残りの部分は MATLAB に送られます。 将来的には、インジケータを改善するメソッドとして、セグメント長とシーズナル期間のパラメータの最適な選択を検討することが可能です。

結論

この記事では、64ビットバージョンの MQL5 および MATLAB 2018 パッケージを使用して、ソフトウェア開発サイクル全体を実演しました。 さらに、Visual C++ 2017 (x64) を使用して、MQL5 (C/c + + スタイルで編成されたメモリを使用) と MATLAB (メモリをマトリックス形式で編成したもの) の間でデータ変換を行うアダプタを作成するメソッドを示しました。 

SARIMA モデルとカルマンフィルタに基づく予測を伴う提示されたインジケータは、計量経済学的用途において MATLAB を使用する可能性を実証するために役立つでしょう。 開発に関して大きな可能性があります。 タスク予測モデルを最適化するために、取得したデータの MATLAB ベースの処理とシーズナル成分の自動検出がその可能性です。 

例として考えられているインジケータは MATLAB の使用を例示したもので、メタトレーダーシステムとニューラルネットワーク、ファジー論理アルゴリズム、およびその他の複雑で現代的なストック処理メソッドを迅速かつ効率的に統合できるパッケージです。

添付されたアーカイブ (MatlabSArima.zip) にはディレクトリMatlabSArimaLibSARIMAfor_redistributionがあり、 MATLAB ランタイムをインターネットからダウンロードすることを意味します。 SARIMA インジケータの MATLAB ランタイムで情報の量を減らすには、10個のファイルのセットをダウンロードして解凍し、トータルコマンダを使用してを結合する必要があります。

ファイル ダウンロードパス
sarima_plusMCR00.zip 89.16 MB https://pinapfile.com/aKrU7 
sarima_plusMCR01.zip 94.75 MB https://pinapfile.com/fvZNS 
sarima_plusMCR02.zip 94.76 MB https://pinapfile.com/k7wB5 
sarima_plusMCR03.zip 94.76 MB https://pinapfile.com/jwehs 
sarima_plusMCR04.zip 94.76 MB https://pinapfile.com/dv8vK 
sarima_plusMCR05.zip 94.76 MB https://pinapfile.com/hueKe 
sarima_plusMCR06.zip 94.76 MB https://pinapfile.com/c4qzo 
sarima_plusMCR07.zip 94.76 MB https://pinapfile.com/eeCkr 
sarima_plusMCR08.zip 94.76 MB https://pinapfile.com/jDKTS 
sarima_plusMCR09.zip 94.76 MB https://pinapfile.com/dZDJM 


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

添付されたファイル |
MatlabSArima.zip (15634.48 KB)
AdapterSARIMA.zip (3244.29 KB)
ISArimaForecast.mq5 (15.72 KB)
ローソク足分析技術の研究(第2部): 新規パターンの自動検索 ローソク足分析技術の研究(第2部): 新規パターンの自動検索
前回の記事では、さまざまな既存のローソク足の形成から選択された14のパターンを分析しました。すべてのパターンを1つずつ分析することは不可能であるため、別の解決策を見つけました。新しいシステムは、既知のローソク足タイプに基づいて新しいローソク足パターンを検索してテストします。
MQLによるMQLの構文解析 MQLによるMQLの構文解析
本稿では、MQLに基づいたソースコードの解析に使用されるプリプロセッサ、スキャナ、パーサについて説明します。MQLの実装が添付されています。
MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第2部)過去の注文と取引のコレクション MetaTraderプログラムを簡単かつ迅速に開発するためのライブラリ(第2部)過去の注文と取引のコレクション
最初の部分では、MetaTrader 5とMetaTrader 4プラットフォーム用のプログラムの開発を単純化するための大規模なクロスプラットフォームライブラリの作成を始めました。過去の注文と取引、および市場の注文とポジションに関するデータを格納するための基本オブジェクトであるCOrder抽象オブジェクトを作成しました。ここでは、口座履歴データをコレクションに格納するために必要なすべてのオブジェクトを開発します。
取引における相関の実用化 取引における相関の実用化
この記事では、数値の相関の概念について説明し、また相関係数の計算方法と取引における実用的な応用について説明します。相関関係とは、2つ以上の確率変数(またはある程度許容できる程度の精度でそのように考えることができる数量)間の統計的関係です。この時、これらの値の1つまたはいくつかの値の変化は、別または他の値の系統的な変化を伴います。