信頼できる仕掛け注文関数

アイキャッチ

MQL4標準の仕掛け注文関数は穴だらけ

各種仕掛け注文(成行、指値、逆指値)を出す、MQL4の標準関数にOrderSend()があります。

注文が必ず通るのであれば、OrderSend()を使えば良いわけですが、実際はそうでもありません。

市場の動きが早くて許容スリッページ内で執行できなかったり、ネットワークの調子が悪くて通信エラーが発生したり、FX業者によっては約定拒否されたりして、うまく注文できない場合があります。

その場合、OrderSend()だけでは不十分で、注文失敗時のフォローが必要になります。

というわけで、OrderSend()の注文が失敗した時を考慮した仕掛け注文関数を紹介します。

orderSendReliable()の引数をOrderSend()と同じにすることで、導入しやすくしています。OrderSend()の代わりにorderSendReliable()を使うことで、より信頼できる仕掛け注文を行えるようになります。

orderSendReliable()とは別に、orderType2String()という関数を定義しています。これは、指定した注文種別の数値(成行注文の場合、0)を文字列(成行注文の場合、BUY)に変換する関数です。ログを見る際、数値では意味が分かりにくいですからね。

orderSendReliable()は単独では起動しません。定数(MAX_RETRY_TIME、MILLISEC_2_SEC)の利用を前提にしているためです。プログラム全体で使い回す値は定数化なりグローバル変数化しておくと便利です。MAX_RETRY_TIMEは注文失敗時の最大リトライ時間を表す定数です。MILLISEC_2_SECはミリ秒を秒の単位に変換するための定数です。

orderSendReliable()のポイントは、利食い/損切り価格が現在価格に近すぎないか、MarketInfo(aSymbol, MODE_STOPLEVEL)とMarketInfo(aSymbol, MODE_FREEZELEVEL)で注文前に確認している点と、一時的エラーによる注文失敗時はif(GetTickCount() – startTime > MAX_RETRY_TIME * MILLISEC_2_SEC){で制限時間までリトライする点です。繰り返しリトライできるように、while(true)で注文処理を無限ループさせています。そして、制限時間に到達したら、ループから抜け出すようにしています。

あと、最適化かバックテストの場合は、注文失敗時によるリトライには意味がないので(最適化かバックテストの場合、何度やっても状況は改善されないので)、一回注文失敗した時点で、if(IsOptimization() || IsTesting()){で強制終了させています。

余談ですが、ECN/STPタイプのFX業者の場合、仕掛け注文時に損切りと利食い価格を同時に指定できないため、損切りと利食いを指定せずに注文後、すぐにOrderModify()で注文変更するテクニックが書籍や記事で紹介されていることがありますが、2014/12/17現在のMT4では解消されていることがMQL4フォーラムで確認されています。そのため、orderSendReliable()では、ECN/STP業者かどうかを考慮していません(する必要がありません)。

なお、orderSendReliable()を作成するにあたって、豊嶋久道氏の「FXメタトレーダー実践プログラミング」、7bit氏の「common_function.mqh」及びMatthew Kennel氏らの「LibOrderReliable.mq4」を参考にしました。

サンプルEA

関数だけではイメージが沸きづらいと思いますので、サンプルEAを載せておきます。

ブログランキングに参加中!

ポチっとクリック頂けると励みになります♪
(クリックしてもランキング一覧が表示されるだけですが、それでOKです)

  にほんブログ村 為替ブログ FX システムトレード派へ

コメントを残す



14 − 3 =