再びzero divide in xxx.mq4

また出てしまいました。zero divide in xxx.mq4エラーです。

除数がゼロの場合に出るエラーだということは分かっていますが、私の作成したEAのどの部分で発生しているエラーなのか探す必要があります。

エラー原因のコードを探す

さて、どうやってエラー原因となっている関数?コード?を探しましょうか。少し面倒くさいですが、全ての関数の初めに「function A starts.」と「function A ends.」のような感じで、メッセージ出力しようと思います。

いや、かなり面倒くさいですね・・・。

void functionA(){
   Print("functionA starts.");
   //処理
   Print("functionB starts.");
}

でも、これをすれば、「functionA starts.」→「zero divide」エラー⇁「functionA ends.」という順番でメッセージが出力されるはずです。

あとは、エラーの再発を待つしかありません。

再度エラー発生

週末を越すように運用していたら、再度エラーがでました。

私の自作関数「ykAvgPricePosByLotsMagicNum」の直後に出てますね。関数のネーミングセンスがなくて悩んでます。自分にしか分からないですよね…と、思いましたが、自分が分かれば良いのです。

一歩進みましたので、この関数の中身を見ていこうと思います。

まずは、当関数の中に除算がないか探します。ありました。除数になっている変数の値をデバッグします。これもまたエラーの再発を待つ必要がありそうですね。

zero divideエラーの困ったところ

まだしっかりと検証はしていないのですが、

zero divideエラーが出るとEAがその後動かなくなる

ということです。このエラーが出た後は売買条件を満たしても発注をしてくれていません。

結論

除数がゼロの場合に出るエラーなので、プログラム内に割り算をしている個所を探し、除数がゼロでないかを確認します。今回の私の場合は、ショートポジションのナンピン判定の個所に誤りがありました。

ショートポジションの平均約定価格を計算する関数を作っており、ポジションの約定価格とそのロット数を乗じた合計を、最後に合計保有ロット数で割っています。その際に、間違ってロングポジションのロット数を計算してしまうようなプログラムになっていました。

タイミングによって、ロング決済直後にショートの平均約定価格を計算する処理になると、除数がゼロになってしまうため、このエラーが出ていたと考えられます。

よっさん
  • よっさん
  • 当サイトの管理人。ニューヨークの大学を飛び級で卒業。その後某日系IT企業でグローバル案件に携わる。マレーシアに1.5年赴任した経験を持つ。バイリンガルITエンジニアとしていかに楽に稼ぐか日々考えている。

1件のピンバック

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です