さて前回は、デモ口座上のMT4用EAで発生した、「ERR_COMMON_ERROR」にどう対処するのか検討している様子を書きました。今回は、新たに発見した「ERR_COMMON_ERROR」発生とその原因の仮説をかいてみたいと思います。
まずは今回の記事の発端は、MT4の「Expert」タブに出力しているログで、エラー検出しているものを抽出して精査してみて気付いたから。
とりあえず、どういう環境で何をなぜログを精査したのかという話から。
まず以前の記事で書いたデモ口座環境の詳細を書いてみると。
【デモ口座環境詳細】
------------------------
1.テスト用デモ口座1(口座開設予定FX業者(Forex.com)のMT4)
「旧SmoothMADIシステム」(5分足版)×6通貨ペア
テスト用EA(5分足)×4通貨ペア
2.テスト用デモ口座2(口座開設予定FX業者(Forex.com)のMT4)
3.テスト用デモ口座3(FREEZELEVEL設定FX業者(FXDD)のMT4)
テスト用EA(5分足)×4通貨ペア
4.テスト用デモ口座4(ECN系FX業者(ODL)のMT4)
テスト用EA(5分足)×4通貨ペア
------------------------
次は、上記4つのデモ口座で一体何をしているのかという話。
【今どんな評価をしてるいるのか】
----------------------------------
最初は、実際に使う予定の「旧SmoothMADIシステム」を5分足にすることで売買回数を増やして、潜在バグを見つけようとしていたけど、売買ルールの特性上、せっかくエラーが発生しても、OrderModify()がほとんど。なので、OrderSend()とOrderClose()の回数をもっと増やした共通部品テスト用のEAを作成して途中から追加。
テスト用EAを追加したもう一つの理由としては、「旧SmoothMADIシステム」では「成り行き注文」と「決済指値」は使わないので、そこもテストしたかったから。
そして今回、「Expert」タブに出力しているログファイルの中からメール通知されない”[[INFO]]"レベルのログを抽出して、精査してみた。(ログ出力レベルを定義した記事はコレ)
"[[WARN]]"/"[[CRITICAL]]"レベルはメールで通知されているから、発生したことがわかっているけど、
"[[INFO]]"レベルの発生事象については、メール通知しないので、ログの精査が必要。
"[[INFO]]"レベルの発生事象については、メール通知しないので、ログの精査が必要。
本番になったら、異常が発生しない限りログを見る事はほとんど見ないと思うけど、今はまだテスト段階なので、精査して異常な動きが無いかを見るべき時期。
つまり、ログを精査することで、いろんな異常や改善点に気付けるから。
●元々の「テスト計画」はどこいった?
以前のブログ記事で書いた「テスト計画」を本来は進めたいけど、いかんせん初のMT4でのEA
プログラミング。実際に動かして何が起きるのかを把握しておかないと、緻密にテストしたところで
的外れなロジックになっていたら意味が無い。
なので、今回「警告メール」で見つけたバグ改修を優先させて、EAの動作が落ち着いてから
「テスト計画」に基づいたテストをする事に変更した。
----------------------------------
そして、ログ精査をやってみると。
「ERR_COMMON_ERROR」発見!!
【なぜ「ERR_COMMON_ERROR」がメール通知されなかったのか】
----------------------------------
なぜ「ERR_COMMON_ERROR」が、メール通知されない"[[INFO]]"レベルのログ出力になっていたかと言うと、OrderClose()失敗時にはエラーコードによらず、チケット番号指定でOrderSelect()して、OrderCloseTime()がゼロじゃなければ(つまり決済されていれば)、"[[INFO]]"レベルのログ出力はするけど、メール通知しないロジックにしていたから。
ちなみに前回記事でも「ERR_COMMON_ERROR」が発生したのは、OrderClose()時。
じゃあなぜ前回記事では"[[CRITICAL]]"レベルで、今回は"[[INFO]]"レベルなのかという事なんだけど、前述のOrderSelect()時では、以前の記事に書いたOrderSelect最新化処理が抜けていたから。
----------------------------------
また修正箇所増えちゃった。。。
【結局、前回発生した「ERR_COMMON_ERROR」の原因は?】
----------------------------------
つまるところ、OrderClose()時に既にSL/TPによる決済がされていたら、「ERR_COMMON_ERROR」が返ってくるという仮説がでてきた。
ヘルプを読む限り、実在チケット番号で決済済みポジションを操作しようとした場合、「ERR_INVALID_TRADE_PARAMETERS」が返却されるべきなので、結論としては、おそらくサーバ側バグ。
今回も前回も「ERR_COMMON_ERROR」が発生していたのは、「4.テスト用デモ口座4(ECN系FX業者(ODL)のMT4)」だけ。
ただ、この「ODL」の環境でも、OrderModify()時に既にSL/TPによる決済がされていた場合は、ちゃんと「ERR_INVALID_TRADE_PARAMETERS」が返却されている。
次に、他のデモ口座環境のログを2つのエラーコードで発生状況を調べてみると、「ERR_COMMON_ERROR」は発生してなくて、OrderModify時に「ERR_INVALID_TRADE_PARAMETERS」が発生していただけ。
なので、結局のところ、サーバ固有の問題なのか、サーバ共通的な問題なのかは不明。
少なくとも、OrderClose()時に「ODL」のサーバが返却したエラーコードの「ERR_COMMON_ERROR」はサーバ側のバグ。他のサーバは同じバグがあるのかが不明。
★2011/06/15 追記
その後、「Forex.com」のサーバ でも同様の事象が発生した事を確認
★2011/06/15 追記
その後、「Forex.com」のサーバ でも同様の事象が発生した事を確認
----------------------------------
【共通部品として「ERR_COMMON_ERROR」への対応はどうする?】
----------------------------------
今回のブログ記事での検討結果によって、前回のブログ記事で書いた「ERR_COMMON_ERROR」への対応内容を変更すべきかどうか考えてみた。
すくなくとも前回「警告メール」で発生した「ERR_COMMON_ERROR」エラーは、決済済みオーダに対するOrderClose()が原因。
原因が判明して、他の原因で「ERR_COMMON_ERROR」は発生していない事を考えると、「ERR_COMMON_ERROR」は、なかなか発生しないエラーコードと考える事もできる。
----------------------------------
ついにヨメから、
「オチ無くなったよね」
って言われた。。
そして、EAプログラムソース修正が進まず、「FXシステムトレード初心者奮闘記」の「MT4用EA開発時代」は、新たなバグが出ない限り、「OrderSelect問題」仮説の検証に進むかもしれないのでした。
#今回初めて、デモ口座で使ってるMT4のFX業者名を出してしまった。。。
0 件のコメント:
コメントを投稿