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