MT4(MQL4) から外部プログラムにデータを渡して処理したくなることがあります。 そんなとき,Windows の名前付きパイプ(NamedPipe)を使うと比較的容易に実現できます。 外部プログラムの作成に使うプログラミング言語は名前付きパイプに対応していれば何でも良いですが,今回は Python で書いてみました。
双方向で通信したい場合は「MT4(MQL4) と Python の連携 ~名前付きパイプを使ってデータを渡す~ <双方向編>」を参考にしてください。
C# の場合は「MT4(MQL4) と C# の連携 ~名前付きパイプを使ってデータを渡す~」を参考にしてください。
プログラムの動きは以下のような流れになります。
今回は Python を使って外部プログラムを作成します。 パイプから送られてきた文字列をコンソールに表示するだけの単純なプログラムです。
Python で Windows の名前付きパイプを扱うには,win32pipe モジュールを使います。
import win32pipe
import win32file
# 名前付きパイプの作成
pipe = win32pipe.CreateNamedPipe(
r'\\.\pipe\TestPipe',
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe. PIPE_TYPE_BYTE | win32pipe.PIPE_READMODE_BYTE | win32pipe.PIPE_WAIT,
1, 256, 256, 0, None)
# クライアントの接続を待つ
win32pipe.ConnectNamedPipe(pipe, None)
# 無限ループ
while True:
# パイプから 1 文字読み取って
hr, c = win32file.ReadFile(pipe, 1)
# 表示する
print(c.decode(), end='')
MT4(MQL4) 側は EA(エキスパートアドバイザ)としてプログラムを作成します。 ティックごとに Bid 価格を文字列に変換し,パイプに書き込むプログラムです。
MT4(MQL4) から既存のパイプに接続するには FileOpen 関数を使います。
#property strict
const string pipeName = "TestPipe"; // パイプ名。外部プログラムで作成した名前に合わせる。
int pipe = INVALID_HANDLE;
int OnInit()
{
// 名前付きパイプを開く(接続する)。
pipe = FileOpen("\\\\.\\pipe\\" + pipeName, FILE_WRITE | FILE_BIN | FILE_ANSI);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
// パイプを閉じる。
FileClose(pipe);
}
void OnTick()
{
// Bid 価格を文字列に変換する。
string s = DoubleToString(Bid);
// 文字列をパイプに書き込む。
FileWriteString(pipe, s + "\r\n");
}
上記のプログラムを動かすときは,はじめに外部プログラムを起動して待受状態にした後,MT4 側で EA をチャートに適用します。 うまく行けば外部プログラムに以下のように Bid 価格が表示されます。
104.61700000
104.61800000
104.61900000
104.61800000
104.61900000