Bidラインの色だけを変える。


MT4 では、Bidラインだけの色を変えることは出来ません。F8キーを押して、プロパティでグリッドの色を変えれば、Bidラインの色も一緒に変えられるのですが、
グリッドはグレーのままにしておきたい人にはちょっと不便ですよね。
そんな時に役立つのが、Bid_Line.mq4 で、コードとそのポイントは以下の通りです。

#property indicator_chart_window

extern color BidLineColor = DodgerBlue;
extern string BidLineName = "Bid_Line";
int init()
{
   SetIndexLabel(0,NULL);
   return(0);
}
int deinit()
{
   ObjectDelete(BidLineName);
   return(0);
}
int start()
{
   if(ObjectFind(BidLineName) == -1){
      ObjectCreate(BidLineName,OBJ_HLINE,0,0,Bid);
      ObjectSet(BidLineName,OBJPROP_COLOR,BidLineColor);
   }
   ObjectSet(BidLineName,OBJPROP_PRICE1,Bid);
   return(0);
}

単純なコードですが、気になるポイント?を説明しておきます..。

   SetIndexLabel(0,NULL);

これは、データウィンドウに余分な表示を出させないための一行です。
上のインジケータは、indexbuffer を使っていないのにも関わらず、この一行が必要となります。



次のポイントは、ObjectCreate() のタイミングを start() 内で行っている点です。
考え方として

(1)init() 内で、ObjectCreate()
(2)start() 内で、ObjectSet()
(3)deinit() 内で、ObjectDelete()

という処理をやりたくなるのは、自然な流れなのですが、これには欠点が2つあります。
欠点1. ユーザが、うっかりオブジェクトを選択削除してしまった場合のリカバリが自動で出来ない...
欠点2. init()内では、サブウィンドウにオブジェクトを作れない

で、その欠点を回避できるのが、

(1)start() 内で、ObjectCreate(),ObjectSet()
(2)deinit() 内で、ObjectDelete()

なのです。詳細な説明は省略しますが、コメントに疑問等を書いてもらえれば後日 日記にしまする...。
(今夜は歩き疲れてフラフラなのです。。。><