自動でポジションの損切りや利確ラインを変更するにはどうしたらいいんだろう?
OrderModify関数とは
ポジションの損切や利確の価格を変更したいときはありませんか?
損切りや利確はエントリーするとき(OrderSend関数)に設定するのが一般的ですが、エントリー後でも変更することができます。
自動売買でポジションの変更注文を出すには、OrderModify関数を使います。
OrderModify関数は、ポジションの変更注文を出す関数です。
変更できるポジションの種類は以下の通りです。
- エントリー後のポジション
- 予約ポジション(指値・逆指値)
つまりどちらかのポジションであれば、変更注文を出すことができます。
しかし変更できる内容には制限があります。
もちろんロット数や取得価格を変更することはできません。
変更できる内容は以下の4つです。
- 予約ポジションの注文価格
- 損切り価格
- 利確価格
- 予約ポジションの有効期限
特に、損切り価格や利確価格を変更するときに、OrderModify関数がよく使われます。
少し上級者向けの関数ですが、OrderModify関数の使い所は多いので、覚えてしまいましょう。
OrderModify関数の書き方
OrderModify関数の使い方は、基本的な関数と同じです。
関数をマスターしていない方はこちらの記事が参考になります。
基本的な書き方
OrderModify関数の基本的な書き方は以下の通りです。
簡単のために引数を省略しています。
bool orderModify = OrderModify( ①, ②, ③, ④, ⑤, ⑥);
OrderModify関数の返り値は bool型で、引数は6つあります。
まずは返り値から見ていきましょう。
返り値(戻り値)
OrderModify関数の返り値は bool型です。
「true」や「false」という値が返ってきます。
数値にすると「1」や「0」です。
true や false が返ってくる条件は以下の通りです。
- true:変更注文が正常に完了したとき
- false:変更注文が失敗したとき
もし、false が返ってきた場合、変更注文が失敗しているため、再度 OrderModify関数を実行する必要があります。
ですが、注文の99%は正常に完了するため、そこまで気にしなくても大丈夫です。
もし変更注文が失敗していた場合は、手動で変更しましょう。
引数
OrderModify関数の引数は6つあります。
引数が多いので、一つ一つゆっくり見ていきましょう。
まずは一覧で確認します。
番号 | データ型 | 引数名 | 内容 |
① | int | ticket | 変更したいポジションのチケット番号 |
② | double | price | 変更後の価格 |
③ | double | stoploss | 変更後の損切り価格 |
④ | double | takeprofit | 変更後の利確価格 |
⑤ | datetime | expiration | 変更後の有効期限 |
⑥ | color | arrow_color | チャート上の矢印の色 |
それぞれ詳しく解説しますので、一緒に OrderModify関数を作っていきましょう。
① ticket
ticket には変更したいポジションのチケット番号を入力します。
ポジションのチケット番号を直接入力しても良いですが、OrderTicket関数という便利な関数があるので、それを使うと良いでしょう。
OrderTicket関数を実行する前に、OrderSelect関数でポジションを選択しておく必要がありますので、注意してください。
bool orderModify = OrderModify(OrderTicket(), ②, ③, ④, ⑤, ⑥)
② price
price には変更後の取得価格を入力します。
こちらは予約ポジション(指値注文、逆指値注文)の場合のみ変更可能です。
エントリー後のポジションの場合は、取得価格を変更できないので注意しましょう。
エントリー後のポジションを指定する場合は、エントリーしている価格を入力します。
ここでも便利な関数として、OrderOpenPrice関数というものがありますので、利用してみてください。
bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), ③, ④, ⑤, ⑥)
③ stoploss
stoploss には、変更後の損切り価格を入力します。
ここで注意していただきたいのは、stoplossの価格は、現在の価格より下に設定する事です。
もし現在の価格より、有利な価格を入力すると、注文が通りません。
エラーにはなりませんが、「変更注文を出したのに、処理されてない!」ということになる可能性もあるので、stoplossの価格設定には注意しましょう。
stoplossで設定できるのは以下の3通りです。
- 0
- 損切り価格
- OrderStopLoss関数
0の場合は、損切りなしに設定します。
損切り価格を入力した場合は、その価格に損切りが入ります。
OrderStopLoss関数を利用した場合は、変更前の損切り価格が設定されます。
もし損切り価格を変更せずに、他の項目を変更したい場合は、OrderStopLoss関数を使うと良いでしょう。
bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), ④, ⑤, ⑥)
④ takeprofit
takeprofitには変更後の利確価格を入力します。
stoplossの入力と同じように、現在の価格より上でなければ注文が通りません。
takeprofitで設定できるのは以下の3通りです。
- 0
- 利確価格
- OrderTakeProfit関数
0の場合は、利確なしに設定します。
利確価格を入力した場合は、その価格に利確が入ります。
OrderTakeProfit関数を利用した場合は、変更前の利確価格が設定されます。
他の項目を変更する場合は、OrderTakeProfit関数を利用すると良いでしょう。
ここでは、利確価格を変更するため、以下のように入力します。
bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 110.000, ⑤, ⑥)
⑤ expiration
expirationには、ポジションの有効期限を入力します。
この引数はほとんど使わないので、読み飛ばしていただいても大丈夫です。
expirationは予約ポジションのみ設定が可能です。
エントリー後のポジションには使えませんので、ご注意ください。
expirationはdatetime型の変数なので、datetime型の形式に合わせないとエラーが出ます。
例えば、以下のような形式です。2021年9月22日00時00分00秒まで有効という設定です。
datetime expiration = D’2021.09.22 00:00:00′;
このように少し厄介な引数なので、基本的に OrderExpiration関数を使用すればOKです。
OrderExpiration関数は、変更前の有効期限を返す関数です。
そのため、有効期限を変更しない場合は、この関数を使用すれば問題ありません。
bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 110.000, OrderExpiration(), ⑥)
⑥ arrow_color
最後にarrow_colorの設定です。
こちらは、変更注文を出した位置に印がつくのですが、その色を設定します。
色をつけなくても良い場合は、「0」または、clrNONEと入力してください。
透明になりますので、チャート分析の邪魔にならないかと思います。
もし色をつけたい場合は、「clr○○」という特殊な変数がありますので、そちらを利用すると良いでしょう。
私は、clrRedが好きなので、clrRedを設定しています。
bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 110.000, OrderExpiration(), clrRed)
OrderModify関数の引数のまとめ
ここまでOrderModify関数の引数を、ざっと見てきました。
stoplossやtakeprofitの価格設定には気をつけるようにしてください。
また、両方同時に変更することもできるので、両方変更したい場合は、価格を入力すると変更できます。
変更する前の情報を取得するには、以下の関数が便利です。
- OrderStopLoss関数
- OrderTakeProfit関数
- OrderExpiration関数
以下のプログラムはOrderModify関数の完成例です。
bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 110.000, OrderExpiration(), clrRed)
これで基本的な書き方はマスターできたと思いますので、具体的な使い方も見ていきましょう。
OrderModify関数の具体的な使い方
OrderModify関数は変更注文を出す関数です。
もし注文が通らなかったり、トレーリングストップのように連続で注文を出すのは危険です。
そのため、必ずif文で条件をつけてください。
特にDD方式を採用しているFX業者で取引している場合は、最悪口座凍結になる可能性もありますので、ご注意ください。
具体的には、「ドル円が105円になったら、変更注文を出す」というように条件をつけましょう。
また、OrderModify関数を使う場合、事前にOrderSelect関数を実行しておく必要がありますので、以下のように書くと良いでしょう。
void OnTick()
{
//---
//保有ポジションを一つずつチェックしていく
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
//保有ポジションを一つ選択
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
//選択したポジションが、実行されている通貨ペアと同じかどうかチェック
if(OrderSymbol() == Symbol())
{
//選択したポジションが、この自動売買のマジックナンバーと同じかチェック
if(OrderMagicNumber() == 1000)
{
//変更注文を出す
bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 110.000, OrderExpiration(), clrRed);
}
}
}
}
}
このプログラムの中には、OrderModify関数以外にも、以下の関数が使われております。
これらの関数は、MQLに標準で搭載されている関数なので、新しく関数を作る必要はありません。
ちなみに、上記のプログラムを実行すると、永遠に変更注文が出されてしまうので、条件をつけてください。
まとめ
OrderModify関数は、ポジションの変更注文を出す関数です。
基本的にOrderSelect関数を組み合わせて使います。
OrderModify関数は上級者向けの関数なので、もっと重要なOrderSend関数などを習得したほうが良いでしょう。
ただ、トレーリングストップのプログラムを作成する場合、必須となる関数です。
そのため、必要になったら勉強すると良いでしょう。
サンプルプログラムも公開しておりますので、引数の値を変えてみて、試してみてください。