インジケータを書くとき注意すべきコード。

とある人のインジケータを見て気になったのでメモ。
下記は、終値を太いピンク色のラインで描くだけのインジケータですが、forループが無駄に多く回る
以外に1箇所だけ好ましくない部分があります。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
double ExtMapBuffer1[];
int init()
{
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3,DeepPink);
   SetIndexBuffer(0,ExtMapBuffer1);
   return(0);
}
int start()
{
   for(int i=Bars-1;i>=0;i--) ExtMapBuffer1[i]=Close[i];
   return(0);
}

何が問題かというと…



init()内で、
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3,DeepPink);
で色や太さを指定している点です。
チャート上で、このインジケータの色や太さ等のスタイルをプロパティから変更し、その後、MetaTrader4 を再起動すると、起動時にinit()が実行される為に、元のDeepPinkに戻ってしまいます。
また、このインジケータをチャートに表示している状態で、インジケータをリコンパイルすると、赤いラインに変わってしまいます。
この辺りは実際に動かしてみると良く分かると思います。



適切な書き方は、SetIndexStyleではスタイルを指定せずに、#property で全て設定するカタチです。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 DeepPink
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
double ExtMapBuffer1[];
int init()
{
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   return(0);
}
int start()
{
   for(int i=Bars-1;i>=0;i--) ExtMapBuffer1[i]=Close[i];
   return(0);
}

インジケータを自作したり、改造される人は注意してみてください。