裁量トレードをしていると、ポジション変更注文をしたいと思えるようなタイミングが度々あります。
実はEAを運用している場合でも、そういった行動をとりたくなるようなシーンが意外に多くあるのも事実です。
このようにEA上でポジションの変更注文を出したいと思った際に役立つのがOrderModify関数です。
今回は、OrderModify関数の概要やMQL4での実装方法について解説していきましょう。
こんな方におすすめ
- OrderModify関数を理解したい
- EAでポジション変更の注文を出したい
- MQL4のEAを高機能なものにしたい
目次
OrderModify関数とは
OrderModify関数は、ポジションの変更注文を行うためのコードです。
ここでは、変更できるポジションの種類と変更可能な内容について解説しましょう。
OrderModify関数で変更できるポジションの種類
変更できるポジションは、以下の2つです。
- 予約ポジション(指値・逆指値)
- エントリー後のポジション
予め設定しておいた予約ポジションを、OrderModify関数を使って変更注文を設定することができます。
これはEAを実行する前に数値を再設定できるため、便利です。
また、エントリー後のポジションもOrderModify関数を使用して変更することが可能です。
最初に設定した通りに動くEAは正常ですが、柔軟な変更注文ができるEAは融通が利きます。
OrderModify関数で変更できる内容
OrderModify関数は、以下の4つの内容を変更できます。
- 予約ポジションの注文価格
- 損切り価格
- 利確価格
- 予約ポジションの有効期限
しかし、次の2つの内容はOrderModify関数では変更できません。
- ロット数の変更
- 取得価格の変更
これらの変更はOrderModify関数でできないため、導入前に知っておくことが重要です。
OrderModify関数の書き方
OrderModify関数の具体的な書き方を見ていきましょう。
OrderModify関数は特殊な記述をする必要はなく、他の関数と基本的な構造は同じです。
bool orderModify = OrderModify( ①, ②, ③, ④, ⑤, ⑥);
上記のように、①から⑥までの6つのスペースに引数を入力します。
返り値はbool型で、プラスかマイナスの2つの選択肢を持つデータ型です。
そのため、記述の冒頭にboolと入力しましょう。
特に複雑な記述は必要ありませんが、引数を正確に入力することが重要です。
OrderModify関数の戻り値
OrderModify関数の返り値(戻り値)について解説します。
戻り値または返り値とは、関数を実行した結果として返される値のことです。
OrderModify関数では、先ほど触れたように2択のbool型を使用しています。
そのため、戻り値は「true」や「false」、または「1」や「0」の形で表示されます。
戻り値の条件は以下の通りです。
- true:変更注文が正常に完了したら表示される
- false:変更注文が失敗したら表示される
trueが表示された場合、変更注文は成功したことを意味し、falseが返された場合は変更注文が失敗しています。
もしfalseが返された場合は、再度OrderModify関数を実行する必要があります。
また、設定値などを手動で変更する必要があります。
ただし、OrderModify関数の場合は、通常の通信環境で正しく記述されていれば、ほとんどのケースで注文は正常に成功します。
OrderModify関数の引数
先ほど紹介したOrderModify関数の引数について解説します。
OrderModify関数の引数は以下のようなものがあります。(左はデータ型、右は引数)
- ①int ticket:変更したいポジションのチケット番号の指定
- ②double price:変更後の価格部分
- ③double stoploss:変更後の損切り価格部分
- ④double takeprofit:変更後の利確価格部分
- ⑤datetime expiration:変更後の有効期限の設定
- ⑥color arrow_color:チャート上に表示される矢印の色
これらの引数に対応する記述は以下のようになります。
bool orderModify = OrderModify( ①, ②, ③, ④, ⑤, ⑥);
まず①のticketからみていきましょう。
int ticket
ticketは、変更したいポジションのチケット番号を指定します。
直接数字を入力することもできますが、一般的にはOrderTicket関数とOrderSelect関数を組み合わせて使用します。
OrderTicket関数は選択中の注文のチケット番号を返す関数であり、OrderSelect関数は指定したチケット番号のオーダーを選択する関数です。
つまり、OrderSelect関数でポジションを選択し、OrderTicket関数によってその番号を指定するという使い方が一般的です。
この方法を使うと、直接数字を入力するよりもスムーズに対象のポジションを指定できます。
記述例)OrderTicket関数で指定
bool orderModify = OrderModify(OrderTicket(), ②, ③, ④, ⑤, ⑥)
double price
priceは、変更後の取得価格を指定する引数です。
予約ポジション(指値注文、逆指値注文)の場合のみ変更できますが、既にエントリーしたポジションについてはこの引数で変更することはできません。
エントリーしたポジションの場合、エントリーした価格を入力するようにしましょう。
直接金額を入力する方法もありますが、OrderOpenPrice関数を使用することでスムーズに指定できます。
OrderOpenPrice関数はポジションの価格を自動的に取得する関数であり、直接入力する必要がありません。
記入例)OrderOpenPrice関数を使用した場合
bool orderModify = OrderModify( ①, OrderOpenPrice(), ③, ④, ⑤, ⑥);
double stoploss
stoplossは変更したい損切り価格を指定する引数です。
直接価格を入力することができますが、注文処理のためには現在の価格より下に設定する必要があります。
注意点がありますが、以下の方法で損切り価格を指定できます。
- 0:損切なしの場合に入力
- 損切り価格:現在の価格より下に設定する
- OrderStopLoss関数:変更前の損切り価格が自動設定される
損切り価格を変更したくない場合は、OrderStopLoss関数を入力しましょう。
記入例)変更前の損切価格のままにしたい場合
bool orderModify = OrderModify( ①, ②, OrderStopLoss(), ④, ⑤, ⑥);
double takeprofit
takeprofitは損切りの逆で、利確価格を指定する引数です。
こちらも注意が必要で、現在の価格より上の金額を指定することが重要です。
利確価格も以下の方法で指定できます。
- 0:利確価格を設定しない場合
- 利確価格:現在の価格より上の金額を指定
- OrderTakeProfit関数:変更前の利確価格
変更前の利確価格を維持する場合、OrderStopLoss関数ではなく、OrderTakeProfit関数を入力します。
記入例)変更前の利確価格にしたい場合
bool orderModify = OrderModify( ①, ②, ③, OrderTakeProfit(), ⑤, ⑥);
datetime expiration
expirationはポジションの有効期限を指定する引数です。
予約ポジションのみ設定できますが、エントリーしたポジションには使用できません。
指定方法としては、次の2つがあります。
- 直接時間を指定する
- OrderExpiration関数:変更前の有効期限のままにする
直接時間を指定する場合は、以下のように記述します。(2023年10月22日00時00分00秒)
datetime expiration = D’2023.10.22 00:00:00′;
記入例)変更前の有効期限を維持する場合
bool orderModify = OrderModify( ①, ②, ③, ④, OrderExpiration(), ⑥);
color arrow_color
arrow_colorは変更注文時に表示される矢印の色を設定する引数です。
以下の2つの指定方法が可能です。
- 色を付けない:「0」または、clrNONE
- 色を指定する:clr色名
色を指定する場合、例えば黒を指定するには以下のように記述します。
clrBlack
記入例)赤色を指定する場合
bool orderModify = OrderModify( ①, ②, ③, ④, ⑤, clrRed);
OrderModify関数の使い方
最後にこれまで説明した引数を用いたサンプルコードを解説します。
米ドル円が105円になったら変更注文を出し、利確価格を115円にするという意味です。
void OnTick()
{
//---
// 保有ポジションを1つずつ確認する
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
// 保有ポジションを1つだけ選択する
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
// 選択したポジションが、実行されている通貨ペアと同じかチェックする
if (OrderSymbol() == Symbol())
{
// 選択したポジションが、この自動売買のマジックナンバーと同じかチェックする
if (OrderMagicNumber() == 1000)
{
// 変更注文を出す部分で、今回紹介したOrderModify関数を使用する
bool orderModify = OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), 115.000, OrderExpiration(), clrRed);
}
}
}
}
}
注意点としてこのサンプルコードをそのまま使うと、ひたすら変更注文が出されてしまうので、注文を出す条件を設定しましょう。
コメントを残す