MT4(MQL4) から外部プログラムにデータを渡して処理したくなることがあります。 そんなとき,Windows の名前付きパイプ(NamedPipe)を使うと比較的容易に実現できます。 外部プログラムの作成に使うプログラミング言語は名前付きパイプに対応していれば何でも良いですが,今回は C# で書いてみました。
Python の場合は「MT4(MQL4) と Python の連携 ~名前付きパイプを使ってデータを渡す~」を参考にしてください。
プログラムの動きは以下のような流れになります。
今回は C# を使って外部プログラム(コンソールアプリケーション)を作成します。 パイプから送られてきた文字列をコンソールに表示するだけの単純なプログラムです。
C#(.NetFramework) で名前付きパイプを扱うには,NamedPipeServerStream クラスを使います。
using System;
using System.IO.Pipes;
namespace PipeServer
{
class Program
{
static void Main(string[] args)
{
// 名前付きパイプを作成する。
// "TestPipe" はパイプの名前で,任意につけることができる。
NamedPipeServerStream pipeServer = new NamedPipeServerStream("TestPipe");
// クライアントがパイプに接続するのを待つ。
pipeServer.WaitForConnection();
while (true)
{
// パイプから 1 バイト読み取る。
int c = pipeServer.ReadByte();
if (c == -1) break;
// コンソールに表示する。
Console.Write((char)c);
}
}
}
}
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 価格が表示されます。
105.36100000
105.36000000
105.36100000
105.36000000
105.36100000