2015年12月16日水曜日

[MT4プログラミング]小ネタ サブウィンドウ型インジケータ 名前の横の現在値を消す。

(追記)ごめんなさい。プログラムミスってました。 記事修正しました。 小ネタです。



サブウィンドウタイプのインジケータを作成すると、名前の横に現在値が表示されます。
結構邪魔なときがありますよね?

サブウィンドウ 名前横に現在値を表示しない方法です。

現在値ですが、SetIndexBufferで指定したバッファの数分だけ表示されます。

表示する値は各バッファの[0]の値です。

ただし、バッファ[0]の値がEMPTY_VALUEの場合、表示されないという特徴があります。これを利用して表示を消したいと思います。

公開しているDrawSimpleLineを使って試してみたいと思います。元のコードは過去記事をご覧ください。
http://mt4program.blogspot.com/2015/10/mt4drawsimpleline_8.html

プログラムの修正点は、各バッファのインデックス0の値は、EMPTY_VALUEにして、インデックスを一つずらしてバッファに設定してしまうことです。

一つずらしてバッファに設定すると、表示も一つずれそうなものなのですが、インデックス0がEmptyValueの場合、MT4が自動的に一つだけシフトして表示するようです。
SetIndexShiftでの指定は不要です。
(たぶん…明確なドキュメントは見つからないのですが、動きがそのようになっています。)

(追記)プログラムがバグってただけでした^^;;;; すみません。
SetIndexShiftにて表示のシフトが必要です。

赤字の部分が修正点となります。
・バッファにインデックスを指定するときに+1する。
・インデックス0には必ずEMPTY_VALUEを設定している。
・ループ範囲を一つ少なくする。
・SetIndexShiftで表示をずらす
の4か所です。

ソースコードはこちらから


//------------------------------------------------------------------
// Draw Simple Line 値表示なし版

#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window

//バッファーを指定する。
#property indicator_buffers 3

//プロット数を指定する。
#property indicator_plots   3

#property indicator_label1  "DIFF"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LINE1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrAqua
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

#property indicator_label3  "LINE2"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrIndianRed
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1

// 入力パラメータ 移動平均1期間
input int Ma1Period = 32;
// 入力パラメータ 移動平均2期間
input int Ma2Period = 256;
// 入力パラメータ 移動平均3期間
input int Ma3Period = 64;
// 入力パラメータ 移動平均4期間
input int Ma4Period = 128;

//入力パラメータ 移動平均種別
input ENUM_MA_METHOD MaMethod = MODE_SMA;

//入力パラメータ 適用価格
input ENUM_APPLIED_PRICE MaPrice = PRICE_CLOSE;

// バッファー
double diff1Buffer[];
double diff2Buffer[];
double diffBuffer[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
   // 短縮名を設定
   string shortName = "DSL (";
   shortName += IntegerToString(Ma1Period) + "-" + IntegerToString(Ma2Period) + ",";
   shortName += IntegerToString(Ma3Period) + "-" + IntegerToString(Ma4Period) + ")";
   IndicatorShortName(shortName);

   SetIndexBuffer(0, diffBuffer);
   SetIndexBuffer(1, diff1Buffer);
   SetIndexBuffer(2, diff2Buffer);
   
   SetIndexDrawBegin(0, Ma4Period);
   SetIndexDrawBegin(1, Ma2Period);
   SetIndexDrawBegin(2, Ma4Period);

   SetIndexShift(0, 1);
   SetIndexShift(1, 1);
   SetIndexShift(2, 1);

   return(INIT_SUCCEEDED);
}

//------------------------------------------------------------------
//計算イベント
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[])            //スプレット
{
   for( int i = rates_total - prev_calculated - 1 ; i >= 0; i-- )
   {
      if( i >= rates_total - 1) continue;
      diff1Buffer[i + 1] = NormalizeDouble(iMA(NULL, PERIOD_CURRENT, Ma1Period, 0, MaMethod, MaPrice, i) - iMA(NULL, PERIOD_CURRENT, Ma2Period, 0, MaMethod, MaPrice, i), 5);
      diff2Buffer[i + 1] = NormalizeDouble(iMA(NULL, PERIOD_CURRENT, Ma3Period, 0, MaMethod, MaPrice, i) - iMA(NULL, PERIOD_CURRENT, Ma4Period, 0, MaMethod, MaPrice, i), 5);
      diffBuffer[i + 1] = diff1Buffer[i + 1] - diff2Buffer[i + 1];
   }
   diff1Buffer[0] = EMPTY_VALUE;
   diff2Buffer[0] = EMPTY_VALUE;
   diffBuffer[0] = EMPTY_VALUE;

   return(rates_total - 1);
}