疑似的なローソク足で表現する
ローソク足の色は通常、陽線か陰線で分けられますが、チャート分析する際に、ある条件が成立している時のローソク足とそうでないローソク足を分けたい時ってありませんか?
疑似的ではあるものの、ローソク足の色を自由に分ける方法がありますので、それをご紹介します。
例えば、こんな感じで表現できます。
上記例ではサーバ時間が奇数時間か偶数時間かで色を分けています(これ自体に意味はありません)。
色分けの条件は自由に決められますので、面白い発見があるかもしれません。
さて、この疑似ローソク足は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」にします。
これで元々あったローソク足は消えて、インジケーターの疑似ローソク足のみが表示されるようになります。
なお、チャートを拡大・縮小すると、実体とヒゲの太さのバランスが崩れて、見た目がおかしくなりますので、パラメーターで実体の太さを調整してくださいね。
ぜひお試しあれ!