見出し画像

ADM-EAに機械学習モデルによる売買判定を追加してML-ADM-EAに進化させる方法

この記事では、ADM-EA(分解モンテカルロ法)のロジックに機械学習モデルによる予測を追加して、ML-ADM-EA(Machine Learning - Atr -  Decomposition - Montecarlo:機械学習 - ATR - 分解モンテカルロ - EA)に進化させる方法をご紹介します。


ADM-EA(分解モンテカルロ法)とは

以下のページでロジックを詳細解説しているEAです。

特徴

  • テクニカル指標を用いて、勝率50%程度を目指すタイプのEAです。

  • 「並行注文数」により、複数のラインを同時稼働出来ます。取引数を増やすことで、より安定的な勝率に収束させることを目指します。

  • 分解モンテカルロ法を用いて、勝率が5割程度でも安定的に利益を積み重ねられるようなロット数戦略を採用しています。

この勝率50%程度のEAについて、より勝率を安定させる、あるいは向上させる目的で機械学習を用いるということになります。

MLbot(LightGBMモデル)

なお、同様の試みとして以下の記事で紹介しているMLbotというのが存在します。

このML-botでは、PythonでMT5にアクセスして自動売買を行う手法を採用しています。
今回のML-ADM-EAとの主な違いは以下の通りです。

  • ML-botではポジションを1つしか持たないが、今回のML-ADM-EAでは同時並行注文機能を実装しており、複数ポジションを持つことが可能になっている。

  • Pythonベースのbotではなく、MQLベースのEAなので、通常のEAに近い方法で利用可能になっている。

MQLとPythonの連携

以下は、今回のML-ADM-EAにおけるMQLとPythonの連携部分の処理の流れの簡単なイメージ図です。

MQLとPythonの連携処理の流れ

ここでは、モデルの学習は事前に行なっており、学習済みのモデルが保存されている前提で話を進めます。モデルの学習および保存に関する詳細は以下の記事でご確認ください。

ADM-EAのソースコード

今回は、以下の記事のADM-EAをベースに、機械学習機能を追加していく流れで実装方法をご紹介します。

ADM-EA(MT5用)

ADM-EA(MT4用)

つまり、この記事からダウンロード可能な「ADM-EA_note.mq5」または「ADM-EA_note.mq4」を「ML-ADM-EA_note.mq5」または「ML-ADM-EA_note.mq4」に進化させるイメージです。

ML-ADM-EAへの拡張方法

以下、「ADM-EA_note」の既存コードに対しての追加・変更箇所を順番に解説していきます。追加・変更箇所についてはMT5用とMT4用で共通です。説明の都合上、以下はMT5をベースに話を進めます。

バッチファイル設定の追加

これはどこに追記しても良いのですが、目安としてどこに追加するかを示します。以下の冒頭部分に追加します。

追加前

#include <Indicators\Trend.mqh>
#include <Indicators\Oscilators.mqh>

追加後

#import "Shell32.dll"
int ShellExecuteW(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
#import

// バッチファイルのパス
input string user_name = "ご自身のPC環境の[ユーザー名]"; // ユーザー名
string get_buy_flg_bat = "C:\\Users\\"+user_name+"\\get_buy_flg_MT5.bat";
string get_sell_flg_bat = "C:\\Users\\"+user_name+"\\get_sell_flg_MT5.bat";

#include <Indicators\Trend.mqh>
#include <Indicators\Oscilators.mqh>

グローバル変数の追加

機械学習機能を追加するために用いる変数を追加しておきます。
current_ML_time, buy_flg, sell_flgの3つです。

current_ML_timeの追加

datetime current_buy_order_time, current_sell_order_time, buy_flg_time, sell_flg_time;
datetime current_ML_time; // ML-ADM-EA用の追加

buy_flg, sell_flgの追加

int order_flg;
int buy_flg, sell_flg; // ML-ADM-EA用の追加

機械学習による予測の追加

ここが今回の追加機能におけるメイン処理になります。ADM-EAではorder_flgが売買判定フラグでしたが、この後に機械学習による予測を入れて、最終的な売買フラグ(buy_flg、sell_flg )を決定する仕組みにしています。

   if(MA_flg==1&&DMI_flg==1)
      order_flg=1;
   else
      if(MA_flg==-1&&DMI_flg==-1)
         order_flg=-1;
      else
         order_flg=0;


//+------------------------------------------------------------------+
//| ML-ADM-EA用の追加
//+------------------------------------------------------------------+

   if(order_flg==1 && current_time - current_ML_time > 60)
     {
      Indicators_record(Bid, Ask, MA_M1, pDI_M1, pDI_M5, pDI_M15, pDI_H1, mDI_M1, mDI_M5, mDI_M15, mDI_H1, ATR_H1);  // 予測用データの出力
      ShellExecuteW(0, "open", get_buy_flg_bat, "", "", 1); // バッチファイルの実行
      WaitForPythonProcess(); // Pythonスクリプトの完了を待機
      buy_flg_load(); // buy_flgの読み込み
      DeleteProcessDoneFile(); // プロセス完了ファイル削除
      current_ML_time = current_time; // 予測時刻の記録
     }
   else
      if(order_flg==-1 && current_time - current_ML_time > 60)
        {
         Indicators_record(Bid, Ask, MA_M1, pDI_M1, pDI_M5, pDI_M15, pDI_H1, mDI_M1, mDI_M5, mDI_M15, mDI_H1, ATR_H1);  // 予測用データの出力
         ShellExecuteW(0, "open", get_sell_flg_bat, "", "", 1); // バッチファイルの実行
         WaitForPythonProcess(); // Pythonスクリプトの完了を待機
         sell_flg_load(); // sell_flgの読み込み
         DeleteProcessDoneFile(); // プロセス完了ファイル削除
         current_ML_time = current_time; // 予測時刻の記録
        }
      else
         if(current_time - current_ML_time > 60)
           {
            // 予測から60秒経過したらフラグをリセット
            buy_flg=0;
            sell_flg=0;
           }

つまり、通常のADM-EAによる売買判定(order_flg)でbuy条件やsell条件が成立した後、そこで初めて機械学習を用いて、さらに本当にbuyやsellで進めて良いかの判断を加えるというイメージです。

buyエントリー注文

「order_flg==1」という条件だったところを機械学習判定後の「buy_flg==1」という条件に変更します。

if(L==N &&
   (buy_cnt==0||current_time - current_buy_order_time > order_interval) &&
   buy_flg==1 // ML-ADM-EAで変更
  )

sellエントリー注文

「order_flg==-1」という条件だったところを機械学習判定後の「sell_flg==1」という条件に変更します。

if(L==N &&
   (sell_cnt==0||current_time - current_sell_order_time > order_interval) &&
   sell_flg==1 // ML-ADM-EAで変更
  )

有料部分の内容

以上、「ADM-EA_note.mq5」または「ADM-EA_note.mq4」を「ML-ADM-EA_note.mq5」または「ML-ADM-EA_note.mq4」へと拡張する過程の主要な内容を解説しました。残りの対応として、MQL内でbuy_flgとsell_flgを取得する関数の定義が必要です。また、これらのフラグを決定するためには、バッチファイル(get_buy_flg.bat, get_sell_flg.bat)とPythonスクリプト(get_buy_flg.py, get_sell_flg.py)の作成も必須です。

必要な関数定義(MQL内)

  • Indicators_record(予測用データを出力する関数)

  • buy_flg_load(buy_flgを読み込む関数)

  • sell_flg_load(sell_flgを読み込む関数)

  • WaitForPythonProcess(Python処理を待機する関数)

  • DeleteProcessDoneFile(プロセス完了ファイルを削除する関数)

バッチファイルの作成

  • get_buy_flg.bat(get_buy_flg.pyを実行するためのバッチファイル)

  • get_sell_flg.bat(get_sell_flg.pyを実行するためのバッチファイル)

Pythonスクリプトの作成

  • get_buy_flg.py(機械学習でbuy_flgを予測するPythonスクリプト)

  • get_sell_flg.py(機械学習でsell_flgを予測するPythonスクリプト)

注意点

  • 当記事で掲載しているコードはPythonの環境設定含め、必要な準備が整っている上での実行を想定しています。また、以下の記事のADM-EA(MQL5用あるいはMQL4用)をベースとした変更部分のコードしか掲載していませんので、当記事の有料部分の内容だけでは実際に動かすことはできません。以下の記事の内容と組み合わせる必要があります。

  • 記事執筆時点で稼働確認を行なっており、エラーが出ないことを確認しておりますが、その後の環境変化等で想定通りに稼働しない可能性はございます。動作保証等はいたしかねますのでご了承ください。

  • リアル口座にアクセスして取引を行うことも可能なコードになっておりますが、必ずデモ口座で事前に稼働確認をしていただくことを推奨いたします。

  • 当記事や他記事で解説しているロジック通りの動作を保証するものではございません。あくまでFX自動売買ツール開発のためのサンプルコードとしてご活用ください。

必要な関数定義(MQL内)

以下の関数は、全て「ADM-EA_note.mq5」または「ADM-EA_note.mq4」の一番下に順番にコピペしていただければ問題ありません。

ここから先は

6,234字

¥ 1,000

期間限定 PayPay支払いすると抽選でお得に!

よろしければサポートお願いします。いただいたサポートは今後の記事の執筆に活用させていただきます。