2012年2月24日金曜日

マケスピからDLLインジェクションで株価をリアルタイムに引き抜く

辿り着いたアイデアはこうだ。

Softgateも行なっているDLLインジェクションは マケスピに同梱されている
楽天証券のアプリケーションサーバーと通信を行うDLLに対して行なっている。
無論、非公開I/Fであるし I/Fが変われば途端に使用できなくなるので、今日から使えません
となると、それはそれで困る。

今回のアプローチは、「見えてるんだから、それを取得すれば良い」という姿勢はそのままに
GDIインターフェースへのアクセスをフックする事により、値を引きぬいてはどうかというアイデアだ。
全てのWindowsアプリケーションはOSによって提供されているAPIを使う事で
ウィンドウを生成し、アイコンを表示し、フォントを描画している。
マーケットスピードも例外ではない。
マケスピからOSのDLLへのアクセスを乗っ取り、その引き渡されたパラメータを利用する。
これをDLLインジェクションと呼ぶが、これを行うには それ相当の知識がいる。
普通のエンジニアでも、やる事がやる事だけにあまり触れる機会は無いだろう。

で、簡単なDLLインジェクションならできたが、OSに影響を与えず かつ
高頻度で変化する値を取得するには、マルチスレッドで 値を取り込む側と
取り込んだ値を処理し、自分の日経平均計算や急騰検出コードに送り込まなければいけない。
マルチスレッドで下手に排他処理を行えば、他のアプリどころかOSそのものが不安定に
なってしまう。

さらに他にも問題がある。DLLインジェクションを行うにはマケスピからだけ
値を取得したいので、その他のアプリケーションは正常に動作してくれないといけない。
普通に実行すると、全てのプロセスでインジェクションが行われてしまう。
もっと言えば、あるAPIを乗っ取ると元のそのAPIを呼べないので 描画が行えなくなってしまう。
それはそれでかなり問題だ。

安定的にkernel32やuser32へのアクセス記録が取れればそれで良いので
いくつかフリーのツールを試してみた。しかし、クラッシュが頻発するわ
うまくフックできないわ、結局 自分のプログラムにデータを送り込まないと
いけないわで、よろしくない。
まだいくつか試していないツールもあるので、これから検証していく事にする。

マーケットスピードからのリアルタイムな株価抜き

楽天証券のマケスピから株価やら出来高を受け取る方法は、一般的にはRSSだと思う。
自分も最初は、エクセルではなくDDE通信でリアルタイムに値を受け取って
Cのプログラムで日経平均やら急騰銘柄の検出をやろうとした時期がある。
実際、リアルタイムに値を受け取ることができた。
300銘柄からのホットリンク通信で値を取り込み、ログに書きだす事もできる。
これは簡単。

ただ、このやり方には問題があった。
RSSの価格と本体の方の値動きがかなり時間差がある。ザラバの急騰銘柄を検出して
即発注しようとしているのに、この時間差は無視できない。
しかもRSSの銘柄の上限数は、300だし。

そこで、マーケットスピード本体の方から値をぶっこ抜こうと試みた。
多重起動のできるらしいし。

一般的に知られている方法としては、Softgate で配布しているものを利用したりするのだが
C#な上に、DLLインジェクションを行なっていて さらに非公開のI/Fを使っているので
MarketSpeedのバージョンがあがると使えなくなる可能性がある。
そして、最近はメンテされていないようだ。

だから、こう考えた。

目で見えているんだから、マケスピ上に刻々と変化する数字をキャプチャし、文字認識方法だ。

で、実際やってみた。
MarketSpeedのWindowハンドルを取得し Client領域のビットマップを取得する。
ウィンドウが重なったりすると、原理上キャプチャできないが これで フルカラーの
ビットマップが得られる。
銘柄コード・価格・出来高の数字は、黄色・赤・緑の色いづれかなのでこれで2値化を行う。
さらに反転表示されている場合は、その領域を反転してからこの処理を実施する。



白黒2値のキャプチャ画像が得られた所で、領域分割を行う。
行毎に隙間があるのと、項目毎のX座標を予め記憶させ
目的の銘柄の株価なり出来高なりを文字認識により得る。

この方法は実際うまくいった。
しかし、処理が重かった。

全画面に広げたアプリをキャプチャして毎回画像処理してるのだから
当然というば当然だが、かなり悔しかった。
1アプリでこの有様だから、多重起動しても さらに処理が追いつかないだろう。

そして、次のアイデアにたどり着くことになる。(次の記事へ続く)






2012年2月23日木曜日

とりあえず。

楽天証券のマーケットスピードで投資(投機?)で儲ける道のりを書いていこうかと思います。
既にアイデアは、あるので適宜公開していく予定。
基本的にデイトレ。高回転。