疑似的なローソク足で表現する
ローソク足の色は通常、陽線か陰線で分けられますが、チャート分析する際に、ある条件が成立している時のローソク足とそうでないローソク足を分けたい時ってありませんか?
疑似的ではあるものの、ローソク足の色を自由に分ける方法がありますので、それをご紹介します。
例えば、こんな感じで表現できます。

上記例ではサーバ時間が奇数時間か偶数時間かで色を分けています(これ自体に意味はありません)。
色分けの条件は自由に決められますので、面白い発見があるかもしれません。
さて、この疑似ローソク足はHISTGRAM(ヒストグラム)のインジケーターで実現できます。
早速、インジケーターのコードをお見せしましょう。
#property indicator_chart_window
#property indicator_buffers 4
#property strict
extern int WickWidth = 1; // ヒゲの幅
extern int BodyWidth = 2; // 実体の幅
double wup[];
double wdn[];
double bup[];
double bdn[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 0と1でペア(ヒゲのペア)
SetIndexBuffer(0, wup); SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, WickWidth, clrYellow);
SetIndexBuffer(1, wdn); SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, WickWidth, clrTomato);
// 2と3でペア(実体のペア)
SetIndexBuffer(2, bup); SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID, BodyWidth, clrYellow);
SetIndexBuffer(3, bdn); SetIndexStyle(3, DRAW_HISTOGRAM, STYLE_SOLID, BodyWidth, clrTomato);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 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[])
{
int counted_bars = IndicatorCounted();
//---- last counted bar will be recounted
if(counted_bars > 0){
counted_bars--;
}
int limit = Bars - counted_bars - 1;
for(int i = 0; i <= limit; i++){
// 初期化必須(都度、初期化しないと色が混ざることになる)
wup[i] = EMPTY_VALUE;
wdn[i] = EMPTY_VALUE;
bup[i] = EMPTY_VALUE;
bdn[i] = EMPTY_VALUE;
datetime hour = TimeHour(Time[i]);
// 時が偶数
if(MathMod(hour, 2) == 0){
// ヒゲのペア
wup[i] = High[i];
wdn[i] = Low[i];
// →ペアの中で大きい方のバッファが採用されて描画される模様
// 具体的にはwup > wdnなのでwup(バッファ0)の色や幅が採用
// ヒストグラム(棒)の上端はペア内で大きい方、下端は小さい方、高さはその差分
// 実体のペア
bup[i] = MathMax(Open[i], Close[i]);
bdn[i] = MathMin(Open[i], Close[i]);
// 時が奇数
}else{
// ヒゲのペア
wup[i] = Low[i];
wdn[i] = High[i];
// 実体のペア
bup[i] = MathMin(Open[i], Close[i]);
bdn[i] = MathMax(Open[i], Close[i]);
}
}
return(rates_total);
}
ヒストグラムの場合、SetIndexBuffer関数の書き順が特に重要で、0と1、2と3がそれぞれペアになります。
この順番を守らないと表示がおかしくなりますので、ご注意ください。
ヒストグラムはクセが強くて、非常に使いにくい代物ですね…。
このサンプルコードを実用化する際は、「時が偶数」と「時が奇数」のif文の中身をご希望の条件に書き換えてください。
どんな条件でも可能ですので、何か面白い発見があるかもしれませんよ。
無色のラインチャートに変更するべし
実はインジケーターをチャートに設定するだけでは不十分です。
そのままだと、元々あるローソク足の陽線、陰線とバッティングしてしまいます。
そのため、元のローソク足を非表示にする必要があります。
非表示にするには、ローソク足をラインチャートに変更し、色を無色に変えればOKです。
手順としては、まずチャートを選択して、Alt+3キーを押すか画面上部の「チャート」メニューから「ラインチャート」を選択します。
次に、チャートを右クリックして、「プロパティ」を選択します。
ラインチャートを「None」にします。

これで元々あったローソク足は消えて、インジケーターの疑似ローソク足のみが表示されるようになります。
なお、チャートを拡大・縮小すると、実体とヒゲの太さのバランスが崩れて、見た目がおかしくなりますので、パラメーターで実体の太さを調整してくださいね。
ぜひお試しあれ!
