2019年1月5日土曜日
[MQL4] OnTick() 内で Bid, Ask を更新する方法
EA の OnTick()
処理中に Bid, Ask が更新されたとしても Bid
, Ask
変数にこれらの値は反映されません。
注文の実行時など、最新の値を使用したい時は RefreshRates() を使用すると Bid
, Ask
変数等を更新する事が出来ます。
動作確認
以下のような EA を作成して実行してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | void OnTick() { RefreshRates (); printf ( "A Ask: %s, Bid: %s, Volume: %d" , DoubleToStr (Ask, Digits ), DoubleToStr (Bid, Digits ), Volume[0]); Sleep (10000); printf ( "B Ask: %s, Bid: %s, Volume: %d" , DoubleToStr (Ask, Digits ), DoubleToStr (Bid, Digits ), Volume[0]); RefreshRates (); printf ( "C Ask: %s, Bid: %s, Volume: %d" , DoubleToStr (Ask, Digits ), DoubleToStr (Bid, Digits ), Volume[0]); } |
結果は以下です。
A Ask: 109.119, Bid: 109.111, Volume: 2 // 10 秒待機 B Ask: 109.119, Bid: 109.111, Volume: 2 // RefreshRates() 実行 C Ask: 109.120, Bid: 109.112, Volume: 11
B では10秒前の情報が保持されています。RefreshRates()
を実行すると最新の情報に更新されました。
戻り値について
RefreshRates()
の戻り値はエラーではなく、更新できたかどうかです。
例えば、以下のように OnTick()
の最初で RefreshRate()
を呼んでも、ほぼ間違いなく false
になります1。
1 2 3 4 5 | void OnTick() { bool refreshed = RefreshRates (); Print (refreshed); } |
注意点
RefreshRates()
は他スレッドとの排他が発生しているはずです。
そのため、あまり頻繁に呼ぶと動作が遅くなる可能性があります。
ただ、私の手元では目立った遅延は確認できませんでした。 それなりのスペックを持ったマシンであれば、ほとんど気にする必要は無いと思いますが、念の為。