機能
ArraySetAsSeries関数は、第1引数に指定した動的配列に 時系列設定を付与することができる関数です。(静的配列や多次元配列に時系列設定を付与することはできません)
※プログラミング文脈における「静的」と「動的」という言葉についての詳細は↓の記事をご参照ください
MQL4に比べてこの関数の存在感と利用頻度が急速に増しました。
特にインディケーターの値取得においては、
- 値を格納する配列の宣言
- 各種インジケータ系関数によるハンドル(インジケータ値を取得する鍵のようなもの)の取得
- ArraySetAsSeries関数による、配列の時系列セット
- CopyBuffer関数による、値情報の配列コピー
という流れを踏む必要があります。
この流れの記述は頻出するので(頻出する以上、関数化・クラス化すればよい、という話でもありますが)
ArraySetAsSeries関数を理解することはMQL5でEAやカスタムインジケータを作る上での肝となるでしょう。
書式
関数名=ArraySetAsSeries
(
第1引数=時系列設定を付与する配列,
第2引数=時系列の設定フラグ(true または false)
);
引数
<第1引数>
第1引数には、時系列設定の対象とするための配列 を記述します。
<第2引数>
第2引数には、時系列の設定フラグを記述します。
時系列設定を対象の設定に付与する際に、
過去の時間→最新の時間 の順番で配列に格納していくのか?
それとも
最新の時間→過去の時間 の順番で配列に格納していくのか?
第2引数ではそれを決定します。
trueにした場合、配列は直近の時間のデータから、配列に格納されていきます。配列[0]には取得されたデータ中で最新の時間のデータが格納される、ということになります。
array[0](一番新しい時間)→・・・array[n](古い方の時間)
こんな感じですね。
↑例えば5本分の足があったとして、[0]が一番新しく、[4]が一番古い・・・ということになります。
一方で、
falseにした場合、配列は古い時間のデータから、配列に格納されていきます。配列[0]には取得されたデータ中で一番古い時間のデータが格納される、ということになります。
array[0](一番古い時間)→・・・array[n](新しい方の時間)
↑例えば5本分の足があったとして、[4]が一番新しく、[0]が一番古い・・・ということになります。
戻り値
成功の場合は true、それ以外の場合は falseが返されます。
bool型については↓をご参照ください。
ソースコード1-インジケータの値を時系列にセットするパターン
下記サンプルコードの詳細解説を確認されたい場合は、
【MQL5入門】モメンタムの売買シグナルを取得する方法【EAの作り方】をご覧ください。
void OnTick()
{
double PriceArray[];
//モメンタムの配列を格納する配列を用意
int MomentumDefinition=iMomentum(_Symbol,_Period,14,PRICE_CLOSE);
//モメンタムを計算するハンドルを取得する
ArraySetAsSeries(PriceArray,true);
//データを時系列にセット
CopyBuffer(MomentumDefinition,0,0,3,PriceArray);
//取得したハンドルを使って、配列にモメンタムの計算値を格納
double MomentumValue=NormalizeDouble(PriceArray[0],2);
//データの正規化
//PriceArray[0]には現在足のモメンタムの値が格納されている
if(MomentumValue>100.0)Comment("勢いが強い",MomentumValue);
if(MomentumValue<99.9)Comment("勢いが弱い",MomentumValue);
//コメント出力
if(
(MomentumValue>99.9)
&&
(MomentumValue<100.0)
)
{
Comment(" ",MomentumValue);
}
}//void OnTick()
//+------------------------------------------------------------------+
サンプルコードの挙動は以下のようになります。↓
OnTick関数については↓をご覧ください↓
Normalizedouble関数については↓をご覧ください
iMomentume関数については↓をご覧ください。
ソースコード2 -価格情報を時系列順にセットするパターン-
下記ソースコードの詳細解説を確認されたい場合は、
【MQL5で最高値最安値を取得する方法その1】をご覧ください。
<!-- wp:loos-hcb/code-block {"langType":"cpp","langName":"C++"} -->
<div class="hcb_wrap"><pre class="prism line-numbers lang-cpp" data-lang="C++"><code>
void OnTick()
{
//高値と安値の差を格納する変数を宣言
double tradingRange=0;
//直近高値、直近安値の場所を格納する変数を宣言
int HighestCandle,LowestCandle;
//高値と安値の情報を格納する変数配列を宣言
double High[],Low[];
//配列を時系列にセット
ArraySetAsSeries(High,true);
ArraySetAsSeries(Low,true);
//高値と安値の情報を配列にコピー
CopyHigh(_Symbol,_Period,0,100,High);
CopyLow(_Symbol,_Period,0,100,Low);
//高値格納配列の最高値インデックスを格納
HighestCandle=ArrayMaximum(High,0,100);
//安値格納配列の最安値インデックスを格納
LowestCandle=ArrayMinimum(Low,0,100);
//MqlRates構造体のインスタンス配列を宣言
MqlRates PriceInfo[];
//配列を時系列にセット
ArraySetAsSeries(PriceInfo,true);
//価格情報をMqlRates構造体インスタンス配列に格納
int Data=CopyRates(_Symbol,_Period,0,Bars(_Symbol,_Period),PriceInfo);
//オブジェクト生成シークエンス(高値)
ObjectCreate(0,"Line1",OBJ_HLINE,0,0,PriceInfo[HighestCandle].high);
ObjectSetInteger(0,"Line1",OBJPROP_COLOR,clrOrange);
ObjectSetInteger(0,"Line1",OBJPROP_WIDTH,3);
ObjectMove(0,"Line1",0,0,PriceInfo[HighestCandle].high);
//オブジェクト生成シークエンス(安値)
ObjectCreate(0,"Line2",OBJ_HLINE,0,0,PriceInfo[LowestCandle].low);
ObjectSetInteger(0,"Line2",OBJPROP_COLOR,clrOrange);
ObjectSetInteger(0,"Line2",OBJPROP_WIDTH,3);
ObjectMove(0,"Line2",0,0,PriceInfo[LowestCandle].low);
//高値と安値の差分を算出し、格納
tradingRange=NormalizeDouble(
(PriceInfo[HighestCandle].high
-
PriceInfo[LowestCandle].low
),
_Digits);
Comment("最高値~最安値のレンジ: ",tradingRange);
}
//+------------------------------------------------------------------+
</code></pre></div>
<!-- /wp:loos-hcb/code-block -->
サンプルコードの挙動は以下のようになります。
最後までお読みいただきありがとうございました。
ArraySetAsSeries関数が使われている記事群↓
・MQL5 EA講座 第92回「待機注文クラスを使ってEAを作る」
・MQL5 EA講座 第104回「価格とバーに関するデータへのアクセス:その2バー情報」
・MQL5 EA講座 第105回「CopyRates関数以外のCopy関数」
※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。
———————————————————————————-
コメント