ちょっと前に、少し変わったインジケーターの作成を依頼されました。
①チャートを各UNITに分割し、
②各UNIT内でのバーの数(BARS)を決めて、
③その中での最高値と最安値にラインを引く、
というものです。
上の例では、
UNIT数=5
BARS=5
となっています。
決して難しいプログラムが必要なわけではありませんが、通常の移動平均線やボリバンのような、単純な配列処理では作成できません。
こういったインジケーターを作成するときは、頭の中だけで考えているとわけがわからなくなってしまうので、エクセルを利用して、頭を整理するのが一番です。
上の例では、
UNIT数=5
BARS=3
となっています。
これを見ると、まず、for文を使って、各UNIT内の最新のバー(上の図の赤色の部分=BaseBarNumber)を特定して、さらにその中のfor文で、各ユニットの最古のバーまで一つずつ配列を組めばよいことがわかります。
まず、各UNIT内の最新のバー(上の図の赤色の部分=BaseBarNumber)を特定しましょう。
先ほどのエクセルの表を見てわかるように、それぞれのバーnumberは、
UNIT内のバーの数×(そのUNITnumber-1)
と表せます。
なので、
int BaseBarNumber = 0;
for(i=1;i<=UNIT;i++)
{
BaseBarNumber = BARS*(i-1);
…
とするか、もしくは、
int BaseBarNumber = 0;
for(i=0;i<=UNIT-1;i++)
{
BaseBarNumber = BARS*i;
…
としてもいいでしょう。
次に、iHighest(通貨ペア,時間軸,バーの数,起算点)とiLowest(同左)を使って、最高値と最安値のバーの位置を割り出し、それぞれをHigh[]配列とLow[]配列に入れれば、各UNIT内の最高値と最安値が計算されます。
double H
= High[iHighest(NULL,0,MODE_HIGH,BARS,BaseBarNumber)];
double L
= Low[iLowest(NULL,0,MODE_LOW,BARS,BaseBarNumber)];
という具合にすればよいでしょう。
次に、それぞれのUNITの中で、さらに、もう一つのfor文を使って、「BaseBarNumber」から「BaseBarNumber+BARS-1」まで順に、同じ最高値と最安値を各配列の中に入れればOKです。
for(int j=BaseBarNumber;j<=BaseBarNumber+BARS-1;j++)
{
BufHigh[j] = H;
BufLow[j] = L;
}
ここまでのプログラム全体を見ると、↓ こんな感じですね。
ただし、この手のインジケーターは、時間の経過とともに、古いバーの上に過去のグラフの残存が残ってしまうことがあります。
上の画像の黄色の線より左側に、不要なデータが残ってしまいます。
別に気にしなければ済むことですが、見栄えが悪いので、EMPTY_VALUEを使って、一番古いバーから「BARS*UNIT」番までのバーの上に残存している配列を空にしましょう。
for(int i=Bars-1;i>=BARS*UNIT;i--)
{
BufHigh[i] = EMPTY_VALUE;
BufLow[i] = EMPTY_VALUE;
}
というプログラムを先ほどのコードの前にでも書けばOKです。
プログラム全体をもう一度見ると、↑ のようになります。
すると、
見苦しい残存ラインが消えてくれます。
コメントをお書きください