- PlotIndexSetInteger関数の働き・役割
- PlotIndexSetInteger関数の引数について
- PlotIndexSetInteger関数の戻り値について
- PlotIndexSetInteger関数を使う際の注意点
- PlotIndexSetInteger関数を使ったサンプルコード
- サンプルコード解説1:プロパティ命令部分
- サンプルコード解説2:グローバル領域での定義
- サンプルコード解説3:OnInit関数
- サンプルコード解説4:オリジナル関数のgetIndexOfColor()
- サンプルコード解説5:OnCalculate関数の中1
- サンプルコード解説6:OnCalculate関数の中2
- サンプルコード解説7:OnCalculate関数の中3
- サンプルコード解説8:OnCalculate関数の中4
- サンプルコード解説9:OnCalculate関数の中5
- 補足:ColorBuffer配列は結局どのように使われているのか?
PlotIndexSetInteger関数の働き・役割
PlotIndexSetInteger関数は、特定のプロットスタイルインデックスに対応するプロパティの値を設定するために使用されます。
プロットスタイルインデックスとは、グラフ上の特定の線やバーなどの描画スタイルを識別するための番号のことです。
このインデックスを使用することで、複数の描画スタイルを個別に制御できます。
PlotIndexSetInteger関数の引数について
PlotIndexSetInteger関数には2つの書式があり、それぞれ異なる引数を取ります。以下にそれぞれの引数について説明します。
書式1
bool PlotIndexSetInteger(
int plot_index, // プロットスタイルインデックス
int prop_id, // プロパティ識別子
int prop_value // 設定する値
);
引数の説明
- plot_index:グラフィックプロットのインデックスを指定します。グラフ上の特定の描画スタイルを識別するための番号です。
- prop_id:プロパティの識別子を指定します。ENUM_PLOT_PROPERTY_INTEGER列挙型のいずれかの値を取ります。
※ENUM_PLOT_PROPERTY_INTEGERについての詳細は↓の記事をご参照ください。
3.prop_value:設定するプロパティの値を指定します。int型で指定し、プロパティの内容に応じた適切な値を設定します。
書式2
bool PlotIndexSetInteger(
int plot_index, // プロットスタイルインデックス
int prop_id, // プロパティ識別子
int prop_modifier, // プロパティ修飾子
int prop_value // 設定する値
);
引数の説明
- plot_index:グラフィックプロットのインデックスを指定します。グラフ上の特定の描画スタイルを識別するための番号です。
- prop_id:プロパティの識別子を指定します。ENUM_PLOT_PROPERTY_INTEGER列挙型のいずれかの値を取ります。
- prop_modifier:指定されたプロパティの修飾子を指定します。これは色インデックスプロパティのみに必要です。
- prop_value:設定するプロパティの値を指定します。int型で指定し、プロパティの内容に応じた適切な値を設定します。
PlotIndexSetInteger関数の戻り値について
PlotIndexSetInteger関数の戻り値は、関数の実行が成功したかどうかを示すbool型の値です。
- true
- 指定されたプロパティの設定が正常に完了したことを示します。
- false
- プロパティの設定が失敗したことを示します。失敗の原因としては、指定されたインデックスやプロパティ識別子が無効である場合などが考えられます。
PlotIndexSetInteger関数を使う際の注意点
【プロパティの種類について】
prop_idで指定するプロパティは、ENUM_PLOT_PROPERTY_INTEGER列挙型の値である必要があります。これにより、関数が設定しようとしているプロパティの種類が適切であることを確認できます。
【プロパティ修飾子について】
prop_modifierは色インデックスプロパティのみに必要です。他のプロパティに対して修飾子を指定すると、意図しない動作が発生する可能性があります。
【プロットスタイルインデックスについて】
plot_indexは、グラフィックプロットのインデックスを示すものであり、正しいインデックスを指定する必要があります。無効なインデックスを指定すると、関数が失敗する原因となります。
【戻り値の確認について】
関数の戻り値を常に確認し、falseが返された場合にはエラーハンドリングを行うことが重要です。これにより、プロパティの設定が失敗した場合の対処ができます。
PlotIndexSetInteger関数を使ったサンプルコード
以下に、PlotIndexSetInteger関数を使用して3色の線を描画するカスタムインジケ-タのサンプルコードを示します。このコードでは、5ティックごとに線の色を変更しています。
#property indicator_chart_window // インジケータをチャートウィンドウに表示するプロパティ
#property indicator_buffers 2 // インジケータが使用するバッファの数を設定
#property indicator_plots 1 // プロットの数を設定
//---- ColorLineをプロットする
#property indicator_label1 "ColorLine" // プロットのラベルを設定
#property indicator_type1 DRAW_COLOR_LINE // プロットのタイプをカラフルなラインに設定
#property indicator_color1 clrRed,clrGreen,clrBlue // プロットの色を赤、緑、青に設定
#property indicator_style1 STYLE_SOLID // プロットのスタイルをソリッドラインに設定
#property indicator_width1 3 // プロットの幅を3ピクセルに設定
//--- 指標バッファ
double ColorLineBuffer[]; // カラフルなラインを描画するためのバッファ
double ColorBuffer[]; // 色インデックスを格納するバッファ
int MA_handle; // 移動平均のハンドルを格納する変数
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数 |
//+------------------------------------------------------------------+
void OnInit()
{
//--- 指標バッファマッピング
SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA); // ColorLineBufferをインジケータのデータバッファとして設定
SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX); // ColorBufferをインジケータの色インデックスバッファとして設定
//--- MAハンドルの取得
MA_handle = iMA(Symbol(), 0, 10, 0, MODE_EMA, PRICE_CLOSE); // EMA(指数移動平均)のハンドルを取得
}
//+------------------------------------------------------------------+
//| 色インデックスを取得する関数 |
//+------------------------------------------------------------------+
int getIndexOfColor(int i)
{
int j = i % 300; // 300で割った余りを計算
if(j < 100) return(0); // 余りが100未満なら1番目のインデックスを返す
if(j < 200) return(1); // 余りが200未満なら2番目のインデックスを返す
return(2); // それ以外なら3番目のインデックスを返す
}
//+------------------------------------------------------------------+
//| カスタム指標の計算関数 |
//+------------------------------------------------------------------+
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[])
{
//--- 初期設定
static int ticks = 0, modified = 0; // ティックと変更カウンタを初期化
int limit; // 計算の制限を示す変数
//--- 初回計算、またはバーの数が変わった場合
if(prev_calculated == 0)
{
//--- MAの値をColorLineBufferにコピー
int copied = CopyBuffer(MA_handle, 0, 0, rates_total, ColorLineBuffer);
if(copied <= 0) return(0); // コピー失敗時に処理を終了
//--- 全バーに対して線の色を設定
for(int i = 0; i < rates_total; i++)
ColorBuffer[i] = getIndexOfColor(i);
}
else
{
//--- MAの値をColorLineBufferにコピー
int copied = CopyBuffer(MA_handle, 0, 0, rates_total, ColorLineBuffer);
if(copied <= 0) return(0); // コピー失敗時に処理を終了
ticks++; // ティックをカウント
if(ticks >= 5) // 5ティックごとに配色を変更
{
ticks = 0; // カウンタをリセット
modified++; // 変更カウンタをインクリメント
if(modified >= 3) modified = 0; // 変更カウンタをリセット
ResetLastError();
// 配色を変更
switch(modified)
{
case 0:
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, clrRed); // 赤
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, clrBlue); // 青
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 2, clrGreen); // 緑
Print("Color scheme " + modified);
break;
case 1:
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, clrYellow); // 黄
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, clrPink); // ピンク
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 2, clrLightSlateGray); // 薄いスレートグレー
Print("Color scheme " + modified);
break;
default:
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, clrLightGoldenrod); // 薄いゴールデンロッド
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, clrOrchid); // 蘭色
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 2, clrLimeGreen); // ライムグリーン
Print("Color scheme " + modified);
}
}
else
{
//--- 開始位置を設定
limit = prev_calculated - 1;
//--- 全バーに対して線の色を設定
for(int i = limit; i < rates_total; i++)
ColorBuffer[i] = getIndexOfColor(i);
}
}
//--- 次回呼び出しのために計算済みバー数を返す
return(rates_total);
}
//+------------------------------------------------------------------+
若干複雑なので、小分けにして解説していきたいと思います。
サンプルコード解説1:プロパティ命令部分
#property indicator_chart_window // インジケータをチャートウィンドウに表示するプロパティ
#property indicator_buffers 2 // インジケータが使用するバッファの数を設定
#property indicator_plots 1 // プロットの数を設定
//---- ColorLineをプロットする
#property indicator_label1 "ColorLine" // プロットのラベルを設定
#property indicator_type1 DRAW_COLOR_LINE // プロットのタイプをカラフルなラインに設定
#property indicator_color1 clrRed,clrGreen,clrBlue // プロットの色を赤、緑、青に設定
#property indicator_style1 STYLE_SOLID // プロットのスタイルをソリッドラインに設定
#property indicator_width1 3 // プロットの幅を3ピクセルに設定
解説
【#property indicator_chart_window】
この命令は、インジケータをチャートウィンドウに表示することを指定しています。チャートウィンドウは、価格チャートが表示されるメインのウィンドウのことです。このプロパティを設定することで、インジケータが価格チャートと一緒に表示されます。
【#property indicator_buffers 2】
この命令は、インジケータが使用するバッファの数を2つに設定しています。バッファとは、インジケータのデータを保存するための配列です。この場合、2つの異なるデータセットを保存するために2つのバッファが使用されます。
【#property indicator_plots 1】
この命令は、インジケータが描画するプロットの数を1つに設定しています。プロットとは、インジケータがチャート上に描画するグラフィカルな要素のことです。ここでは、1つのプロットが描画されることを指定しています。
【#property indicator_label1 “ColorLine”】
この命令は、プロットのラベルを「ColorLine」に設定しています。ラベルは、チャート上でプロットを識別するための名前です。
【#property indicator_type1 DRAW_COLOR_LINE】
この命令は、プロットのタイプをカラフルなラインに設定しています。DRAW_COLOR_LINEは、プロットが色付きのラインとして描画されることを指定します。
【#property indicator_color1 clrRed,clrGreen,clrBlue】
この命令は、プロットの色を赤、緑、青に設定しています。これにより、プロットがこれらの色で描画されます。
【#property indicator_style1 STYLE_SOLID】
この命令は、プロットのスタイルをソリッドラインに設定しています。ソリッドラインとは、途切れのない実線のことです。
【#property indicator_width1 3】
この命令は、プロットの幅を3ピクセル(デジタル画像を構成する最小の単位)に設定しています。これにより、プロットが3ピクセルの太さで描画されます。
サンプルコード解説2:グローバル領域での定義
//--- 指標バッファ
double ColorLineBuffer[]; // カラフルなラインを描画するためのバッファ
double ColorBuffer[]; // 色インデックスを格納するバッファ
int MA_handle; // 移動平均のハンドルを格納する変数
解説
【double ColorLineBuffer[]】
この変数は、カラフルなラインを描画するためのバッファです。double型の配列であり、各要素にラインのデータポイントが格納されます。このバッファに保存されたデータが、チャート上に描画されるラインの位置を決定します。
【double ColorBuffer[]】
この変数は、色インデックスを格納するバッファです。double型の配列であり、各要素に色のインデックス(通し番号)が格納されます。このインデックスを使用して、チャート上に描画されるラインの色を指定します。
【int MA_handle】
この変数は、移動平均のハンドルを格納するための変数です。ハンドルとは、特定の指標や関数を識別するためのIDのことです。ここでは、移動平均(MA)の計算に使用されるハンドルを保持します。移動平均は、価格データの平均値を計算する指標で、チャート上に描画されるラインのデータポイントとして使用されます。
サンプルコード解説3:OnInit関数
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数 |
//+------------------------------------------------------------------+
void OnInit()
{
//--- 指標バッファマッピング
SetIndexBuffer(0,ColorLineBuffer,INDICATOR_DATA); // ColorLineBufferをインジケータのデータバッファとして設定
SetIndexBuffer(1,ColorBuffer,INDICATOR_COLOR_INDEX); // ColorBufferをインジケータの色インデックスバッファとして設定
//--- MAハンドルの取得
MA_handle = iMA(Symbol(), 0, 10, 0, MODE_EMA, PRICE_CLOSE); // EMA(指数移動平均)のハンドルを取得
}
解説
【void OnInit()】
OnInit関数は、カスタム指標が初期化される際に自動的に呼び出される関数です。この関数内で、指標の初期設定を行います。
【SetIndexBuffer(0, ColorLineBuffer, INDICATOR_DATA)】
この命令は、ColorLineBufferをインジケータのデータバッファとして設定します。SetIndexBuffer関数は、インジケータが使用するバッファを指定するために使用されます。ここでは、最初のバッファ(インデックス0)としてColorLineBuffer配列を設定し、このバッファがインジケータのデータを保持することを示しています。INDICATOR_DATAは、データバッファとして設定する識別子です。
【SetIndexBuffer(1, ColorBuffer, INDICATOR_COLOR_INDEX)】
この命令は、ColorBufferをインジケータの色インデックス用バッファとして設定します。SetIndexBuffer関数は、インジケータが使用するバッファを指定するために使用されます。ここでは、2番目のバッファ(インデックス1)としてColorBuffer配列を設定し、このバッファがインジケータの色インデックスを保持することを示しています。INDICATOR_COLOR_INDEXは、色インデックス用バッファとして設定する識別子です。
【MA_handle = iMA(Symbol(), 0, 10, 0, MODE_EMA, PRICE_CLOSE)】
この命令は、EMA(指数移動平均)のハンドルを取得します。iMA関数は、指定されたパラメータに基づいて移動平均を計算する関数であり、そのハンドルを返します。以下のパラメータが指定されています:
- Symbol():対象とする銘柄を指定します。
- 0:時間枠を指定します(0は現在の時間枠を示します)。
- 10:移動平均の期間を指定します。
- 0:シフトを指定します(0はシフトなしを示します)。
- MODE_EMA:移動平均のタイプを指定します(ここではEMAを指定しています)。
- PRICE_CLOSE:価格データの種類を指定します(ここでは終値を指定しています)。
このハンドルを使用して、移動平均の計算結果を後続の処理で参照することができます。
サンプルコード解説4:オリジナル関数のgetIndexOfColor()
//+------------------------------------------------------------------+
//| 色インデックスを取得する関数 |
//+------------------------------------------------------------------+
int getIndexOfColor(int i)
{
int j = i % 300; // 300で割った余りを計算
if(j < 100) return(0); // 余りが100未満なら1番目のインデックスを返す
if(j < 200) return(1); // 余りが200未満なら2番目のインデックスを返す
return(2); // それ以外なら3番目のインデックスを返す
}
【int getIndexOfColor(int i)】
getIndexOfColor関数は、渡された整数値iを元に色インデックス(通し番号)を計算して返す関数です。この関数は、線の色を順次変更するために使用されます。
【int j = i % 300】
この行は、iを300で割った余りを計算し、その結果をjに代入しています。これにより、iの値を300周期で循環させることができます。
【if(j < 100) return(0)】
jが100未満であれば、色インデックスとして0を返します。これは、300の周期の最初の100ステップに対応します。
【if(j < 200) return(1)】
jが100以上200未満であれば、色インデックスとして1を返します。これは、300の周期の次の100ステップに対応します。
【return(2)】
jが200以上であれば、色インデックスとして2を返します。これは、300の周期の最後の100ステップに対応します。
この関数を使用することで、指定された範囲内で色を順番に切り替えることができます。
サンプルコード解説5:OnCalculate関数の中1
//+------------------------------------------------------------------+
//| カスタム指標の計算関数 |
//+------------------------------------------------------------------+
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[])
{
//--- 初期設定
static int ticks = 0, modified = 0; // ティックと変更カウンタを初期化
int limit; // 計算の制限を示す変数
【OnCalculate関数】
OnCalculate関数は、カスタム指標の主要な計算を行う関数です。この関数は、新しい価格データが利用可能になるたびに呼び出されます。各引数は、計算に必要なデータを提供します。
【static int ticks = 0, modified = 0】
この行は、関数の内部で使用するティックカウンタと変更カウンタを初期化しています。staticキーワードを使用することで、これらの変数は関数が呼び出されるたびに初期化されず、前回の呼び出し時の値を保持します。
【int limit】
この変数は、計算の制限を示すために使用されます。具体的な使用法は後続のコードで示されます。
サンプルコード解説6:OnCalculate関数の中2
//--- 初回計算、またはバーの数が変わった場合
if(prev_calculated == 0)
{
//--- MAの値をColorLineBufferにコピー
int copied = CopyBuffer(MA_handle, 0, 0, rates_total, ColorLineBuffer);
if(copied <= 0) return(0); // コピー失敗時に処理を終了
//--- 全バーに対して線の色を設定
for(int i = 0; i < rates_total; i++)
ColorBuffer[i] = getIndexOfColor(i);
}
else
{
//--- MAの値をColorLineBufferにコピー
int copied = CopyBuffer(MA_handle, 0, 0, rates_total, ColorLineBuffer);
if(copied <= 0) return(0); // コピー失敗時に処理を終了
【初回計算、またはバーの数が変わった場合】
この部分のコードは、初回の計算時、またはバーの数が変わった場合に実行されます。
【if(prev_calculated == 0)】
この条件文は、前回計算されたバーの数がゼロである場合、つまり初回計算時に実行されます。
【int copied = CopyBuffer(MA_handle, 0, 0, rates_total, ColorLineBuffer)】
この命令は、MA(移動平均)の値をColorLineBufferにコピーします。CopyBuffer関数は、指定されたバッファからデータをコピーするために使用されます。ここでは、移動平均の値をColorLineBufferにコピーしています。MA_handleは移動平均のハンドルで、0はデータの最初の位置を示し、rates_totalはコピーするデータの総数を示しています。
【if(copied <= 0) return(0)】
この条件文は、コピーが失敗した場合に処理を終了します。copiedが0以下である場合、コピーに失敗したことを示し、関数は0を返します。
【for(int i = 0; i < rates_total; i++) ColorBuffer[i] = getIndexOfColor(i)】
このループは、全てのバーに対して線の色を設定します。getIndexOfColor関数を使用して、各バーに対応する色インデックスをColorBufferに設定します。
【else部分】
この部分は、初回計算ではない場合、つまり既に計算されたバーが存在する場合に実行されます。
【int copied = CopyBuffer(MA_handle, 0, 0, rates_total, ColorLineBuffer)】
再び、移動平均の値をColorLineBufferにコピーします。初回計算時と同様に、CopyBuffer関数を使用してデータをコピーします。
【if(copied <= 0) return(0)】
再び、コピーが失敗した場合に処理を終了します。copiedが0以下である場合、関数は0を返します。
サンプルコード解説7:OnCalculate関数の中3
ticks++; // ティックをカウント
if(ticks >= 5) // 5ティックごとに配色を変更
{
ticks = 0; // カウンタをリセット
modified++; // 変更カウンタをインクリメント
if(modified >= 3) modified = 0; // 変更カウンタをリセット
ResetLastError();
【ticks++】
この行は、ティックカウンタを1増加させます。ティックは市場の動き(取引)が発生するたびにカウントされます。
【if(ticks >= 5)】
この条件文は、ティックカウンタが5以上になった場合に実行されます。つまり、5ティックごとに配色を変更する条件を設定しています。
【ticks = 0】
この行は、ティックカウンタをリセットします。5ティックに達した後、カウンタを0に戻して次の5ティックを再カウントします。
【modified++】
この行は、変更カウンタを1増加させます。変更カウンタは、配色の変更回数を追跡します。
【if(modified >= 3) modified = 0】
この条件文は、変更カウンタが3以上になった場合に実行されます。3つの配色パターンがあるため、カウンタが3に達するとリセットして0に戻します。これにより、配色パターンが循環するようになります。
【ResetLastError()】
ResetLastError関数は、最後のエラーコードをリセットします。これにより、次のエラーが発生した場合に正確なエラーコードを取得できるようになります。
この部分のコードは、ティックカウンタと変更カウンタを使用して、定期的に配色を変更するロジックを実装しています。
サンプルコード解説8:OnCalculate関数の中4
// 配色を変更
switch(modified)
{
case 0:
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, clrRed); // 赤
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, clrBlue); // 青
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 2, clrGreen); // 緑
Print("Color scheme " + (string)modified);
break;
case 1:
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, clrYellow); // 黄
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, clrPink); // ピンク
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 2, clrLightSlateGray); // 薄いスレートグレー
Print("Color scheme " + (string)modified);
break;
default:
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, clrLightGoldenrod); // 薄いゴールデンロッド
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, clrOrchid); // 蘭色
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 2, clrLimeGreen); // ライムグリーン
Print("Color scheme " + (string)modified);
}
}
【配色を変更】
この部分のコードは、switch文を使用して、modified変数の値に基づいて配色を変更します。
【switch(modified)】
このswitch文は、modified変数の値に基づいて異なるケースを実行します。modifiedは、配色パターンを循環させるためのカウンタ変数です。
【case 0:】
このケースは、modifiedが0の場合に実行されます。PlotIndexSetInteger関数を使用して、線の色を設定します。ここでは、赤、青、緑の配色を設定しています。Print関数を使用して、現在の配色パターンをエキスパートログに出力します。
【case 1:】
このケースは、modifiedが1の場合に実行されます。PlotIndexSetInteger関数を使用して、線の色を設定します。ここでは、黄、ピンク、薄いスレートグレーの配色を設定しています。Print関数を使用して、現在の配色パターンをエキスパートログに出力します。
【default:】
このケースは、modifiedが0でも1でもない場合に実行されます。PlotIndexSetInteger関数を使用して、線の色を設定します。ここでは、薄いゴールデンロッド、蘭色、ライムグリーンの配色を設定しています。Print関数を使用して、現在の配色パターンをエキスパートログに出力します。
この部分のコードは、ティックカウンタと変更カウンタを使用して、定期的に線の配色を変更するロジックを実装しています。
サンプルコード解説9:OnCalculate関数の中5
else
{
//--- 開始位置を設定
limit = prev_calculated - 1;
//--- 全バーに対して線の色を設定
for(int i = limit; i < rates_total; i++)
ColorBuffer[i] = getIndexOfColor(i);
}
}
//--- 次回呼び出しのために計算済みバー数を返す
return(rates_total);
}
【else】
この部分のコードは、初回計算でない場合、すなわち既に計算されたバーが存在する場合に実行されます。
【limit = prev_calculated – 1】
この行は、開始位置を設定します。前回計算されたバーの数から1を引いた値をlimitに代入します。これにより、前回計算された最後のバーから再計算を開始します。
【for(int i = limit; i < rates_total; i++)】
このループは、limitから始まり、全てのバーに対して実行されます。rates_totalは、利用可能なバーの総数を示します。
【ColorBuffer[i] = getIndexOfColor(i)】
この行は、各バーに対して色インデックスを設定します。getIndexOfColor関数を使用して、現在のバーiに対応する色インデックスをColorBufferに設定します。
【return(rates_total)】
この行は、次回の呼び出しのために計算済みバー数としてrates_totalを返します。これにより、次回のOnCalculate関数呼び出し時に、前回計算されたバー数が正しく設定されます。
この部分のコードは、既に計算されたバーの数を基に再計算を行い、全てのバーに対して適切な色インデックスを設定するロジックを実装しています。
補足:ColorBuffer配列は結局どのように使われているのか?
ColorBuffer配列は、インジケータの色インデックスを保持するために使用されます・・・と説明したものの、結局どのように使われていたの?と腑に落ちない方もいらっしゃるのではないしょうか?
そんな方々の為にColorBuffer配列の処理過程について補足説明したいと思います。
まず大前提として、ColorBuffer配列には0、1、2の値が格納され、これらの値はPlotIndexSetInteger関数で設定された色インデックスに対応します。
例えば、以下のようにPlotIndexSetInteger関数を使用して色インデックスと色を関連付けます:
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 0, clrRed); // インデックス0に赤色を設定
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 1, clrBlue); // インデックス1に青色を設定
PlotIndexSetInteger(0, PLOT_LINE_COLOR, 2, clrGreen); // インデックス2に緑色を設定
その後、ColorBuffer配列にはgetIndexOfColor関数の結果として0、1、または2が格納されます:
for(int i = 0; i < rates_total; i++)
ColorBuffer[i] = getIndexOfColor(i);
これにより、インジケータが描画される際に、ColorBuffer配列の各値が対応するインデックスの色にマッピングされます。例えば、ColorBuffer[i]が0であれば、そのインデックスは赤色に対応します。ColorBuffer[i]が1であれば青色、2であれば緑色に対応します。
このようにして、ColorBuffer配列は、インジケータの各ポイントに適用される色を決定するために間接的に使用されています。PlotIndexSetInteger関数によって設定された色インデックスとColorBuffer配列の値が組み合わさることで、インジケータの各ポイントに適切な色が適用される仕組みになっています。