前回からの続きです。
価格チャートだけ表示するインジケータの枠だけ作成されました。
ここから、プログラムを書くことで、いろんなチャートを描くことができます。
早速やってみましょう。
前回の記事で作成したHeikinインジケータの下の部分に注目です。
OnCalculateと書いてある部分があります。そこに赤字の部分を入力して実行してみてください。
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
for( int i = rates_total - 1; i >= 0; i = i - 1 )
{
Label1Buffer[i] = (high[i] + low[i]) / 2;
}
//--- return value of prev_calculated for next call
return(rates_total - 1);
}
//+------------------------------------------------------------------+
前回と違い、今回は赤い線がチャートに表示されていると思います。
初めての(?)インジケータ作成成功です。
高値安値の中間値を線でつなぐインジケータが完成しました。
修正箇所は4行ほどですが、インジケータ作成に大切な要素が含まれています。
一つずつ説明したいと思います。
■繰り返し制御文 for
for( int i = rates_total - 1; i >= 0; i = i - 1 )
{
Label1Buffer[i] = (high[i] + low[i]) / 2;
}
ある一定回数、同じ処理を行うときに使用します。
for( 初期化条件; 繰り返し条件; 再初期化式)
{
繰り返し行う処理
}
といった形になっています。
・初期化条件 [ int i = rates_total -1 ]
変数宣言と、初期化を行います。
今回は、[i]という名前の変数を宣言したのち、[rates_total-1]の値に初期化しました。
・繰り返し条件 [ i >= 0 ]
変数[i]の中身が0より大きい間、繰り返しを行います。
・再初期化式 [ i = i - 1 ]
再初期化式は、一回の処理が終わるたびに呼び出される処理です。
今回は、一回の処理が呼び出し終わるたびに、iの値を一つ減らします。
for文の下に{ } で囲われた部分があります。これをブロックと呼びます。for文の下の {}で囲われた部分を条件に従って繰り返し実行します。
図で書くと、このような流れになります。
■配列操作
Label1Buffer[i] = (high[i] + low[i]) / 2;
[ ] で閉じた中にiと指定されて、計算式が書かれています。
この[]で数字を指定して、中身を見たり書いたりできる変数のことを配列と呼びます。
この配列もインジケータ作成時にはとても重要です。
配列は、変数の箱が、たくさん横に並んだ物と考えてください。
上記の式では、
Label1Bufferのi番目の箱に、highとlowのi番目の箱の内容を足して2で割った物を入れています。
・図006.03 配列操作
インジケータでは、この配列操作と、繰り返し制御文を使いながら様々なチャートを描画します。
次回は、変数についてもう少し掘り下げたいと思います。
今まで説明を省略していましたが、int i; って書いてある、[int]ってなに?というあたりを予定しています。
また、今年のブログ更新は、これが最後です。皆様、よいお年を^^
次の回へ
ブログランキングにご協力よろしくお願いします。m(._.)m