せっかくMT4(MetaTrader4)を使うなら、あなたオリジナルのEA(Expert Advisor)やインジケーターを自作してみませんか!?
初心者向けに、MQL4言語を使ったプログラミングについて解説しています。
今回は、OrderSend関数とOrderClose関数を解説します。
OrderSend()は、新規注文を送信する関数です。
OrderClose()は、保有ポジションの決済注文を行う関数です。
どちらもMQL4言語独自の関数であり、EA(Expert Advisor)作りでは必ず使う関数です。
簡単ですから、ぜひ挑戦してみましょう♪
MetaEditor の起動
サンプルコード「MACD Sample.mq4」を使って説明します。
MT4の「メタクォーツ言語エディタ」をクリックして、MetaEditorを起動しましょう。
MeTaEditorが立ち上がったら、画面左側の「Navigater」内のツリーから「Experts」をダブルクリックします。
「Experts」のツリーから「MACD Sample.mq4」をダブルクリックすると、ソースコードが開きます。
OrderSend関数
OrderSend()関数は、新規注文を送信する関数です。
正常に約定した場合はチケット番号を返し、正常に約定しなかった場合は「-1」を返します。
たくさんのパラメーターがあり、基本の成行注文や指値注文だけではなく、IFD注文やIFO注文の設定も簡単にできます。
次のように記述します。
int OrderSend(string symbol,int cmd,double volume,double price,int slippage,double stoploss,double takeprofit,string comment=NULL,int magic=0,datetime expiration=0,color arrow_color=clrNONE);
各パラメータは以下の意味を持っています。
・symbol:通貨ペア。
・cmd:注文タイプ。
・volume:ロット数。
・price:注文価格。
・slippage:最大スリッページ幅。
・stoploss:損切り価格。
・takeprofit:利食い価格。
・comment:注文コメント。
・magic:マジックナンバー。
・expiration:注文の有効期限(指値注文のみ)。
・arrow_color:チャート上の約定矢印の色。
「MACD Sample.mq4」の63行目を見てみましょう。
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
この式は、「変数”ticket”にOrderSend()の結果を代入する。」という意味になります。
変数”ticket”に、新規注文が約定した場合はチケット番号を、約定しなかった場合は「-1」を代入します。
新規注文の内容は以下のとおりです。
通貨ペアは現在表示しているチャートの通貨ペア(Symbol())です。
注文タイプは買い注文(OP_BUY)です。
ロット数は変数「Lots」です。変数「Lots」の値はプログラムの別の箇所で指定しています。
注文価格は現在の買値(Ask)です。つまり、成行注文です。
許容できる最大スリッページ幅は「3」Pointです。
損切り価格は「0」、つまり未設定です。
利食い価格は、現在の買値(Ask)にプログラムの別の箇所で指定している利食い幅(TakeProfit*Point)を足した価格です。
注文に付けるコメントは「macd sample」です。
マジックナンバー(注文の識別番号)は「16384」です。
約定した場合はチャートに緑色(Green)の矢印で表示します。
OrderClose関数
OrderClose()は、保有中のポジションを決済する関数です。
正常に終了した場合はtrue、失敗した場合はfalseを返します。
ちょっと工夫すれば、分割決済のような複雑な決済注文も自由自在にできます。
次のように記述します。
bool OrderClose(int ticket,double lots,double price,int slippage,int color color=CLR_NONE)
各パラメータは以下の意味を持っています。
・ticket:チケット番号。
・lots:ロット数。
・price:決済価格。
・slippage:最大スリッページ幅。
・color:チャート上の決済矢印の色。
「MACD Sample.mq4」の105~106行目を見てみましょう。
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError());
決済注文を出す際には、事前に決済するポジションを特定しておく必要があります。
そのため、92行目のOrderSelect()で保有中のポジションの有無を確認し、98行目のOrderType()で買いポジション(OP_BUY)を選択しています。
その上でののif文ですが、「もし正常に決済できなかった場合、エラーメッセージを吐き出す」という意味になります。
if()は条件分岐で、「()内の条件を満たしたら106行目のPrint命令を実行する」という意味になります。
()の中は、OrderClose()の前に否定を意味する「!」がついていますので、「OrderClose()が失敗したら」という意味になります。
決済注文の内容は以下のとおりです。
チケット番号は保有中のポジションのチケット番号(OrderTicket())です。
ロット数は保有中のポジションのロット数(OrderLots())です。
決済価格は現在の売値(Bid)です。つまり、成り行き注文です。
許容できる最大スリッページ幅は「3」Pointです。
決済した場合はチャートに紫色(Violet)の矢印で表示します。
まとめ
今回は、MQL4言語入門として、新規注文を行うOrderSend関数と決済注文を行うOrderClose関数について解説しました。
OrderSend関数とOrderClose関数を使いこなせるようになれば、新規注文をIFD注文やIFO注文にしたり、決済注文では分割決済するなどいろいろできるようになります。
EAやインジケーターを思いどおりに自作するために、ぜひ使いこなせるようになりましょう。