EAの新しい配信方法を考えてみる。その2

EAの新しい配信方法を考えてみる。その2

サムネ
おはようございます。 fx-on.comの岩淵です。 前回からの続きで、今回はサーバー側でソースコードのコンパイルをおこないます。 ちなみに前回の記事はこちら↓ EAの新しい配信方法を考えてみる。その1

準備

今回はサーバーサイドではPHPを使ってmq4ファイルのコンパイルを実装していきます。 mq4ファイルのコンパイルにはmql64.exeを使用します。事前に各自入手しておいて下さい。 mql64.exeのダウンロードはこちらから ページの下の方にダウンロードリンクがあります。 exeファイルを使用する関係上、サーバーはWindowsサーバーを利用します。 wineなどを利用すればlinuxサーバーでも可能かもしれませんが、今回そこまで検証しておりません。 今回私はWindows PCにxamppをインストールしてテストしました。

実装

MT4_Testという名前のプロジェクトを作成して開発していきます。 PHPにはexeファイルを実装するための関数がたくさんあります。 沢山ありすぎて何を使えばいいのか分からなくなるのがPHPらしさですね。 今回私はexec関数を使用しました。 この関数の引数に実行するコマンドを指定してあげればOKです。 mql64.exeの使い方は、mql64.exeの後に、コンパイルするmq4ファイルのパスを指定するだけです。 もしmq4ファイルがmqhファイルなどを使用している場合には、/i: を付けて後ろにMQL4フォルダへのパスを指定します。 こうすることでmqhファイルを使用しているファイルも問題なくコンパイルすることが可能です。 実際には以下のようなコードになります。 index.php
<?php
$file_name = 'test.mq4';

if(isset($_GET['file'])){
	$file_name = (string)$_GET['file'];
}

$command  = 'mql64.exe MQL4/Experts/' . $file_name;
$command .= ' /i:' . dirname(__FILE__) . '/MQL4';
exec($command);

header('location:http://localhost/MT4_Test/MQL4/Experts/' . $file_name . '.ex4');
exit();
index.phpと同じディレクトリにMQL4フォルダを作成しておいて下さい。 MQL4フォルダの中にはさらにExpertsフォルダとincludeフォルダを作成しておきます。 Includesではなく、includeなのがポイントです。 コンパイルテスト用にtest.mq4を作成してExpertsフォルダに保存しておきます。 test.mq4のソースコードは次の通りです。
#include <stderror.mqh>
#include <stdlib.mqh>

string id = "12345";

int OnInit(){
   Comment(id);
   return(INIT_SUCCEEDED);
}

void OnTick(){}
srderror.mqhとstdlib.mqhを利用していますので、この2つをincludeフォルダに保存しておきます。

テスト

作成したindex.phpにアクセスしてみます。 アクセスされるとtest.mq4がコンパイルされてtest.ex4が作成されます。 完成したex4ファイルへとリダイレクトされて、ex4ファイルがダウンロードされるという流れです。 ちなみにデフォルトではtest.mq4をコンパイルしていますが、URLの後ろに ?file=ファイル名 と付ければtest.mq4以外もコンパイルできます。 ついでに前回作成した、ネットからex4ファイルをダウンロードするEAと連携してみます。 前回作成したソースコードを少々変更します。 download.mq4
#property version   "1.00"
#property strict

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

extern string URL      = "http://localhost/MT4_Test/index.php"; //ダウンロード元URL
extern string FileName = "test"; //ダウンロードファイル名
extern string Folder   = "Experts"; //保存先フォルダ名

int OnInit(){
   string command;
   command  = "/c @powershell -NoProfile -ExecutionPolicy Bypass -Command";
   command += " \"$d=new-object System.Net.WebClient;";
   command += "$d.Proxy.Credentials=[System.Net.CredentialCache]::DefaultNetworkCredentials;";
   command += "$d.DownloadFile('";
   command += URL + "?file=" + FileName;
   command += "', '";
   command += TerminalInfoString(TERMINAL_DATA_PATH);
   command += "\\MQL4\\" + Folder + "\\";
   command += FileName + ".ex4";
   command += "')\"";

   if(Shell32::ShellExecuteW(0, "open", "C:\\Windows\\System32\\cmd.exe", command, "", 0) > 32){
      Sleep(5000);
      Print(command);
      MessageBox(FileName + ".ex4をダウンロードしました。\n更新または再起動を行って下さい。");
   }

   return(INIT_SUCCEEDED);
}

void OnTick(){}
このEAを実行すると先ほど作成したindex.phpにアクセスしてファイルがダウンロードできます。

まとめ

今回までで次のことができるようになりました。 MT4からサーバーへアクセス ↓ サーバー側でコンパイル ↓ MT4へダウンロード あとはコンパイルする前に、mq4ファイルを編集してデモ口座縛りを入れたり有効期限を入れたりといった処理を挟んであげれば良さそうです。 このあたりの処理はPHPを使った文字列の操作なので、難しくはないと思います。 セキュリティを全く考えていませんが、応用すれば色々と面白いサービスが作れそうな気がします。 だいぶ長くなったので今回はここまでです。
商号 株式会社ゴゴジャン
金融商品取引業の登録番号 関東財務局長(金商)第1960号
加入協会 一般社団法人 日本投資顧問業協会
商号 株式会社ゴゴジャン
金融商品取引業の登録番号
関東財務局長(金商)第1960号
加入協会 一般社団法人
日本投資顧問業協会
金融庁日本投資顧問業協会証券・金融商品あっせん相談センター証券取引等監視委員会

Copyright © 2024 GogoJungle Inc. All Rights Reserved.