自動売買にポジションを決済させるにはどうしたら良いの?
OrderClose関数とは
条件に当てはまったときに、ポジションを自動的に決済(クローズ)して欲しいですよね!
そこで、OrderClose関数を使います。
OrderClose関数とは、ポジションを1つ選択し、決済注文を出す関数です。
実行させることで、FX会社に決済注文を出してくれます。
決済できるポジションの種類は、以下の通りです。
- 保有ポジション
- 指値ポジション
- 逆指値ポジション
つまり、注文を出したポジションであれば、どんなポジションでも決済できます。
OrderClose関数をプログラムに組み込んで、自動的にポジションを決済させてみましょう。
OrderClose関数の書き方
OrderClose関数の使い方は、基本的な関数と同じです。
関数をマスターしていない方はこちらの記事が参考になります。
基本的な書き方
OrderClose関数の基本的な書き方は以下の通りです。
分かりやすいように、引数を省略しています。
bool orderClose = OrderClose( ①, ②, ③, ④, ⑤);
このように、返り値は bool型で、引数は5つあります。
まずは返り値から見ていきましょう。
返り値(戻り値)
OrderClose関数の返り値は bool型です。
「true」または「false」が返ってきます。
数値にすると「1」または「0」です。
true 、false が返ってくる条件は以下の通りです。
- true : 決済注文がFX会社に受理されたとき
- false : 決済注文が失敗したとき
もし falseが返ってきた場合、ポジションは決済されていないので、再度 OrderClose関数を実行する必要があります。
ですが、99%以上は正常に受理されるので、そこまで気にする必要はありません。
もし決済に失敗していた場合は、手動で決済しましょう。
引数
OrderClose関数の引数は5つあります。
まずは、一覧でザッと見てみましょう。
番号 | データ型 | 引数名 | 内容 |
① | int | ticket | 決済するポジションのチケット番号 |
② | double | lots | 決済するロット数 |
③ | double | price | 希望する決済価格 |
④ | int | slippage | スリッページの許容量(単位0.1pips) |
⑤ | color | arrow_color | チャート上の決済情報の色を設定 |
それぞれ詳しく見ていきながら、一緒に作っていきましょう。
① ticket
ticket には、決済したいポジションのチケット番号を入力します。
チケット番号を直接入力しても良いのですが、OrderSelect関数でポジションを選択している場合、OrderTicket関数を使うことができます。
OrderTicket関数は、選択しているポジションのチケット番号を返す関数です。
チケット番号を覚えておく必要がなくなるため、簡単に書くことができます。
bool orderClose = OrderClose( OrderTicket(), ②, ③, ④, ⑤);
② lots
lots には、決済したいポジションのロット数を入力します。
こちらも OrderSelect関数でポジションを選択している場合、OrderLots関数という便利な関数が使えるようになりますので、OrderLots関数を利用すると良いでしょう。
OrderLots関数は、ポジションのロット数を返す関数です。
bool orderClose = OrderClose( OrderTicket(), OrderLots(), ③, ④, ⑤);
③ price
price には、決済する価格を入力します。
こちらも同様に、OrderSelect関数でポジションを選択している場合、OrderClosePrice関数が使えますので、OrderClosePrice関数を使いましょう。
OrderClosePrice関数は、現在の価格を返す関数です。
bool orderClose = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), ④, ⑤);
④ slippage
slippage には、スリッページを入力します。
単位は0.1pipisです。
FXでは、希望する決済価格と、実際の決済価格がズレることがあります。
そのときに許容するズレ幅を入力してください。
ここでは、「10」を入力します。
bool orderClose = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 10, ⑤);
⑤ arrow_color
arrow_color には、決済したときにチャート上に表示される矢印の色を設定します。
「矢印が表示されるのが邪魔」という方は、「clrNONE」と入力しましょう。
clrNONE にすることで、矢印が透明になり、チャート上に見えなくなります。
bool orderClose = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 10, clrNONE);
OrderClose関数の具体的な使い方(サンプルあり)
ここまでは、OrderClose関数の基本的な書き方を解説しました。
ここからは、もっと具体的に OrderClose関数の使い方を見ていきましょう。
OrderClose関数は、事前にポジションを選択する必要があるため、OrderSelect関数と組み合わせて使われることが多いです。
例えば、以下のようなプログラムです。
//保有ポジションを一つずつチェックしていく
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
//保有ポジションを一つ選択
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
//選択したポジションが、実行されている通貨ペアと同じかどうかチェック
if(OrderSymbol() == Symbol())
{
//選択したポジションが、この自動売買のマジックナンバーと同じかチェック
if(OrderMagicNumber() == magicNumber)
{
//ポジションを決済
bool orderClose = OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), 10, clrNONE);
}
}
}
}
OrderSelect関数以外にも、注文系の関数をたくさん使っています。
使っている関数の一覧は以下の通りです。
全て OrderClose関数を使うために必要な関数です。
これらの関数は MT4に標準装備されているので、書くだけで使えます。
ちなみに上記のプログラムを実行すると、全てのポジションが決済されてしまうので、if文で適宜条件を付け加えてください。
まとめ
OrderClose関数は、保有ポジションを決済する関数です。
基本的に OrderSelect関数と組み合わせて使います。
他にも便利な関数を使うことで、OrderClose関数を簡単に使うことができます。
サンプルプログラムに条件を付け加えて、検証してみてください。