今回の記事は自分の備忘録としての意味もあります。
メタトレーダーで新規成行注文を出すときには、約定価格をAskまたはBidに指定するのが一般的です。
しかし、AskとBidはスタート関数呼び出し時に代入されるため、OrderSend()関数実行までの間にタイムラグがあると現在価格とずれてしまい、発注エラーになってしまうことがあります。
これを防ぐための有効手段としては、
①MarketInfo()関数によって現在価格を取得する
②RefreshRates()関数によってAskとBidの値を更新する
あたりがあります。
念のために②について、今回ちょっと実験してみました。
上のように、A,B,Cという3種類の注文を出します。
Aは、スタート関数呼び出し直後の発注で、許容スリッページの幅を狭くしてあります。
Bは、その10秒後に発注で、許容スリッページの幅を広くしてあります。
Cは、その後の発注で、その直前にRefreshRates()関数を実行し、スリッページを狭くしてあります。
そして、上記、A→B→Cという発注を10回繰り返しました。
その結果、成行き注文方式のブローカーでは、AとCの注文は通りますが、Bの注文でいくつかエラーが出ました。
ところが、カウントダウン方式のブローカーでは、すべて通りました。
ということは、カウントダウン方式のブローカーでは、RefreshRates()関数によるAskとBidの更新は必要なく、常に現在価格で約定してくれるということのようです。
ちなみに、カウントダウン方式のブローカーでは、OrderSend()関数であれ、OrderClose()関数であれ、許容スリッページの幅をいくらに設定しても問題なく、常に注文は通るようです。
コメントをお書きください