MetaTrader4のDDE機能拡張

MT4 のDDE機能では、4本値しかExcel に渡すことしか出来ません。
そこで、今日は もっと他の値をDDEで渡したい人向けにDDEの機能拡張を試みます。
・2つのメタトレーダーから1つのエクセルに値を渡したい人
・口座残高やボリューム、インジケータの値をエクセルに渡したい人
向けです。
複数のブローカーの残高情報を1つのExcel上でリアルタイムに合算できたら楽しいかな?とか(笑


ちなみに、2つのメタトレーダーからエクセルに値を渡す方法は、
起動順序を工夫する
DDEサーバ名を書き換える(binary hack)
という手法があるようです..。



MetaTrader4の本来のDDEの使い方は、こちらを見て頂くとして、以下はDDE機能拡張版の話です。
まず、DDEの基本用語?から。

='MT4' | BID ! EURUSD

Excel上ではこんな書き方をしてDDEを受信しますが、それぞれの項目は、

='サーバ名' | トピック ! アイテム

と呼びます。
2つのMT4 からDDEの値を同時に受け取れない理由は、サーバ名が重複している ( どのMT4も「MT4」というサーバ名を使っている ) のが原因ですので、DDE機能拡張版では、サーバ名を MT4毎に変更できるようにしています。


準備

DDEMap.dll をダウンロードして、library フォルダにコピーします。


DDEデータ送信用のインジケータには、

#import "DDEMap.dll"
int SendDDE(string server,string topic,string item,string value);
#import

と宣言し、データを送りたい時は、

SendDDE("サーバ名","トピック","アイテム","データ文字列");

のように書きます。


例えばこんな感じ。

int x = SendDDE("MTK2","BID","EURUSD",DoubleToStr(Bid,Digits));
int y = SendDDE("MTK2","ASK","EURUSD",DoubleToStr(Ask,Digits));
int z = SendDDE("MTK2","DATA","NAME",AccountName());
int a = SendDDE("MTK2","DATA","BALANCE",AccountBalance());


Excel 側は、

='MTK2'|BID!EURUSD
='MTK2'|ASK!EURUSD
='MTK2'|DATA!NAME
='MTK2'|DATA!BALANCE

のように設定して受信します。



注意事項

・1つのMT4 内では、使えるサーバ名は1つだけです。なので、ブローカー毎にサーバ名を決めるようにしてください。
script からは呼び出せません。必ず、インジケータから呼び出してください。
・送るデータは文字列として送りますので、DoubleToStr() 等で必ず文字列に変換してください。


実験

以下のようなインジケータを作成して、サーバ名を "MKT","MKT2"としてFXDD,FXProのチャートに張り付けてみました。

#property indicator_chart_window

#import "DDEMap.dll"
int SendDDE(string server,string topic,string item,string value);
#import

int start()
  {
   int a = SendDDE("MTK","DATA","BALANCE",AccountBalance());
   return(0);
  }


Excel 側で、DDEを受信すると、

こんな感じになって、ほぼリアルタイムに口座残高が合算できました。^^


ちなみに、海外では、MetaTrader 4 DDETool Software という名称で同様のモノが160ドルで売られているようです。
動作保証のあるブツを欲しい人はそちらをどうぞ....orz