全決済ボタンのEAにエラー処理を追加する



今回も前回の続きです。

前回の「全決済ボタンのEAに売りボタンと買いボタンを追加する」で説明したEAはコンパイルすると警告メッセージが5つ出ています。この警告メッセージをなくすのと、簡単なエラー処理を追加してみます。

 

エラー処理を考える

一言にエラー処理と言っても色々な考え方があって、使う人によって変わってきたり、作るEAによっても変わってきます。

例えば、自動売買の場合だと、決済しようとしてエラーが出た時にリトライするのかそれともEAを停止するのかなど、出たエラーやEAの仕様によって変わってきます。

また、自分で作って自分で使うだけなら、エラーが出ないように使うなどすれば必要最低限のエラー処理で良いのではないかと思います。

今回のEAは、ボタンを押すとエントリーまたは決済するというEAなので、エラーが出たときは、ターミナルのエキスパートにエラー番号を表示させるだけのエラー処理にします。

 


オーダーセレクトのエラー処理

決済処理にある「OrderSelect(i, SELECT_BY_POS)」は戻り値を使っていないのでコンパイルするとここで警告メッセージが出ています。

このOrderSelectは、成功するとtrueが、失敗するとfalseが返ってきます。

ここにif文をつけて失敗した時(false)に、ターミナルのエキスパートにメッセージを出力して、次のループに移るようにします。

 

1行目 OrderSelectを実行して、その戻り値を直接if文でfalseと比較しています。OrderSelectは失敗するとfalseが帰ってくるので、失敗の時にif文の中の処理をします。

3行目 Print()はターミナルのエキスパートにメッセージを表示させる関数で、GetLastError()は最後に出たエラーのエラー番号を返す関数です。
Print(GetLastError())で、最後に出たエラー番号がターミナルのエキスパートに表示されます。

4行目 continueは、この下の処理をしないで次のループに移ります。

仕様は、OrderSelectでエラーが出たら、ターミナルのエキスパートにエラー番号を出力します。エラーが出たオーダーは処理をしませんが、ループ処理を継続させるのでエラーが出た後に条件に合うオーダーがあれば決済されます。

このあたりの処理の考え方は作る人によって違ってくると思います。例えば、エラーが出たときに、次のループに移らずにループを抜けるようにするなら「continue」ではなく「break」を使います。

 


決済をする時に出るエラー処理

OrderCloseも戻り値を使っていないのでコンパイルすると警告メッセージが出ます。

OrderCloseは、成功するとtrueが、失敗するとfalseが返ってきます。

ここもオーダーセレクトで説明したのと同じで、OrderCloseを実行してその戻り値を直接if文でfalseと比較しています。エラーが出た場合はターミナルのエキスパートにエラー番号を表示させて、次のループに移り、処理を続けるようにします。

OrderCloseは買い決済用と売り決済用の2か所あるので両方にコードを追加します。

自動売買のEAだと、GetLastError()でエラー番号を拾って、その番号によってリトライや停止などの処理をするようですが、今回はボタンと言うことで、エラー番号を表示させて次のループに移り処理を継続する仕様にしています。

 


エントリーの時に出るエラー処理

売り注文と買い注文のOrderSendにも戻り値があります。この戻り値を使っていないため警告メッセージが出ています。

OrderSendの戻り値は、成功するとチケット番号が返ってきて、失敗すると-1が返ってきます。

 

売りのOrderSendのコード

ここでは、OrderSendを実行して、その戻り値が0より小さい場合if文の中の処理をするようにしています。エラーが出た場合はPrint(GetLastError())でターミナルのエキスパートにエラー番号を表示させます。

 

買いのOrderSendのコード

買いのOrderSendの処理の仕方は、売りと同じです。

 


全コード

今回のエラー処理を追加したことで、5か所出ていた警告メッセージはなくなっています。

 

※このサンプルコードは、EAが使えない口座では使うことが出来ません。

当サイトに掲載している情報やサンプルコードを利用した結果によって生じるいかなる損害、損失について当サイトは一切の責任を負いません。サンプルコードにはバグなどがある可能性もあります。当サイトの情報やサンプルコードの利用は、自己責任でお願いします。


おすすめ記事

リアル口座のトレード収支結果です。   EA名:KonohaUSDJPY 通貨ペア:USDJPY 使用FX業者:OANDA JAPAN(東京サーバー) バージョン:1.00 パラメーター:すべて初期値 約定日時…

EAの長期間のバックテストをするにはMT4にヒストリカルデータを入れる必要があります。 今回は、一番簡単にできるMetaQuotes社のヒストリカルデータの入れ方と、FXDDのヒストリカルデータをダウンロードしてインポー…

関連記事

今回は、EAにボタン、テキストボックス、ラベルの配置方法と使い方を説明します。   目次 ボタンの配置方法テキストボックスの配置方法ラベルの配置方法オブジェクトの削除ボタン、テキストボックス、ラベルの使い方全コ…

今回は、「全決済ボタンをEAで作ってみる」で説明したEAに、通貨ペアとマジックナンバーの処理を追加します。   目次 通貨ペアの処理を追加するマジックナンバーの処理を追加するパラメーターの追加マジックナンバーの…

MT4にはデバッグ機能が備わっています。前は無かったのですがBuild 600から実装されました。   目次 デバッグ時の通貨ペアと時間足の変更ブレークポイント変数の確認デバッグの注意点コンパイル時のエラーの探…

今回は、マジックナンバー別の口座履歴をcsvファイルに出力させるスクリプトの作り方を説明します。   目次 スクリプトのテンプレートの作り方口座履歴を出力するスクリプトの作り方今回説明するスクリプトの仕様ファイ…

MT4の標準機能では、複数のボジションを一度に全部決済することが出来ないようです。ないものは作れば良いというのがMT4の最大の特徴ではないでしょうか? 今回は、チャート上にボタンを配置して、そのボタンを押すと保有している…