人工知能で自動売買がしたかった

人工知能で自動売買がしたかった

サムネ
こんにちは fx-on.comエンジニアの岩淵です。 今後発展が期待される分野に、人工知能があります。 つい先日もGoolge先生が人工知能ソフト「TensorFlow」を公開して話題になりましたね。 だんだん人工知能が身近な存在となってきました。 相場にも人工知能を利用したサービスも登場し始めましたね。 Capitalico まだβテスト中で詳細は分かりませんが、非常に気になるサービスです。 人工知能・・・ プログラムが自動で学習して賢くなっていくなんて、なんかカッコイイ(小並感) そこでどんどん賢くなるEAが作れないかと思って試作したコードがあるのでご紹介します。

用意するもの

・mql64.exe mq4ファイルのコンパイラー http://www.metatrader5.com/en/metaeditor/help/development/compile

手順

1.データフォルダを開き、mql64.exeを保存する。 2.Filesフォルダ内に、AI.mqhを作成する。 AI.mqhの中には、AIという名の関数を作成しておく。
void AI(){Print("Red");}
3.EAとしてAI_Test.mq4を新規作成する。 4.AI_Test.mq4の中身を次のコードに書き換える。
#property strict

#include "C:\\Users\\iwabuchi\\AppData\\Roaming\\MetaQuotes\\Terminal\\6621509567F956D5CC0CB312D439BB14\MQL4\\Files\\AI.mqh"

#import "shell32.dll"
int ShellExecuteW(int, string, string, string, string, int);
#import

int OnInit(){
   EventSetTimer(30);
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason){
   EventKillTimer();   
}

void OnTick(){
   AI();
}

void OnTimer(){
   string code = "";
   if(Close[0] > Open[0])      code = "void AI(){Print(\"Blue\");}";
   else if(Close[0] < Open[0]) code = "void AI(){Print(\"Red\");}";
   else                        code = "void AI(){Print(\"Yellow\");}";

   int handle = FileOpen("AI.mqh", FILE_TXT|FILE_WRITE);
   if(handle < 0) return;
   FileSeek(handle, 0, SEEK_SET);
   FileWriteString(handle, code);
   FileClose(handle);
   
   string exe_file  = TerminalInfoString(TERMINAL_DATA_PATH)
                      + "\\mql64.exe";
   string parameter = TerminalInfoString(TERMINAL_DATA_PATH)
                      + "\\MQL4\\Experts\\AI_Test.mq4";
   Shell32::ShellExecuteW(0, "open", exe_file, parameter, "", 1);
   Print("Compiled!");
   
   ChartSaveTemplate(0, "AI.tpl");
   ChartApplyTemplate(0, "AI.tpl");
}
5.AI_Testをチャートへ適用すれば完成!

解説

AI_Test.mq4はコンパイルされる際に、ヘッダーファイルとしてFiles内のAI.mqhを取り込んでおります。 このAI.mqhの中身を書き換えることにより、実行中のEAのソースコードを書き換えるのが目的です。
#include "C:\\Users\\iwabuchi\\AppData\\Roaming\\MetaQuotes\\Terminal\\6621509567F956D5CC0CB312D439BB14\MQL4\\Files\\AI.mqh"
AI.mqhを本来のIncludeフォルダではなく、Filesフォルダに保存することにより、FileWrite関数などによって中身の書き換えを可能としています。 mqhファイルはIncludeフォルダ内に無くても、ファイルのフルパスで指定することによりヘッダーファイルとして使用可能です。 ファイルのパスはご利用の環境によって変わるので適宜変更して下さい。
FileWriteString(handle, code);
ただしAI.mqhを書き換えただけではEAの処理は書き換わりません。 ヘッダーファイルはコンパイル時点でのコードが読み込まれるため、 AI.mqhを書き換えたあとにAI.mq4をコンパイルする必要があります。 そこでmql64.exeを使用してコンパイルをかけます。 コード上部のimport部分では、外部exeファイルを実行するのに必要な関数(ShellExecuteW関数)を読み込んでいます。
#import "shell32.dll"
int ShellExecuteW(int, string, string, string, string, int);
#import
ShellExecuteW関数に起動させたいexeファイルのパス(この場合はmql64.exeのパス)とパラメーター(mql64.exeにはパラメーターとしてコンパイルするファイルのパスを指定できる。今回はAI_Test.mq4)を指定して実行すれば、AI_Test.mq4がコンパイルされます。
string exe_file  = TerminalInfoString(TERMINAL_DATA_PATH)
                      + "\\mql64.exe";
string parameter = TerminalInfoString(TERMINAL_DATA_PATH)
                      + "\\MQL4\\Experts\\AI_Test.mq4";
Shell32::ShellExecuteW(0, "open", exe_file, parameter, "", 1);
これにより最新のAI.mqhに処理が書き換わったAI_Test.ex4が作成されますが、 既にチャートへ適用されているAI_Testはまだ処理が変わりません。 再起動などでEAがチャートへ再適用されたタイミングで最新の処理に置き換わります。 ここでは手っ取り早くEAを更新するために、AI.tplをチャートへ適用することでEAを更新しています。 現在のチャートをAI.tplという定型ファイルとして保存し、AI.tplを再適用することでEAもチャートへ再適用させています。
ChartSaveTemplate(0, "AI.tpl");
ChartApplyTemplate(0, "AI.tpl");
今回の例ではAI.mqhのAI関数の中身を、最新のローソク足が陽線であればBlue、陰線であればRed、十字線ならYellowを出力する処理に書き換えています。 OnTick関数内でAI関数を呼び出しているので、ティックが動く毎にいずれかの色が出力されます。 そして30秒毎にAI.mqhの書き換えとコンパイルが実行されます。 チャート上で動作を確認してみると、 最初は「Red」とプリントし続けておりましたが、 時間が経つとEAがコンパイルされ(赤枠の部分)、 以降は「Blue」とPrintするようにコードが書き換わっております。 実行中のEAの処理書き換えが無事成功していますね。

まとめ

今回はEA自身をコンパイルする方法をご紹介しました。 本当はこれを応用してどんどん成長するEAを作りたかったのですが、人工知能の分野の勉強を進めるうちに、やり方が間違っていることに気づいたので恐らくこの方法はお蔵入りとなります。 他の応用例としては、web上にソースコードを用意し、EAはサイトにアクセスしてソースコードを取得。 mqhファイルを書き換えてコンパイルすれば、EAの入れ替え無しでライブアップデートとかできるかと思います。 mq4ファイルを配布しないといけないし、mqhファイルもソースコード見えちゃうしので実用的ではありませんが・・・ コンパイルすることに拘らずとも、外部のexeファイルを実行できるだけでも開発の幅は広がると思います。
商号 株式会社ゴゴジャン
金融商品取引業の登録番号 関東財務局長(金商)第1960号
加入協会 一般社団法人 日本投資顧問業協会
商号 株式会社ゴゴジャン
金融商品取引業の登録番号
関東財務局長(金商)第1960号
加入協会 一般社団法人
日本投資顧問業協会
金融庁日本投資顧問業協会証券・金融商品あっせん相談センター証券取引等監視委員会

Copyright © 2024 GogoJungle Inc. All Rights Reserved.