ローソク足の色を特定条件下で変更するにはヒストグラム(HISTGRAM)を使えばよい

疑似的なローソク足で表現する

ローソク足の色は通常、陽線か陰線で分けられますが、チャート分析する際に、ある条件が成立している時のローソク足とそうでないローソク足を分けたい時ってありませんか?

疑似的ではあるものの、ローソク足の色を自由に分ける方法がありますので、それをご紹介します。

例えば、こんな感じで表現できます。

ヒストグラムでローソク足を描画

上記例ではサーバ時間が奇数時間か偶数時間かで色を分けています(これ自体に意味はありません)。

色分けの条件は自由に決められますので、面白い発見があるかもしれません。

さて、この疑似ローソク足は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」にします。

ラインチャートは無色に

これで元々あったローソク足は消えて、インジケーターの疑似ローソク足のみが表示されるようになります。

なお、チャートを拡大・縮小すると、実体とヒゲの太さのバランスが崩れて、見た目がおかしくなりますので、パラメーターで実体の太さを調整してくださいね。

ぜひお試しあれ!

MT4の無料プログラミング講座

メルマガ登録して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG