ホーム Tweet

MT4(MQL) から名前付きパイプを使って外部プログラムにデータを渡す

はじめに

MT4(MQL) から外部プログラムにデータを渡して処理したくなることがあります。 そんなとき,Windows の名前付きパイプ(NamedPipe)を使うと比較的容易に実現できます。 外部プログラムの作成に使うプログラミング言語は名前付きパイプに対応していれば何でも良いですが,今回は C# で書いてみました。

試した環境

プログラムの流れ

プログラムの動きは以下のような流れになります。

  1. 外部プログラム側で名前付きパイプを作成し,接続されるのを待ちます。
  2. MT4(MQL) から名前付きパイプに接続します。
  3. MT4(MQL) から名前付きパイプにデータを書き込みます。
  4. 外部プログラムで名前付きパイプからデータを読み取ります。

外部プログラムの作成

今回は 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(MQL) プログラムの作成

MT4(MQL) 側は EA(エキスパートアドバイザ)としてプログラムを作成します。 ティックごとに Bid 価格を文字列に変換し,パイプに書き込むプログラムです。 MT4(MQL) から既存のパイプに接続するには FileOpen 関数を使います。


#property strict

const string pipeName = "TestPipe";     // パイプ名。外部プログラムで作成した名前に合わせる。
int pipe = INVALID_HANDLE;

int OnInit()
{
   // 名前付きパイプを開く(接続する)。
   pipe = FileOpen("\\\\.\\pipe\\" + pipeName, FILE_WRITE | FILE_TXT | FILE_ANSI);

   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   // パイプを閉じる。
   FileClose(pipe);
}

void OnTick()
{
   // Bid 価格を文字列に変換する。
   string s = DoubleToString(Bid);

   // 文字列をパイプに書き込む。
   FileWrite(pipe, s);
}

表示例

上記のプログラムを動かすときは,はじめに外部プログラムを起動して待受状態にした後,MT4 側で EA をチャートに適用します。 うまく行けば外部プログラムに以下のように Bid 価格が表示されます。


105.36100000
105.36000000
105.36100000
105.36000000
105.36100000


Copyright © 2020 Lawn Technology