MetaTrader4(MT4)には、複数の保有ポジションを一括して決済するという機能が標準装備されていません。
そこで、複数の保有ポジションを一括して決済するスクリプト(Close All Positions.mq4)の作成方法について解説します。
1.全体像
MT4でスクリプトを作成するには、以下の手順に従ってプログラムを書いていくことになります。
- #property命令を記述する。
- 変数の宣言を行う。
- start()関数内に具体的な処理内容を記述する。
具体的には、以下のようになります。
以下のサンプルコードをダウンロードして記事を読み進めてください。
2.#property命令の記述
スクリプトを作成するには、まず最初に「#property命令」を記述します。
スクリプトの作成に使用する「#property命令」には、以下の2つがあります。
- #property show confirm
- #property show inputs
「#property show confirm」と記述すると、スクリプトをチャートにドラッグ&ドロップした際に、スクリプトの実行を確認する以下のようなダイアログボックスが表示されます。
「#property show inputs」と記述すると、パラメーター等の、スクリプトの各種設定を行うことのできる以下のようなダイアログボックスが表示されます。
作成するスクリプトに、設定しなければならないパラメーターが存在する場合には「#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()関数内に記述されたコードについて解説します。
⑴ IsTradeAllowed()とは
IsTradeAllowed()とは、MQL4であらかじめ定義されている関数で、自動売買が許可されているかどうかをチェックするものです。
IsTradeAllowed()関数の詳細については「こちら」を参照してください。
⑵ Alert()とは
Alert()とは、MQL4であらかじめ定義されている関数で、以下のようなポップアップメッセージを表示させるものです。
Alert()関数の詳細については「こちら」を参照してください。
「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では、いったんポジションが決済されると、各ポジションに付されたインデックスが再び古いものから順に『0』から振り直される」という点に、その理由があります。
具体的には、「古いものから新しいものへ」という順にポジションを選択していくように記述すると、以下のような結果となり、「すべてのポジションを決済することができない」という問題が生じます。
一方で、「新しいものから古いものへ」という順にポジションを選択していくように記述すると、以下のような結果となり、すべてのポジションが決済されます。