EAを作成するために、必ず必要となる価格の取得について説明していきます。
価格といっても、FXではBid(売り価格)とAsk(買い価格)があります。
買い(BUY:ロングエントリー)の場合はAsk(買い価格)で取引し、売り(SELL:ショートエントリー)の場合はBidで取引します。
価格に関する基本知識
現在価格(Bid,Ask)
取引する時点の価格を現在価格と表現しています。
取引の方向に関しては複数の表現があります、それぞれの取引における約定価格と決済価格を以下にまとめました。(EAの知識ではなくFXの知識です)
取引 | 取引 | 取引 | 約定価格 | 決済価格 |
---|---|---|---|---|
買い | BUY | ロング | Ask | Bid |
売り | SELL | ショート | Bid | Ask |
OHLC
聞きなれない単語かもしれませんが、Open、High、Low、Closeの頭文字を集めた単語です。
ローソク足を表すために必要となる4つの価格で、注意点としてはこの4つはBidであるということを知っておいて下さい。
ローソク足にAskは表現されないため、BUYの約定価格、SELLの決済価格(特に損切時)はローソク足の範囲外であることを意識する必要があります。
始値(Open)
ローソク足が生成された時の価格です。
1つ前のローソク足の終値(Close)と同じとなる可能性は高いですが、必ずしも同じではないです。
決まった時刻の価格ではないです。
例:(15:00のローソク足の場合)
1時間足の始値が、「15時00分00秒」であるとは限りません。
あくまでもティックを受け取った最初の時間であるため、始値の時間が「15時00分05秒」の場合もあります。
高値(High)
ローソク足の始値から終値の間で一番高い価格です。
始値(Open)、終値(Close)と同じになる場合もあります。
安値(Low)
ローソク足の始値から終値の間で一番安い価格です。
始値(Open)、終値(Close)と同じになる場合もあります。
終値(Close)
ローソク足における最後の価格です。
過去の価格
EAでは、1つ前のローソク足の終値を参照したりといった過去の価格を利用することが出来ます。
過去の価格は、前述のOHLCの単位で取得できます。
価格取得
現在価格(Bid,Ask)
MQL4の場合は、定義済み変数の「Ask」「Bid」により取得できましたが、MQL5においては定義済み変数はなくなりました。
MQL4とMQL5のソースコード共通化については以下を参照してください。
買い価格(Ask)
現在の買い価格(Ask)の取得方法を以下に記載します。
double GetAsk()
{
MqlTick last_tick;
SymbolInfoTick(Symbol(), last_tick);
return last_tick.ask;
}
頻繁に使う可能性がありますので、関数化しておくと良いと思います。
以下のような記述で変数「dAsk」に買い価格(Ask)を取得します。
double dAsk = GetAsk();
売り価格(Bid)
現在の売り価格(Bid)の取得方法を以下に記載します。
double GetBid()
{
MqlTick last_tick;
SymbolInfoTick(Symbol(),last_tick);
return last_tick.bid;
}
Ask同様に頻繁に使う可能性がありますので、関数化しておくと良いと思います。
以下のような記述で変数「dBid」に売り価格(Bid)を取得します。
double dBid = GetBid();
OHLC、過去価格
OHLCは現在のローソク足だけではなく、過去のローソク足も含めて取得することが可能です。
以下の例では、引数で過去のローソク足を指定して取得する関数の例を記述してます。
引数に「0」指定が現在のローソク足を指し、数値が大きくなる毎に過去のローソク足に遡ります。
以下のローソク足の下に記載した数値が取得するローソク足を指します。(5以降も順に遡っていけます)
MQL4の場合は、定義済み変数のOpen[]、High[]、Low[]、Close[]により取得できましたが、MQL5においては定義済み変数はなくなりました。
MQL4とMQL5のソースコード共通化については以下を参照してください。
始値(Open)
double Open(int iShift)
{
if (0 > iShift) {
return 0;
}
double Open[];
ArraySetAsSeries(Open, true);
CopyOpen(Symbol(), Period(), iShift, 1, Open);
return Open[0];
}
使用例
double dOpen = Open(0);
高値(High)
double High(int iShift)
{
if (0 > iShift) {
return 0;
}
double High[];
ArraySetAsSeries(High, true);
CopyHigh(Symbol(), Period(), iShift, 1, High);
return High[0];
}
使用例
double dHigh = High(5);
安値(Low)
double Low(int iShift)
{
if (0 > iShift) {
return 0;
}
double Low[];
ArraySetAsSeries(Low, true);
CopyLow(Symbol(), Period(), iShift, 1, Low);
return Low[0];
}
使用例
double dLow = Low(10);
終値(Close)
double Close(int iShift)
{
if (0 > iShift) {
return 0;
}
double Close[];
ArraySetAsSeries(Close, true);
CopyClose(Symbol(), Period(), iShift, 1, Close);
return Close[0];
}
使用例
double dClose = Close(0);
コメント