証拠金が不足している
エラーコード 134とは
OrderSend時などに発生するエラーコード「134」は、証拠金が不足している場合に発生するエラーです。
エラーコード「134」を表す定数「ERR_NOT_ENOUGH_MONEY」を直訳すれば「十分な資金がない」となります。
要は証拠金が不足してるってことですね。
実はFX業者(Tradeview)から「証拠金不足の状態で注文送りまくってサーバーに負荷を与えているからEA見直してくんない?」という主旨のメールを頂きました。
ログを調べたところ、OrderSend Error 134 (not enough money)が大量に発生していることが判明。
開発者として格好悪いですね(^-^;
こういう問題はバックテストでは非常に気づきにくいです。
リアルタイムで動かしているからこそ分かるタイプのものです。
まだまだ修行が足りませんね。
対策は注文送信前に証拠金不足チェックを入れること
素通りでOrderSendを呼び出すからこの手の問題が発生するわけで、ならば事前にチェックしておけばいいんじゃないか?というのが自然な発想かと思います。
※不足しないだけの潤沢な資金を口座に入れとけって言うのは無しで(笑)
ですので、OrderSendを呼び出す前に、以下のチェックロジックを追加しましょう。
// 証拠金不足チェック
if(aCmd == OP_BUY || aCmd == OP_SELL){
if(AccountStopoutMode() == 0){ // パーセント
// 使用する金額
double usedMoney = AccountEquity() - AccountFreeMarginCheck(aSymbol, aCmd, aVolume);
if(usedMoney > 0.0){
if((AccountEquity() / usedMoney) * 100 <= AccountStopoutLevel()){
Print(TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " ",
__FILE__ + " ",
__FUNCTION__ + " ",
"Not enough money");
return(-1);
}
// 同ロットの両建てポジションを保有しようとするとusedMoneyが0になり、ゼロ割でクリティカルエラーが発生する。
// そのための対処。
}else{
if(AccountFreeMarginCheck(aSymbol, aCmd, aVolume) <= 0){
Print(TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " ",
__FILE__ + " ",
__FUNCTION__ + " ",
"Not enough money");
return(-1);
}
}
}else if(AccountStopoutMode() == 1){ // 金額
if(AccountFreeMarginCheck(aSymbol, aCmd, aVolume) <= AccountStopoutLevel()){
Print(TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " ",
__FILE__ + " ",
__FUNCTION__ + " ",
"Not enough money");
return(-1);
}
}
}
aCmdは注文種別(OP_BUYとか)、aVolumeはロット数、aSymbolは通貨ペア名を表しています。
return(-1)は関数の戻り値がbool型ならreturn(false)にします。
私のオリジナルライブラリーにもろに影響あるので、上記ロジックを追加しました。
上記ロジックを作成するにあたりEARNFOREXさんの記事「OrderSend Error 134 (No Enough Money)」を参考にさせていただきました。
当記事内では同ロットの両建てのケースが考慮されていなかったので、上記はそのケースも考慮済みとなっています。
ついでに、自動売買のON/OFFもチェックするようにしました。
// トレード許可チェック
if(IsTradeAllowed() == false){
Print(TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS) + " ",
__FILE__ + " ",
__FUNCTION__ + " ",
"Trade is not allowed");
return(-1);
}
これは別に無くても良いかなって当時思っていたのですが、どこでFX業者に迷惑かけているか分かりませんので、入れておくことにしました。
そうなると、OrderModifyのストップレベルのチェックも入れるべきなんでしょうが、あれを入れるとソースコードが汚くなるから嫌なんですよねぇ。
ん~。
「ストップレベルのエラーで注文変更ミスりまくってサーバーに負荷与えてるんだけど?」ってまた怒られたら修正することにします(笑)。
