ヾ(´・ω・`)ノ゙

2016年07月24日

昨日のやつちょっと補足(´・ω・`)


昨日よっぱらてて書き忘れてました(´・ω・`)

昨日の共有メモリを使ったMT4とpythonのやり取りのやつを作ったとき
最初に書いたものは
まずPythonが共有メモリにコマンドを書き込み
MT4のOnTimerが呼ばれたときにコマンドが書き込まれてるかチェックして・・・
というやり方を取っていたのですが、OnTimerは1秒間に65回程度しか呼べなかったので
(PCの環境にも依存するらしいのですが僕のとこでは65回くらいでした)
OnTimerのチェックの直後にコマンドが書き込まれると15ミリ秒くらいの空き時間があるのかぁ
といった感じだったんですが
(こんな感じで試してみました)
2016_07_24_1698.png

プログラミングとMT4に詳しい方になにかいい方法ありますでしょうか?
と質問したところいくつかの案を教えてもらいました。

それで教えてもらった案のなかからすぐに実装できそうな、
faiさんとこにあった強制的にティックを呼ぶ方法を使うやり方に変更しました

pythonのctypesモジュールを使って
msg = ctypes.windll.user32.RegisterWindowMessageA('MetaTrader4_Internal_Message')
としておいて、コマンドを書き込んだら
ctypes.windll.user32.SendMessageA(hwnd, msg, 2, 1)
とやるようにしたら
2016_07_24_1699.png
これはhelo worldの文字列を返してくるコマンドを呼び出してみてるんですが
こんなかんじで1秒の間に500回くらい呼び出すことができるようになりました

2016_07_24_1701.png
hello worldの変わりにGetMicrosecondCount()の値を返させてみてもすべて違う値が返ってきたので
正しく回数分呼び出されてるみたいです(´・ω・`)
(pythonは1ミリ秒のsleepのループ処理をしながらMT4が返却データを用意するのを待つようにしてます)

ちなみに単にSendMessageAのループをまわしたらもっと多い回数のOnTickを呼び出せるのですが
それだとpythonでSendMessageAした回数よりOnTickのほうが呼び出される回数が少ないという現象になりました



しげちーいつごろ出てくるのかと思ってたら来週登場するみたい(´・ω・`)
2016_07_24_1700.png



ラベル:Python MT4 MQL4
posted by hage at 23:49| python | このブログの読者になる | 更新情報をチェックする