FXの取引所で約定率〇〇%!などよく見かけませんか?
それって本当なのでしょうか?
今回は、そんな約定率に関する考察とEAでの約定拒否への対応をまとめました。
そもそも約定とは
FXで約定を簡単にいってしまうと、成行注文をしたときに売買が成立する。成行だけではなくあらゆる注文(成行・指値・逆指値)を含みます。
既に保有中のポジションの利確したときに成立すること。(ストップロス・利確)
約定〇〇%は本当か?
結構、取引所のうたい文句として約定率〇〇%!などが見受けられます。
結論から言うと、FXであまり利益を出していない方に対しては約定率は本当です。
約定率〇〇%はあえていうと100%でないということです。
すなわち残り数%はリクオート(約定拒否)発生しますよと明言しています。
じゃあ、残り数%のリクオート(約定拒否)はどういうときに発生するのか?
リクオート(約定拒否)の発生理由
知られているのは、市場の急な上下(ボラリティー)が発生したときに、取引所側でのデータ処理がある一定を超えてしまうため、それ以上は受けれませんということで、リクオート(約定拒否)が発生します。
しかし、このリクオート(約定拒否)は結論でも述べた通り、利益をあまり出していない人はあまり発生しません。
利益を出している人は結構な頻度で発生します。
実際に弊EAの「Lucky777」を運用していると1日数回は発生しています。
なぜ利益を出している人はリクオート(約定拒否)が発生するのか
FXをやっている方は下記について聞いたことがあるかもしれません
- Aブック
- Bブック
ここで簡単にAブック、Bブックについて記載します。
後日、Aブック、Bブックについては詳細を記載します。
Aブックとは
ざっくり言うと、市場にユーザーからの注文を発注、手数料を取る取引所を言います。
注文があればあるほど、取引所は手数料を貰えるため、利益向上になります。
Bブックとは
ざっくり言うと、市場にユーザーからの注文を発注せず、あたかも発注したかのようにシステム上に見せます。
つまり、ノミ業者です。(悪い業者とは言ってない)
FXは8割の方が負けると言われています。
ユーザーが負けた分がすべて利益となるため、Bブックの収益率はAブックに比べてとても良くなります。
リクオート(約定拒否)はAブック・Bブックのどちら?
利益を出している人のリクオート(約定拒否)を受けるのは圧倒的にBブックが多いです。
Aブックの場合は、市場次第で本当に上下(ボラリティー)が激しいときにリクオート(約定拒否)が発生します。
しかし、Bブックの場合は、少しの上下(ボラリティー)でも簡単にリクオート(約定拒否)が発生します。
そのため、リクオート(約定拒否)を意識した取引を行わないといけません。
手動で取引を行っている場合は、リクオート(約定拒否)の発生はすぐわかるため、その場で対応が可能です。
EA(自動売買)の場合には、そのまま放置すると大変なことになります。
EAでのリクオート(約定拒否)対策
ここで本題のEAでの対応についてです。
EAの場合、OrderSend関数にて注文を発注しますが、リクオート(約定拒否)が発生すると返却値[-1]が返却されエラーコードには下記が設定されてます。
エラーコード | ID | 内容 |
---|---|---|
138 | ERR_REQUOTE | レート再提示 |
今まで私が経験したのはリクオート(約定拒否)が発生する時間は大体数秒~長くても3分以内でした。
そこで、Ordersendを行う場合、リクオート(約定拒否)されても注文が通るまで発注するというものです。
今回は決済時のコードを参考に記載しておきます。
//指定マジックナンバーの注文を全決済する
void CloseALLMagic(int MAGIC)
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
int OS = OrderSelect(i, SELECT_BY_POS);
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MAGIC)
{
int type = OrderType();
bool OC = false;
switch(type){
case OP_BUY:
for(int n = 5; n >= 0; n--){
if(IsTradeAllowed() == true){
RefreshRates();
if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE)){
break;
}
}
Sleep(100);
}
//OC = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE);
break;
case OP_SELL:
for(int n = 5; n >= 0; n--){
if(IsTradeAllowed() == true){
RefreshRates();
if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE)){
break;
}
}
Sleep(100);
}
//OC = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE);
break;
case OP_BUYLIMIT:
case OP_BUYSTOP:
case OP_SELLLIMIT:
case OP_SELLSTOP:
OC = OrderDelete(OrderTicket());
break;
}
}
}
}
ここでのPOINTは
for(int n = 5; n >= 0; n--){
if(IsTradeAllowed() == true){
RefreshRates();
if(OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE)){
break;
}
}
Sleep(100);
}
5回までループを回し、決済が完了するまで100ミリ秒間隔で繰り返すことでリクオート(約定拒否)されても5回までチャレンジします。
繰り返し回数とSleep時間を調整することで、リクオート(約定拒否)されても絶対に注文するマンが出来上がります。
ただし、絶対に注文されるまで、繰り返しつづけるとスリッページのような仕様となり、不利な価格での注文可能性があります。
何回か注文を繰り返し、それでもリクオート(約定拒否)された場合は、私の場合は、LINEなどで通知を行い、手動で判断し取引を行っています。
LINE通知については、別途記事に致します。
おわりに
私が利用しているEAでは複数のポジションを一度に決済をするのです仕様ですが、そこでリクオート(約定拒否)がかなりの頻度で発生してしまい、EAの正常な動作をしなくなる場合が多々ありました。
単に運が良かったので、そこまで損は発生しませんでした。
貴方もBブックでのお取引や急なボラリティーでのリクオート(約定拒否)に悩まされている(本当は悩まされる前に!)のであれば、すぐに対策を講じた方が良いです。