人工知能で自動売買がしたかった
こんにちは
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); #importShellExecuteW関数に起動させたい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の処理書き換えが無事成功していますね。