ホーム > タグ > C#
C#
MT4でDLLを作らずにカンタンにプロセス間通信を行う方法
- 2007-08-26 (日)
- FX | Programming
ここの所、障害対応と仕様変更対応ぐらいしか仕事がなくてとっても暇です。
んで暇つぶしに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から売買シグナルを発信し、それを受け取った外部システムがブラウザや売買システムを自動操縦して発注するなんてことも出来ますね。怖いけど。
Home > タグ > C#


