インジケータを書くとき注意すべきコード。
とある人のインジケータを見て気になったのでメモ。
下記は、終値を太いピンク色のラインで描くだけのインジケータですが、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); }
インジケータを自作したり、改造される人は注意してみてください。