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

おはようございます。
fx-on.comの岩淵です。
前回からの続きで、今回はサーバー側でソースコードのコンパイルをおこないます。
ちなみに前回の記事はこちら↓
EAの新しい配信方法を考えてみる。その1
アクセスされるとtest.mq4がコンパイルされてtest.ex4が作成されます。
完成したex4ファイルへとリダイレクトされて、ex4ファイルがダウンロードされるという流れです。
ちなみにデフォルトではtest.mq4をコンパイルしていますが、URLの後ろに
?file=ファイル名
と付ければtest.mq4以外もコンパイルできます。
ついでに前回作成した、ネットからex4ファイルをダウンロードするEAと連携してみます。
前回作成したソースコードを少々変更します。
download.mq4
準備
今回はサーバーサイドでは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にアクセスしてファイルがダウンロードできます。



