Home > FX | Programming > MT4でDLLを作らずにカンタンにプロセス間通信を行う方法

MT4でDLLを作らずにカンタンにプロセス間通信を行う方法

ここの所、障害対応と仕様変更対応ぐらいしか仕事がなくてとっても暇です。

んで暇つぶしにMetaTrader4のCustom Indicatorを改造したり作ったりしてます。

MetaTrader4のCustom IndicatorやExpert Advisorsの作成に専用のスクリプト言語、MetaQuotes Language(以下MQL)を使うわけだけどこのMQL、C言語そっくりなんで1日中ネットしてるより罪悪感がなくて良い感じです。

MQL専用エディタもシンタックスハイライトやコードアシストがありそこら辺のエディタよりも出来が良いです。あと今気がつきましたがブレークポイントまでありました。素晴らしすぎです。

そして外部と連携したいときC/C++言語で作ったDLLを呼べるんですが・・・メンドクセ(‘A`)

C#に慣れすぎてどうすんだか忘れたし、Cのコンパイラ入れてないし。どーすっかなーと考えてて思い出した。

あ!そうだATOMを使おう。GlobalAddAtomにデータを入れて、AtomIDをSendMessageで連携したいプロセスに送ればタイムラグ無しに連携できるネ。

#include <WinUser32.mqh>
#import "kernel32.dll"
int GlobalAddAtomA(string lpString);
int GlobalGetAtomName(int nAtom,string lpBuffer,int nSize);
int GlobalDeleteAtom(int nAtom);
#import
#define WM_APP_ATOM 0x8001

こんな感じでkernel32から使うWin32API関数を宣言する。 さらにSendMessageとFindWindowが必要なんでWinUser32.mqhをincludeします。 WM_APP_ATOMはSendMessageで送信するメッセージ定義です。

string ClassName = "WindowsForms10.Window.8.app.0.b7ab7b";
string TitleName = "Form1";
int HWND = FindWindowA(ClassName,TitleName);

そしてウィンドウクラス名とウィンドウタイトルを指定してウィンドウハンドルを取得。

int atom = GlobalAddAtomA("アッー");
SendMessageA(HWND,WM_APP_ATOM,atom,0);
GlobalDeleteAtom(atom);

ATOMに文字列を保存して得られたATOMIDをSendMessageで送信。

[DllImport("kernel32.dll", SetLastError = true)]
static extern int GlobalGetAtomNameA(int nAtom, StringBuilder lpBuffer, int nSize);
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_APP_ATOM)
{
StringBuilder buf = new StringBuilder();
GlobalGetAtomNameA((int)m.WParam, buf, 1024);
Console.WriteLine(buf.ToString());
}
base.WndProc(ref m);
}

送信先システム(例ではC#)でWM_APP_ATOMを受信したらWParamに入っているATOMIDを元にGlobalGetAtomNameAで文字列を取り出す。


という具合にDLLを作らずともATOMとSendMessageでプロセス間通信を行い外部と連携が出来るようになります。
これでMetaTraderから売買シグナルを発信し、それを受け取った外部システムがブラウザや売買システムを自動操縦して発注するなんてことも出来ますね。怖いけど。

コメント:8

oloo 09-01-25 (日) 19:15

できれば教えてください。
GlobalAddAtomAを実行してすぐにGlobalDeleteAtomを実行
すると、アトムデータが消せない時があります。
sleepを入れてとりあえず消せるようになったのですが
よくわかってません。色々調べたのですが、参考になるものが
見つかりませんでした。
これでいいのでしょうか?

finel 09-01-28 (水) 21:06

olooさんへ 返信が遅れてすみません
正直、私も詳しくないので適切なアドバイスはできませんが、「猫でもわかるプログラミング」(http://www.kumei.ne.jp/c_lang/sdk2/sdk_157.htm)でも0.5秒スリープを入れてるみたいです。
ただ、「うまい手ではない」とも書かれているので苦肉の策なのでしょうね。
きっちりとしたプロセス間通信を行いたい場合はDLLを自作して呼んだ方が良いと思います。
DDEやATOMは若干不安定なところがありますし。

oloo 09-01-31 (土) 1:26

ありがとうございました。
とても勉強になりました。

あつ 09-08-21 (金) 12:00

そんなことができるんですか!!すごい!
売買判断をC#の方でくみたいのでMT4の4本値をリアルタイムで取り出したいのですが、そういったことも可能なんでしょうか?
dllの自作が必要であればチャレンジしてみたいのですが、Windowsプログラミングはほんの少しかじった程度なので、何をどうやったらよいのかさっぱりイメージがわかないので何を調べたらよいかもわからないんです・・
よろしければ何かヒントをいただけないでしょうか?

あつ 09-08-21 (金) 12:07

そんなことができるんですか!!すごい!
売買判断をC#の方でくみたいのでMT4の4本値をリアルタイムで取り出したいのですが、そういったことも可能なんでしょうか?
dllの自作が必要であればチャレンジしてみたいのですが、Windowsプログラミングはほんの少しかじった程度なので、何をどうやったらよいのかさっぱりイメージがわかないので何を調べたらよいかもわからないんです・・
よろしければ何かヒントをいただけないでしょうか?

****** 12-10-26 (金) 3:39
このコメントは管理者の承認待ちです
****** 14-10-06 (月) 9:22
このコメントは管理者の承認待ちです
****** 15-11-19 (木) 13:52
このコメントは管理者の承認待ちです
コメントフォーム
Remember personal info

トラックバック:0

このエントリーのトラックバックURL
http://finelworks.net/archives/2007/08/mt4dll.html/trackback
Listed below are links to weblogs that reference
MT4でDLLを作らずにカンタンにプロセス間通信を行う方法 from finelworks

Home > FX | Programming > MT4でDLLを作らずにカンタンにプロセス間通信を行う方法

コンテンツ
ポジションとオーダーのヒストリー oandaのポジションとオーダーデータを24時間前まで追跡
ポジションとオーダーのヒストリー
oandaのポジションとオーダーデータを24時間前まで追跡
フィード
メタ情報
人気の商品
あわせて読みたい フィードメーター - finelworks.net

Return to page top