せっかくMT4(MetaTrader4)を使うなら、あなたオリジナルのEA(Expert Advisor)やインジケーターを自作してみませんか!?
初心者向けに、MQL4言語を使ったプログラミングについて解説しています。
今回は、よく使う用語だけを集めたお手軽リファレンスを作りました。
EA(Expert Advisor)やインジケーターを自作するときに、きっと役立つと思います。
コメントの記述方法
コメントとは、プログラムに関係しないメモです。
長いソースを書いた場合など、コメントを入れておくと後で編集するときに役に立ちます。
コメントの記述方法は、次の2通りあります。
//
単一コメント。
スラッシュ2本で始まり、改行で終わります。
/* */
複数行のコメント。
/* で始まり */ で終わります。
データ型(変数・配列の宣言)
データ型とは、コンピュータにおけるデータ(値)の種類に関する分類です。
変数や配列は、データ型を事前に宣言しておく必要があります。
宣言では、型と名前を指定します。
int
整数を扱うデータ型です。
bool
真(=true)か偽(=false)の2値をとるデータ型です。値はtrueかfalse、または1か0です。
double
小数を扱うデータ型です。整数と小数点と少数で構成されています。
datetime
日付時刻を扱うデータ型です。
void
戻り値を返さない場合に使います。
定義済み変数・配列
MQL4言語に最初から定義されている変数と配列です。
宣言は不要です。
Ask
現在の買値です。
Bars
バーの本数です。
Bid
現在の売値です。
Close[]
各バーの終値が格納された配列です。
配列の最後である現在のバーは0として格納されます。
Digits
現通貨ペアの価格の小数点以下の桁数です。
High[]
各バーの高値が格納された配列です。
配列の最後である現在のバーは0として格納されます。
Low[]
各バーの安値が格納された配列です。
配列の最後である現在のバーは0として格納されます。
Open[]
各バーの始値が格納された配列です。
配列の最後である現在のバーは0として格納されます。
Point
現通貨ペアのMT4での取引最小単位です。
※PointはFX業者によって異なる
「小数点以下:2桁/4桁」のFX業者なら、1Pointは、USDJPYなら0.01円、EURUSDなら$0.0001です。
「小数点以下:3桁/5桁」のFX業者なら、1Pointは、USDJPYなら0.001円、EURUSDなら$0.00001です。
※Pointとpipsの違い
pipsは「小数点以下:2桁/4桁」のFX業者を基準とした最小取引単位です。1pipsは、USDJPYなら0.01円、EURUSDなら$0.0001です。
Time[]
各バーの開始時間が記録された配列です。
1970.1.1AM0:00:00から経過した時間(秒)を datetime 型で表したデータです。
配列の最後である現在のバーは0として格納されます。
Volume[]
各バーの出来高が記録された配列です。
MT4では、出来高はティックが動いた回数をあらわします。
配列の最後である現在のバーは0として格納されます。
口座情報関数
口座情報は、アカウントのパラメータを返す関数です。
AccountFreeMargin()
アカウントの余剰証拠金を返します。
AccountBalance()
アカウントの口座残高を返します。
取引関数
取引関数は、取引注文や取引管理を行うための関数です。
OrderClose()
保有中の注文を決済します。
正常に終了した場合はtrue、失敗した場合はfalseを返します。
bool OrderClose(int ticket,double lots,double price,int slippage,int color color=CLR_NONE)
パラメータ
ticket:チケット番号。
lots:ロット数。
price:決済価格。
slippage:最大スリッページ幅。
color:チャート上の決済矢印の色。

OrderMagicNumber()
選択した注文のマジックナンバー(識別番号)を返します。
OrderSelect()関数で事前に選択している必要があります。
OrderModify()
保有中や待機中の注文を修正します。
正常に終了した場合はtrue、失敗した場合はfalseを返します。
bool OrderModify(int ticket,double price,double stoploss,double takeprofit,datetime datetime expiration,color arrow_color=CLR_NONE)
パラメータ
ticket:チケット番号。
price:新しい注文価格。
stoploss:新しい損切り価格。
takeprofit:新しい利食い価格。
expiration:新しい有効期限。
arrow_color:チャート上の新しい損切りと利食いの矢印の色。
【例】OrderModify()を使ってトレーリングストップ機能を実装してみよう

OrderOpenPrice()
選択した注文の約定価格を返します。
OrderSelect()関数で事前に選択している必要があります。
OrderSelect()
注文データを選択します。
正常に終了した場合はtrue、失敗した場合はfalseを返します。
bool OrderSelect(int index,int select,int pool=MODE_TRADES)
パラメータ
index:注文チケットインデックス。
select:選択タイプ。「SELECT_BY_POS」か「SELECT_BY_TICKET」のいずれか。
pool:注文プール。「MODE_TRADES」(規定値)か「MODE_HISTORY」のいずれか。
OrderSend()
新規注文を行います。
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:チャート上の約定矢印の色。

OrderStopLoss()
選択した注文の損切り価格を返します。
OrderSelect()関数で事前に選択している必要があります。
OrdersTotal()
保有中と待機中の注文の総数を返します。
OrderSymbol()
選択した注文の通貨ペア名を返します。
OrderSelect()関数で事前に選択している必要があります。
OrderTakeProfit()
選択した注文の利食い価格を返します。
OrderSelect()関数で事前に選択している必要があります。
OrderTicket()
選択した注文のチケット番号を返します。
OrderSelect()関数で事前に選択している必要があります。
OrderType()
選択した注文の注文タイプを返します。
OrderSelect()関数で事前に選択している必要があります。
値は次のいずれかになります。
・OP_BUY:買いポジション
・OP_SELL:売りポジション
・OP_BUYLIMIT:買い指値ポジション
・OP_BUYSTOP:買い逆指値ポジション
・OP_SELLLIMIT:売り指値ポジション
・OP_SELLSTOP:売り逆指値ポジション
テクニカル指標
テクニカル指標は、標準インジケータやカスタムインジケータの計算を行う関数です。
iATR()
ATRを計算して、その値を返します。
ATR(Average True Range)とは、1日の平均的な値幅のことです。
double iATR(string symbol,int timeframe,int period,int shift)
パラメータ:
symbol:通貨ペア。NULLは現在の通貨ペアです。
timeframe:時間枠。0は現在のチャートの時間枠です。
period:計算する平均期間。
shift:インジケーターバッファから取得するインデックス値(現在のバーを基準に指定したバーの本数だけ過去にシフトする)。
【例】double val = iATR(NULL,0,12,0);
【例】ATRを使ったトレーリングストップ機能を実装してみよう

iBands()
ボリンジャーバンドを計算して、その値を返します。
ボリンジャーバンドとは、株価の勢いの変化や反転の目安、方向を見る指標です。
doubel iBands(string symbol,int timeframe,int period,int deviation,int bands_shift,int applied_price,int mode,int shift)
パラメータ:
symbol:通貨ペア。NULLは現在の通貨ペアです。
timeframe:時間枠。0は現在のチャートの時間枠です。
period:計算する平均期間。
deviation:メインラインからの標準偏差。
bands_shift:バンドシフト。
applied_price:適用価格。
mode:インジケーターライン。インジケーターラインID(0-MODE_MAIN、1-MODE_UPPER、2-MODE_LOWER )のいずれか。
shift:インジケーターバッファから取得するインデックス値(現在のバーを基準に指定されたバーの本数だけ過去にシフトする)。
【例】double val = iBands(NULL,0,20,2,0,PRICE_LOW,MODE_LOWER,0);
iCustom()
指定したカスタムインジケーターを計算し、その値を返します。
double iCustom(string symbol,int timeframe,string name,...,int mode,int shift)
パラメータ:
symbol:通貨ペア。NULLは現在の通貨ペアです。
timeframe:時間枠。0は現在のチャートの時間枠です。
name:カスタムインジケーターのプログラム名。
…:カスタムインジケータの外部パラメータ。
mode:ラインインデックス。
shift:インジケーターバッファから取得するインデックス値(現在のバーを基準に指定されたバーの本数だけ過去にシフトする)。
【例】double val = iCustom(NULL,0,”SampleInd”,13,1,0);
【例】iCustom()を使ってEAを自作してみよう

iMA()
移動平均線(Moving Average)を計算して、その値を返します。
double iMA(string symbol,int timeframe,int period,int ma_shift,int ma_method,int applied_price,int shift)
パラメータ:
symbol:通貨ペア。NULLは現在の通貨ペアです。
timeframe:時間枠。0は現在のチャートの時間枠です。
period:計算する平均期間。
ma_shift:移動平均のシフト。
ma_method:移動平均の方式。移動平均方式(0-MODE_SMA[単純平均]、1-MODE_EMA[指数平均]、2-MODE_SMMA[平滑平均]、3-MODE_LWMA[線形加重平均])のいずれか。
applied_price:適用価格。
shift:インジケーターバッファから取得するインデックス値(現在のバーを基準に指定されたバーの本数だけ過去にシフトする)。
【例】double val = iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,1);
iMACD()
MACDを計算して、その値を返します。
MACDとは、2本の移動平均線を使用して、相場の周期とタイミングを捉える指標です。
double iMACD(string symbol,int timeframe,int fast_ema_period,int slow_ema_period,int signal_period,int applied_price,int mode,int shift)
パラメータ:
symbol:通貨ペア。NULLは現在の通貨ペアです。
timeframe:時間枠。0は現在のチャートの時間枠です。
fast_ema_period:ファーストEAMの期間。
slow_ema_period:スローEMAの期間。
signal_period:シグナルラインの期間。
applied_price:適用価格。
mode:インジケーターライン。インジケーターラインID(0-MODE_MAIN、1- MODE_SIGNAL)のいずれか。
shift:インジケーターバッファから取得するインデックス値(現在のバーを基準に指定されたバーの本数だけ過去にシフトする)。
【例】double val = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
iRSI()
RSIを計算して、その値を返します。
RSI(相対力指数)とは、一定期間において、上昇と下落のどちらの勢いが強いのかを計測する指標です。
double iRSI(string symbol,int timeframe,int period,int applied_price,int shift)
パラメータ:
symbol:通貨ペア。NULLは現在の通貨ペアです。
timeframe:時間枠。0は現在のチャートの時間枠です。
period:計算する平均期間。
applied_price:適用価格。
shift:インジケーターバッファから取得するインデックス値(現在のバーを基準に指定されたバーの本数だけ過去にシフトする)。
【例】double val = iRSI(NULL,0,14,PRICE_CLOSE,0);
iStochastic()
ストキャスティックスを計算して、その値を返します。
ストキャスティクスとは、一定期間において、価格レンジの中で今の価格が相対的にどのレベルに位置するかを示す指標です。
double iStochastic(string symbol,int timeframe,int %Kperiod,int %Dperiod,int slowing,int method,int price_field,int mode,int shift)
パラメータ:
symbol:通貨ペア。NULLは現在の通貨ペアです。
timeframe:時間枠。0は現在のチャートの時間枠です。
%Kperiod:%Kラインの期間。
%Dperiod:%Dラインの期間。
slowing:スロー値。
method:移動平均の方式。
price_field:価格フィールドのパラメータ。
mode:インジケーターライン。インジケーターラインID(0-MODE_MAIN、1-MODE_SIGNAL )のいずれか。
shift:インジケーターバッファから取得するインデックス値(現在のバーを基準に指定されたバーの本数だけ過去にシフトする)。
【例】double val = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0);
カスタム指標
カスタム指標は、カスタムインジケータを作成するときに使用する関数です。
IndicatorBuffers()
カスタムインジケーターの計算に使用するバッファのメモリを割り当てます。
void IndicatorBuffers(int count)
パラメータ
count:割り当てるバッファの量。
IndicatorShortName()
データウィンドウとチャートのサブウィンドウに表示されるカスタムインジケーターのショートネームを設定します。
void IndicatorShortName(string name)
パラメータ
name:新しいショートネーム。
SetIndexBuffer()
カスタムインジケーターの定義済みバッファを、グローバルレベルで宣言した配列変数に結合します。
bool SetIndexBuffer(int index,double array[])
パラメータ
index:ラインインデックス。
array[]:インジケーターの値を格納しておく配列。
SetIndexDrawBegin()
インジケーターラインの描画を開始するバーの番号を設定します。
void SetIndexDrawBegin(int index,int begin)
パラメータ
index:ラインインデックス。
begin:最初に描き始めるバーの位置の番号。
SetIndexLabel()
データウインドウとツールヒントに表示さる説明を設定します。
void SetIndexLabel(int index,string text)
パラメータ
index:ラインインデックス。
text:ラベルテキスト。
SetIndexStyle()
インジケーターラインの型、スタイル、幅、色を設定します。
void SetIndexStyle(int index,int type,int style=EMPTY,int width=EMPTY,color clr=CLR_NONE)
パラメータ
index:ラインインデックス
type:形状タイプ。
style:描画スタイル。
width:ライン幅。
clr:ライン色。
日付と時刻の関数
datetime型のデータを扱う関数です。
Day()
最後に受信したサーバー時間、つまり現在時間の日を返します。
Hour()
最後に受信したサーバー時間、つまり現在時間の時(0~23)を返します。
【例】Hour()を使って取引時間を制限する機能を実装してみよう

Minute()
最後に受信したサーバー時間、つまり現在時間の分(0~59)を返します。
変換関数
変換関数は、他フォーマットデータを変換する関数です。
NormalizeDouble()
浮動小数点を指定した精度で丸めます。
求めたい精度に少数桁数を調整できて便利です。
double NormalizeDouble(double value,int digits);
パラメータ
value:浮動小数点数。
digits:丸める小数点以下の桁数。Digits()を使えば正規化した桁数を取得できます。
StringToTime()
“yyyy.mm.dd hh:mi”形式の日付や時間を含む文字列を、datetime型データに変換します。
datetime StringToTime(string value);
パラメータ
value:”yyyy.mm.dd hh:mi”形式の日付や時間を含む文字列。
TimeToString()
datetimeデータを”yyyy.mm.dd hh:mi”フォーマットの文字列に変換します。
string TimeToString(datetime value,int mode = TIME_DATE|TIME_MINUTES);
パラメータ
value:datetimeデータ。1970.1.1AM0:00:00からの経過秒数。
mode:出力フォーマット。省略した場合は”yyyy.mm.dd hh:mi”フォーマットで出力します。
その他の関数
Sendmail()
Eメールを送信します。
事前に、MT4のツール→オプション→E-メールから、メール送信を有効にしてメールアドレスを登録しておく必要があります。
bool SendMail(string subject,string some_text);
パラメータ:
subject:メールの件名です。
some_text:メールの本文です。