MetaTrader4(MT4)でのEAにおいて、利益確定・損切り注文を出すには、以下の3つの方法があります。
- エントリー注文を出すと同時に、利益確定・損切り注文を出す(「OrderSend()関数」を使用)。
- エントリー注文を出した後に、当該注文を修正して、利益確定・損切り注文を出す(「OrderModify()関数」を使用)。
- 利益確定・損切り条件に合致したら、別途、保有ポジションの決済注文を出して、利益確定・損切りする(「OrderClose()関数」を使用)。
上記1.及び2.の方法による場合には、利益確定・損切り注文の存在が取引業者のサーバーに送られることになりますが、3.の方法による場合にはそのようなことはありません。
したがって、利益確定・損切り注文の存在を取引業者に認識されたくない場合には、3.の方法によることになります。
1.OrderSend()関数を使用する
OrderSend()関数を使用して、エントリー注文と同時に利益確定・損切り注文を設定するためには、OrderSend()関数の第6引数(double stoploss)に具体的な損切り価格を、第7引数(double takeprofit)に具体的な利益確定価格を記述します。
- OrderSend()関数の詳細については「こちら」を参照してください。
サンプルコード
成行買い注文を出すと同時に、エントリー価格の50pips上に利益確定、25pips下に損切りを設定する。
Symbol()関数の詳細については「こちら」を参照してください。
Pointとは、MQL4であらかじめ定義されている変数で、提示レートの最小変動数を格納しているものです。例えば、提示レートが「100.123」であれば「0.001」がPointに格納されており、提示レートが「1.2345」であれば「0.0001」がPointに格納されています。
2.OrderModify()関数を使用する
⑴ カウントダウン方式への対応
MT4における成行注文には、「カウントダウン方式(Market Execution)」と「それ以外(Instant Execution)」の2つがあり、FX業者はいずれかの方式を採用しています。
カウントダウン方式とは、市場の成行きに任せた価格で約定がなされるもので、当該方式を採用しているFX業者が提示しているレートは、あくまでも参考価格とされるものです。
「カウントダウン方式」と「それ以外」には、以下のような違いがあります。
「カウントダウン」と「それ以外」の違い
約定価格 | MT4上で表示されているレートに基づいて約定されるとは限らない。 | MT4上で表示されているレートに基づいて約定される。 |
SL/TPの設定 | エントリー注文と同時に設定できない。 | エントリー注文と同時に設定できる。 |
上の表の「SL/TPの設定」に示したような違いがあるため、カウントダウン方式を採用している業者を使用して成行注文に対する利益確定・損切り注文を出すためには、以下のような手順を経ることが必要となります。
- いったん利益確定・損切り注文を設定しない注文を出す(「OrderSend()関数」を使用)。
- 上記注文が約定し、ポジションを保有した後に、注文を修正して、利益確定・損切りの設定をする(「OrderModify()関数」を使用)。
⑵ カウントダウン方式かどうかの識別
使用するFX業者がカウントダウン方式を採用しているかどうかは、「ツールバー」上の「新規注文」アイコンをクリックすると表示される、「注文の発注」ダイアログボックス上の「注文種別」欄を確認することによって、識別することができます。
注文種別の欄に、「成行注文」と表示されている場合には、カウントダウン方式を採用しておらず、「カウントダウン」と表示されている場合には、カウントダウン方式を採用していることになります。
⑶ OrderModify()とは
OrderModify()とは、MQL4であらかじめ定義されている関数で、すでに約定した注文や、発注したが、まだ約定していない待機注文に修正・変更を加えるものです。
OrderModify()関数の詳細については「こちら」を参照してください。
⑷ サンプルコード
成行買い注文が約定した後に、エントリー価格の50pips上に利益確定、25pips下に損切りを設定する。
なお、OrderOpenPrice()とは、MQL4であらかじめ定義されている関数で、選択している注文の約定値(待機注文の場合は発注価格)を取得するものです。
OrderOpenPrice()関数の詳細については「こちら」を参照してください。
- OrderTicket()関数の詳細については「こちら」を参照してください。
3.OrderClose()関数を使用する
利益確定・損切りの条件が整った段階で、OrderClose()関数を実行して保有ポジションを決済することによって、あらかじめ利益確定・損切り注文を出していたのと同様の効果を得ることができます。
- OrderClose()関数の詳細については「こちら」を参照してください。
具体例
買いポジションを保有している状態で、現在価格がエントリー価格から50pips以上上昇している場合に利益確定し、25pips以上下落している場合に損切りする。