プログラムにもエクセルは必要だよね。

ちょっと前に、少し変わったインジケーターの作成を依頼されました。

 

①チャートを各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です。

プログラム全体をもう一度見ると、↑ のようになります。

 

すると、

見苦しい残存ラインが消えてくれます。