少し前にこんな記事を書きました。
この記事では、
ArrayMaximum関数、ArrayMinimum関数を使ったやり方を紹介しました。
複数の配列を用意し、MqlRates構造体を利用し・・・と色々とこねくり回した感のある記述でしたが、
MQL5で頻出する記述に親和性があるのではないかという考えのもと、あえて先に紹介しました。
今回は
iHighest関数とiLowest関数という、別の関数を使ったやり方を紹介します。
MQL4経験者の方にはなじみ深い記述かもしれません。
iHighest関数とiLowest関数を利用した最高値最安値取得のロードマップ
以下の手順でコードを記述していきます
高値と安値の差を格納する変数を宣言
前回の記事と同じです。ここに関しては変更点はありません。
//高値と安値の差を格納する変数を宣言
double tradingRange=0
最高値・最安値取得に必要な計算をして変数に格納
直近100本の最高値・最安値のインデックスを取得するにはiHighest関数とiLowest関数を利用します。
※最高値・最安値のインデックス=どの時点での足が最高値、最安値だったか、という事であり、実際の最高値・最安値価格を取得しているわけではないので注意してください。
iHighest関数とiLowest関数で最高値・最安値のインデックスが取得出来たら、それを使って実際の最高値・最安値価格をiHigh関数、iLow関数を使って取得します。
iHigh関数、iLow関数の第3引数にiHighest関数とiLowest関数で取得した最高値・最安値のそれぞれのインデックスをあてがいます。
//直近100本の最高値インデックスを取得
int highestIndex=iHighest(_Symbol,_Period,MODE_HIGH,100,0);
//直近100本の最高値を取得
double highestPrice= iHigh(_Symbol,_Period,highestIndex);
//直近100本の最安値インデックスを取得
int lowestIndex=iLowest(_Symbol,_Period,MODE_LOW,100,0);
//直近100本の最安値を取得
double lowestPrice= iLow(_Symbol,_Period,lowestIndex);
インデックスとは?
インデックスというのは、直訳すれば「索引・見出し」といったような意味になりますが、プログラミングの世界においてインデックスというのは配列などの並び立つ情報の一つ一つに付けられた「通し番号」という意味合いであり、配列の要素を指し示すような文脈でよく使われます。
仮にArray[] という配列があったとして、配列1番目を表す[0]や、配列2番目を表す[1]のことをインデックスと呼びます。
取得した最高値・最安値を水平線オブジェクトで描画する
描画する座標にあてがっている変数名が変わっていますが、それ以外はやっていることは前回の記事と変わりありません。
//オブジェクト生成シークエンス(高値)
ObjectCreate(0,"Line1",OBJ_HLINE,0,0,highestPrice);
ObjectSetInteger(0,"Line1",OBJPROP_COLOR,clrMagenta);
ObjectSetInteger(0,"Line1",OBJPROP_WIDTH,3);
ObjectMove(0,"Line1",0,0,highestPrice);
//オブジェクト生成シークエンス(安値)
ObjectCreate(0,"Line2",OBJ_HLINE,0,0,lowestPrice);
ObjectSetInteger(0,"Line2",OBJPROP_COLOR,clrMagenta);
ObjectSetInteger(0,"Line2",OBJPROP_WIDTH,3);
ObjectMove(0,"Line2",0,0,lowestPrice);
//高値と安値の差分を算出し、格納
tradingRange=NormalizeDouble(highestPrice -lowestPrice,_Digits);
//コメント出力
Comment("最高値~最安値のレンジ: ",tradingRange);
↑のコードを見ると前回の記事のコードにあった、配列の宣言が一つもなく、ずいぶんスリムになっているのがわかるかと思います。
MQL4経験者の方は「何を当たり前のことを・・・」と思われるかもしれませんが、MQL5ではMQL4にあった、定義済み配列が軒並みなくなっているので、
配列宣言→配列の時系列セット→Copy~関数を利用した配列へのデータコピー・・・
という作業がMQL4よりも頻繁にあります。MQL5に慣れてくると、割と自分で配列を用意せずに記述が完結した時などに妙な感じを持つようになってきます。(あくまで私個人の感想ですが・・・)
※配列の時系列セットについては、↓の記事も参考にしていただければと思います。
全体のプログラムコード
全体のプログラムコードは以下のようになります。
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick()
{
//高値と安値の差を格納する変数を宣言
double tradingRange=0;
//直近100本の最高値インデックスを取得
int highestIndex=iHighest(_Symbol,_Period,MODE_HIGH,100,0);
//直近100本の最高値を取得
double highestPrice= iHigh(_Symbol,_Period,highestIndex);
//直近100本の最安値インデックスを取得
int lowestIndex=iLowest(_Symbol,_Period,MODE_LOW,100,0);
//直近100本の最安値を取得
double lowestPrice= iLow(_Symbol,_Period,lowestIndex);
//オブジェクト生成シークエンス(高値)
ObjectCreate(0,"Line1",OBJ_HLINE,0,0,highestPrice);
ObjectSetInteger(0,"Line1",OBJPROP_COLOR,clrMagenta);
ObjectSetInteger(0,"Line1",OBJPROP_WIDTH,3);
ObjectMove(0,"Line1",0,0,highestPrice);
//オブジェクト生成シークエンス(安値)
ObjectCreate(0,"Line2",OBJ_HLINE,0,0,lowestPrice);
ObjectSetInteger(0,"Line2",OBJPROP_COLOR,clrMagenta);
ObjectSetInteger(0,"Line2",OBJPROP_WIDTH,3);
ObjectMove(0,"Line2",0,0,lowestPrice);
//高値と安値の差分を算出し、格納
tradingRange=NormalizeDouble(highestPrice -lowestPrice,_Digits);
//コメント出力
Comment("最高値~最安値のレンジ: ",tradingRange);
}
//+------------------------------------------------------------------+
サンプルコードの挙動は以下のようになります↓
最後までお読みいただきありがとうございました<(_ _)>
※最高値・最安値の取得方法については<MQL5でEAを作ろう講座>でも↓の記事で解説しておりますので、よろしければ参考にしていただければと思います。
・MQL5 EA講座 第106回「最高値と最安値の取得について」
NormalizeDouble関数については↓をご覧ください。
コメント