2019/05/25

MT4 複数ポジションの一括決済の方法

 

Warning: Use of undefined constant full - assumed 'full' (this will throw an Error in a future version of PHP) in /home/toshikatsu/allneko.club/public_html/sinka/wp-content/themes/elephant2/single.php on line 56

この記事を書いている人 - WRITER -
neko.bio合同会社代表のtoshikatsuです。主にSES事業をしています。自身も出向もしています。読書、宇宙、オカルト、アニメ・ゲーム、音楽、ピアノなどが好きです。 FXでは移動平均線、ボリンジャーバンド、エリオット波動、日柄を使っています。
詳しいプロフィールはこちら

僕のルールに

  • トレンドが継続するときは利乗せする。
  • 決済サインが出たら全て決済する。

というルールがあります。利乗せすると保有ポジションが2つ以上になります。決済サインが出たら同じタイミングで全てのポジションを決済しなければなりません。

書籍には複数ポジションの一括決済の方法が載ってなかったので自分なりの方法をメモっておきます。

while文とOrderClose()でポジションが無くなるまで決済する

このコードの肝はOrderSelect関数の第1引数を0に指定することです。

OrderSelect関数第1引数はインデックス番号か、チケット番号を指定できます。今回はインデックス番号で指定しています。

仮にポジションを3つ持っている場合、インデックス番号0,1,2にポジションが割り当てられています。

最初は以下のようにOrdersTotal関数から、ポジションの数を取得して、for文を使って全てのポジションを決済しようとしてました。

しかし、これだと3回目のループでインデックスエラーが起こります。

原因はOrderClose()でポジションを決済すると、OrderSelect()の第1引数で指定できるインデックスが変化することです。

ポジションが3つある場合にはOrderSelect()の第1引数に0,1,2を指定すればそれぞれのポジションを選択できます。

しかし、OrderClose()で決済するとポジションの数が1つ減り、OrderSelect()の第1引数で指定できるインデックス番号は0,1の2つです。

 

iを0からordersTotal-1までインクリメントすると上手くいきませんが、逆にiをordersTotal-1から0までデクリメントすればfor文でも正常に動作します。

(おまけ)決済に成功したかチェックする

OrderClose関数で戻り値(bool型)をチェックしないと警告が出ます。

そのためにclosed変数を使ってエラー処理を追加しています。

この記事を書いている人 - WRITER -
neko.bio合同会社代表のtoshikatsuです。主にSES事業をしています。自身も出向もしています。読書、宇宙、オカルト、アニメ・ゲーム、音楽、ピアノなどが好きです。 FXでは移動平均線、ボリンジャーバンド、エリオット波動、日柄を使っています。
詳しいプロフィールはこちら
 

  関連記事 - Related Posts -

 

  最新記事 - New Posts -

 

- Comments -

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

Copyright© allneko.club , 2018 All Rights Reserved.