3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MetaTraderAdvent Calendar 2022

Day 6

C#とMetaTrader(MQL4)の連携方法その2

Posted at

目的

C#とMetaTraderでデータのやり取りをして、トレードパネルを作る。

データのやり取りに関する実現方法について

データのやり取りに関する実現方法については,主に3種類あると考えられます。

  1. 共有メモリを使用する方法
  2. ソケット通信による方法
  3. ファイルによる方法

恐らく3番目が一番実装しやすいのではないでしょうか。
ただし,3番目の場合,ファイルアクセスのルールを決めないといけないため,少しコードの工夫が必要です。

本稿では,共有メモリによる実装方法について検討したいと思います。

共有メモリによるC#とMetaTraderの連携方法について

このあたりもわかりやすいです。

C#側からは共有メモリにアクセスしやすいですが、MetaTrader側が厄介です。
基本的にそういった関数は用意されていないので、DLLを介して共有メモリにアクセスする必要があります。

ふぁいさんが作られたMemMap.dllを改良したものがどっかに落ちていて、昔それをどこかのサイトから頂いたのですが、どのサイトか忘れました。GitHubに置いておきます・・・。

コード

C#側

C#側でSellボタンやBuyボタンを押したときは次のようにしています。


        private void buyBtn_Click(object sender, RoutedEventArgs e)
        {
            int tp;
            int sl;
            double lot;
            tp = (bool)(tpCbx.IsChecked) ? int.Parse(tpTbx.Text) : 0;
            sl = (bool)(slCbx.IsChecked) ? int.Parse(slTbx.Text) : 0;
            lot = double.Parse(lots.Text);
            MemoryMappedViewAccessor accessor = shareMemOrder.CreateViewAccessor();
            // buyは0
            // Write data to shared memory
            string str = "0," + lot + ",,," + sl + "," + tp + ",PANEL," + (DateTime.Now).Millisecond;
            //Trace.WriteLine(str);
            char[] data = str.ToCharArray();
            accessor.Write(0, data.Length);
            accessor.WriteArray<char>(0, data, 0, data.Length);

            // Dispose accessor
            accessor.Dispose();

            //setMemorryString(pushTAG + ".order", str);
            orderFlag = true;
        }

        private void sellBtn_Click(object sender, RoutedEventArgs e)
        {
            //int RequestOrder(string mySymbol,int orderSB,double lot,double value,double sp,double SL,double TP,string comment,int mgno,int orderLimit,color orderColor)
            //Trace.WriteLine("SELL button");
            int tp;
            int sl;
            double lot;
            tp = (bool)(tpCbx.IsChecked) ? int.Parse(tpTbx.Text) : 0;
            sl = (bool)(slCbx.IsChecked) ? int.Parse(slTbx.Text) : 0;
            lot = double.Parse(lots.Text);
            MemoryMappedViewAccessor accessor = shareMemOrder.CreateViewAccessor();
            // sellは1
            // Write data to shared memory
            string str = "1," + lot + ",,," + sl + "," + tp + ",PANEL,"+(DateTime.Now).Millisecond+",";
            //Trace.WriteLine(str);
            char[] data = str.ToCharArray();
            accessor.Write(0, data.Length);
            accessor.WriteArray<char>(0, data, 0, data.Length);

            // Dispose accessor
            accessor.Dispose();

            //setMemorryString(pushTAG + ".order", str);
            orderFlag = true;
        }

共有メモリへのアクセスはこの辺ですね!

MemoryMappedViewAccessor accessor = shareMemOrder.CreateViewAccessor();
// sellは1
// Write data to shared memory
string str = "1," + lot + ",,," + sl + "," + tp + ",PANEL,"+(DateTime.Now).Millisecond+",";
//Trace.WriteLine(str);
char[] data = str.ToCharArray();
accessor.Write(0, data.Length);
accessor.WriteArray<char>(0, data, 0, data.Length);

また、MT4→C#/C#→MT4での上下のやり取りがごっちゃにならないように、

//MT4からC#
share_mem = MemoryMappedFile.CreateNew(pushTAG+".symbol", 256, MemoryMappedFileAccess.ReadWriteExecute);
//C#からMT4
shareMemOrder = MemoryMappedFile.CreateOrOpen(pushTAG+".order", 256, MemoryMappedFileAccess.ReadWriteExecute);

として、MT4からC#への返答とC#からMT4への返答の交通整理をしています。

MQL4

MQL4側は,ここを参考にしながら実装していければと思います。

完成品

GitHubにトレードパネルがあるので、みんなで改良していきましょう!

REFERENCEs

さいごに

投資は自己責任!

カレンダー参加者募集してます!

Have a good MQL Life!!!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?