保有ポジションを一括決済する

 MetaTrader4(MT4)には、複数の保有ポジションを一括して決済するという機能が標準装備されていません

 そこで、複数の保有ポジションを一括して決済するスクリプト(Close All Positions.mq4)の作成方法について解説します。

  1. 全体像
  2. #property命令の記述
  3. 変数の宣言
  4. 具体的な処理内容
  5. 補 論
  6. 関連ツール

1.全体像

 MT4でスクリプトを作成するには、以下の手順に従ってプログラムを書いていくことになります。

  1. #property命令を記述する。
  2. 変数の宣言を行う。
  3. start()関数内に具体的な処理内容を記述する。

 具体的には、以下のようになります。

Download (PDF, 412KB)

>>目次に戻る

2.#property命令の記述

 スクリプトを作成するには、まず最初に「#property命令」を記述します。

 スクリプトの作成に使用する「#property命令」には、以下の2つがあります。

  • #property show confirm
  • #property show inputs

 「#property show confirm」と記述すると、スクリプトをチャートにドラッグ&ドロップした際に、スクリプトの実行を確認する以下のようなダイアログボックスが表示されます。

Close All Positions 02
スクリプトの実行を確認するダイアログボックスが表示される

 「#property show inputs」と記述すると、パラメーター等の、スクリプトの各種設定を行うことのできる以下のようなダイアログボックスが表示されます。

Close All Positions 03
スクリプトの各種設定を行うことのできるダイアログボックスが表示される

 作成するスクリプトに、設定しなければならないパラメーターが存在する場合には#property show inputsを記述し、それ以外の場合には#property show confirmを記述します。

>>目次に戻る

3.変数の宣言

 「変数」の詳細については「こちら」を参照してください。

 「Close All Positions.mq4」では、ポジションの決済は成行きで行われるため、パラメーターとして許容スリッページ数を設定します。

 許容スリッページ数は、スクリプトをチャートに適用した際に任意の値に設定できるようにするため、以下に示すように「外部変数」(詳細については「こちら」を参照してください。)として宣言します。


extern int Slippage = 100;

 なお、許容スリッページ数の単位は「ポイント」です。「ポイント」とは、提示レートの最小変動数を表します。

 例えば、提示レートが「100.123」であれば、「0.001」が「1」ポイント、提示レートが「1.2345」であれば、「0.0001」が「1」ポイントとなります。

 すなわち、上記のように許容スリッページ数を「100」と記述した場合、提示レートの小数点以下の桁数が「3」又は「5」であれば、許容スリッページ数を「10pips」と設定したことと同様となります。

>>目次に戻る

4.具体的な処理内容

 「Close All Positions.mq4」におけるstart()関数内に記述されたコードについて解説します。

Close All Positions start()
具体的な処理内容の記述

⑴ IsTradeAllowed()とは

 IsTradeAllowed()とは、MQL4であらかじめ定義されている関数で、自動売買が許可されているかどうかをチェックするものです。

 IsTradeAllowed()関数の詳細については「こちら」を参照してください。

⑵ Alert()とは

 Alert()とは、MQL4であらかじめ定義されている関数で、以下のようなポップアップメッセージを表示させるものです。

Alert 01
ポップアップメッセージが表示される

 Alert()関数の詳細については「こちら」を参照してください。

 「Close All Positions.mq4」では、スクリプトをチャートに適用した際に自動売買が許可されていない場合には、以下のようなポップアップメッセージが表示されます。

Alert 02
「Close All Positions.mq4」での表示

⑶ OrderSelect()とは

 OrderSelect()とは、MQL4であらかじめ定義されている関数で、注文を選択するために使用するものです。

 OrderSelect()関数の詳細については「こちら」を参照してください。

⑷ OrderClose()関数内の引数について

 OrderClose()関数(詳細については「こちら」を参照してください。)の第一から第三引数に記述されているコードの意味は、以下のとおりです。

  • OrderTicket()
    OrderTicket()とは、MQL4であらかじめ定義されている関数で、選択した注文のチケット番号を取得するものです。
    OrderTicket()関数の詳細については「こちら」を参照してください。
  • OrderLots()
    OrderLots()とは、MQL4であらかじめ定義されている関数で、選択した注文のロットサイズを取得するものです。
    OrderLots()関数の詳細については「こちら」を参照してください。
  • OrderClosePrice()
    OrderClosePrice()とは、MQL4であらかじめ定義されている関数で、選択した注文の決済価格を取得するものです。
    OrderClosePrice()関数の詳細については「こちら」を参照してください。

⑸ for()とは

 for()とは、for()文と呼ばれるもので、一定の処理を指定した回数だけ繰り返して実行させるために使用するものです。

 for()文の詳細については「こちら」を参照してください。

 「Close All Positions.mq4」においては、for()文を用いて、「新しいものから古いものへ」という順にポジションを選択していき、すべてのポジションがなくなるまで、OrderClose()関数を実行して成行決済していく、という処理を実行するようにしています。

 OrderClose()関数の詳細については「こちら」を参照してください。

>>目次に戻る

5.補 論

 「Close All Positions.mq4」におけるfor()文では、「新しいものから古いものへ」という順にポジションを選択していくように記述しています。

 「古いものから新しいものへ」という順にポジションを選択していくように記述しないのは、「MT4では、いったんポジションが決済されると、各ポジションに付されたインデックスが再び古いものから順にから振り直される」という点に、その理由があります。

 具体的には、「古いものから新しいものへ」という順にポジションを選択していくように記述すると、以下のような結果となり、「すべてのポジションを決済することができない」という問題が生じます。

Old to New
古いものから順に選択していくと、決済されないポジションが生じる

 一方で、「新しいものから古いものへ」という順にポジションを選択していくように記述すると、以下のような結果となり、すべてのポジションが決済されます

New to Old
新しいものから順に選択していくと、すべてのポジションが決済される

>>目次に戻る

6.関連ツール

MT4でも快適な裁量トレードを提供します
MT4スピード注文
MT4スピード注文 | fx-on.com

MT4スピード注文
MT4スピード注文 | fx-on.com

 上記ツール(MT4スピード注文MT4スピード注文 | fx-on.com)の詳細については「こちらMT4スピード注文 | fx-on.com」を参照してください。

 なお、上記ツールは、fx-onを通じて「FOREX.com」又は「外為ファイネスト」に口座を開設すると、無料でもらうことができます。


FOREX.com × ツール3点セット 口座開設で選んでもらえるプレゼントキャンペーン


外為ファイネスト インジケータ3本まとめてプレゼント タイアップキャンペーン

>>目次に戻る


MT4の使い方からプログラミングまで、わかりやすく解説