OrderSend Error 134 (not enough money) エラーの原因と対策

証拠金が不足している

エラーコード 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のストップレベルのチェックも入れるべきなんでしょうが、あれを入れるとソースコードが汚くなるから嫌なんですよねぇ。

ん~。

「ストップレベルのエラーで注文変更ミスりまくってサーバーに負荷与えてるんだけど?」ってまた怒られたら修正することにします(笑)。

MT4の無料プログラミング講座

メルマガ登録して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG