MT4からDDE通信(送信)するDLL「MT4 DDE Server」


MT4のインジケーターからDDE送信をする時に使用するDLLです。

メソッド「SendString」の引数にサーバー名、トピック名、アイテム名、送信したい文字列を指定して呼び出すだけです。
使い方の例として、1台のパソコンに複数のMT4(複数業者のMT4)がインストールされている場合、各MT4ごとに異なるサーバー名を指定(例えば業者名を指定)して、Excelに各業者のデータを一覧表示することが可能です。(後述の「MT4複数起動時の例」を参照)


導入方法(インストール)

ダウンロードしたZIPファイルを適当なフォルダに展開(解凍)して、その中にあるDLL「MT4DDESV.dll」を「Libraries」フォルダに配置してください。

  1. MT4のメニュー「ファイル」から「データフォルダを開く」をクリック。
  2. 「MQL4」フォルダ内にある「Libraries」フォルダにDLL「MT4DDESV.dll」を配置。

補足:ZIPファイルはMT4用のトップページからダウンロードできます。


削除方法(アンインストール)

上記インストール時に配置したDLL「MT4DDESV.dll」を削除してください。
当DLLはレジストリを使用していません。

補足:DLLはMT4を終了させてから削除することをおすすめします。


使い方(当DLL呼び出し側:インジケーターの修正)

まず、インジケーターに以下の宣言を追加します。

//インポートするDLLの宣言 #import "MT4DDESV.dll" void SendString(string AServer,string ATopic,string AItem,string AData); #import

次に、DDE送信したいところでメソッドを呼び出します。
メソッド「SendString」の呼び出し方は
 SendString(サーバー名、トピック名、アイテム名、送信したい文字列);
です。応答値はありません。

//DDE送信時の記述例 SendString("ServerName","TopicName","ItemName",Symbol()+"の売値="+DoubleToStr(Bid,Digits()));

修正したら保存し、インジケーターをチャートに挿入してください。
インジケーターをチャートに挿入する際は「DLLの使用を許可する」にチェックを入れてください。

各名称の命名について

サーバー名、トピック名、アイテム名は半角英数字や全角文字を組み合わせて自由に命名できますが以下の制約があります。

  1. サーバー名は1つのMT4に対して1種類しか指定できません。
    複数のチャート、複数のインジケーターで使用する場合も1種類となります。
    逆に、MT4を複数起動して使用する場合はMT4ごとに異なるサーバー名を指定してください。
    異なるMT4で同じサーバー名を使用した場合、どちらのデータが取得されるか不明です。
  2. 半角記号や空白については使用しないほうが良いと思います。
    また、全角文字についても使用できないものがあるかもしれません。
    その場合は無理して使用せず、「使えるものから使う」の気持ちでお願いします。

サンプル

当DLLを組み込んだサンプルファイルを添付しています。参考にしてください。

320_DDE_ArraySend.mq4
Excelの配列数式用にDDE送信(複数行/列データ一括送信)するサンプルです。
この方法を使用すると一回のSendStringメソッド呼び出しでExcelの複数セルに値を送信できます。
例えば、USD/JPYとEUR/JPYの始値、高値、安値、終値をExcelの8個のセル(A1セル~E2セル等)に送信する場合でも一回だけで済みます。
具体的な方法(Excel側の操作も含む)はサンプルをご参照ください。
サンプルインジケーター追加のキッカケになった記事は掲示板(MT4専用)MT4 DDE Serverへの要望(配列のやりとりがしたい)を参照してください。
320_DDE_Sample.mq4
以下の口座情報をDDE送信するサンプルです。
・口座残高(AccountBalance)
・必要証拠金(AccountMargin)
・余剰証拠金(AccountFreeMargin)
・有効証拠金(AccountEquity)
320_DDE_Sample_CN.mq4
クリックした位置の価格で通知するインジケーター「320_ClickNotice」を流用してDDE送信を追加したサンプルです。ついでにディスプレイのスリープ解除機能も有効にしています。
320_DDE_Sample_ZN.mq4
ZigZagの山や谷ができたときに通知するインジケーター「320_ZigZagNotice」を流用してDDE送信を追加したサンプルです。ついでにディスプレイのスリープ解除機能も有効にしています。

使い方(DDE送信された文字列を受信する側)

MT4の標準のDDEの使い方として、例えばExcelでドル円の売値を取得したい場合、
 =MT4|BID!USDJPY
のように記述しますが、当DLLを使用する場合はSendString関数の引数に合わせて
 =ServerNameTopicNameItemName
のように記述することで「送信したい文字列」の値を取得できます。

サーバー名、トピック名、アイテム名はSendString関数のパラメーターで指定した文字列を記述しますので、例えばインジケーターに
 SendString("FX業者A", "アカウント", "口座残高", DoubleToString(AccountBalance(),0));
と記述している場合は、Excelには
 =FX業者A|アカウント!口座残高
と記述することになります。

補足:縦棒「|」と感嘆符「!」は見やすくするために全角で記述してますが、実際は半角文字です。

補足:トピック名やアイテム名に「数字だけ」または「先頭が数字」の名称を使用する場合、Excelではシングルクォーテーション「'」で括る必要があります。
例:サーバー名が「01Server」、トピック名が「00123456」、アイテム名が「1A2B」の場合
 ='01Server'|'00123456'!'1A2B'


MT4複数起動時の例:各FX業者の口座残高を一覧表示および合算する

各FX業者のMT4を起動し、それぞれのMT4で実行するインジケーターに異なるサーバー名を指定して各FX業者の口座残高を一覧表示および合算する例です。

FX業者Aのインジケーターには
 SendString("FX業者A", "アカウント", "口座残高", DoubleToString(AccountBalance(),0));
FX業者Bのインジケーターには
 SendString("FX業者B", "アカウント", "口座残高", DoubleToString(AccountBalance(),0));
と記述します。

ExcelのセルA1に
 =FX業者A|アカウント!口座残高
ExcelのセルA2に
 =FX業者B|アカウント!口座残高
ExcelのセルA3に
 =SUM(A1:A2)
と記述します。

これで、ExcelのセルA1にはFX業者Aの口座残高が、セルA2にはFX業者Bの口座残高が、セルA3には口座残高の合算値が表示されます。


ソースについて

一部のソースのみを添付しています。リソースファイル(.res)などは添付されていません。
流用した「Delphi7」のコンポーネントソースは配布不可なので代わりに改造箇所説明ファイル「DdeMan.pasの改造箇所について.txt」を添付しています。


更新履歴

日付 バージョン 内容
2017/04/19 1.0.0.0 初リリース
2017/07/19 2.0.0.0 1.パラメーターに、サーバー名、トピック名、アイテム名を追加しました。
2.MT4が強制終了する不具合を修正しました。
なお、バージョンアップに伴いバージョン「1.0.0.0」との互換性はありません。
2017/10/07 2.1.0.0 1.異なるトピック名で同じアイテム名が使用できない制約を解除しました。
2017/12/05 2.2.0.0 1.DDE通信が正しく行われない不具合に対応しました。
2018/01/11 2.3.0.0 1.トピック名とアイテム名にも「数字だけ」または「先頭が数字」の名称を使用できるように対応しました。
2.サーバー名は上書きするように変更しました。