О #property, и не только

 
День добрый.
Я программист на С++. Пытаюсь освоить MQL4.
Попал мне в руки простенький индикаторчик, который в левом нижнем углу большими цветными цифрами высвечивает текущую цену Bid. Он не работал. Я его немного изменил и теперь все ОК.
В связи с этим возникло несколько вопросов. Привожу кусочек кода, который перед инициализацией.

//------------------------------------
//----
extern string note1="Change font colors automatically? True = Yes";
extern bool Bid_Ask_Colors=True;
extern string note2="Default Font Color";
extern color FontColor=Black;
extern string note3="Font Size";
extern int FontSize=24;
extern string note4="Font Type";
extern string FontType="Comic Sans MS";
extern string note5="Display the price in what corner?";
extern string note6="Upper left=0; Upper right=1";
extern string note7="Lower left=2; Lower right=3";
extern int WhatCorner=2;
//------------------------------------
Насколько я понял, первая директива
#property indicator_chart_window
предписывает рисовать индикатор в главном окне графика, то есть в текущем графике. Но этого не происходит. Индикатор не отобразился нигде. Я закомментировал эту строку и тогда индикатор появился. Может я что-то не так понимаю?

Еще пара вопросов по коду.
Все последующие объявления переменных очень похожи на диалог конфигурации. Действительно ли есть такая штуковина в языке? У меня все это не заработало, то есть, никаких вопросов-ответов не последовало.
И почему переменные объявляются как внешние (extern)? Они ведь больше нигде ранне не использовались. Глобальные переменные я объявляю просто, без extern. В чем тут фишка?

Заранее благодарю за разъяснения.

 
extern это переменные внешние на вкладке свойств программы Вашей.
 

1) #property indicator_chart_window - предписывает что индюк будет отображаться в основном окне графика, и для него не будет создано дополнительных окон.

2) глобальная переменная обьявленная экстерном, появится в окне настроек индикатора(советника, скрипта) и будет доступна для редактирования (изменения)

3) так как судя по тому куску кода что вы привели. индикатор рисуется графическими элементами (лейбами), а их можно присоединить к любому окну почему остальное не отображается - приведите весь код, может там и отображаться больше нечему.

4) И вообще юзайте хелп, ибо он рулит...

 
Спасибо за ответы.
Привожу весь код. Это уже после того, как я его немного подправил. В оригинале ObjectCreate и набор ObjectSet были в функции start(), а им там не место.
А потом я вообще повыкидывал все первоначальные установки и задал жестко цвета, угол, фонт и размер. Но все равно, если есть строка "#property indicator_chart_window", то индикатор не отображается. Странно.
Хэлп я пытаюсь юзать, оттуда и появились вопросы, потому что прога повела себя не так, как должна была.

#property indicator_chart_window
//----
extern string note1="Change font colors automatically? True = Yes";
extern bool Bid_Ask_Colors=True;
extern string note2="Default Font Color";
extern color FontColor=Black;
extern string note3="Font Size";
extern int FontSize=24;
extern string note4="Font Type";
extern string FontType="Comic Sans MS";
extern string note5="Display the price in what corner?";
extern string note6="Upper left=0; Upper right=1";
extern string note7="Lower left=2; Lower right=3";
extern int WhatCorner=2;
//----
double Old_Price;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
ObjectCreate("Market_Price_Label", OBJ_LABEL, 0, 0, 0);
ObjectSet("Market_Price_Label", OBJPROP_CORNER, WhatCorner);
ObjectSet("Market_Price_Label", OBJPROP_XDISTANCE, 1);
ObjectSet("Market_Price_Label", OBJPROP_YDISTANCE, 1);
return(0);
}
//------------------------------------------------------------------
int start()
{
if (Bid_Ask_Colors==True)
{
if (Bid > Old_Price) FontColor=LawnGreen;
if (Bid < Old_Price) FontColor=Red;
Old_Price=Bid;
}
string Market_Price=DoubleToStr(Bid, Digits);
//----
ObjectSetText("Market_Price_Label", Market_Price, FontSize, FontType, FontColor);

}
//------------------------------------------------------------------
int deinit()
{
ObjectDelete("Market_Price_Label");

return(0);
}
//+------------------------------------------------------------------+
 
#property indicator_chart_window
//----
extern string note1="Change font colors automatically? True = Yes";
extern bool Bid_Ask_Colors=True;
extern string note2="Default Font Color";
extern color FontColor=Black;
extern string note3="Font Size";
extern int FontSize=24;
extern string note4="Font Type";
extern string FontType="Comic Sans MS";
extern string note5="Display the price in what corner?";
extern string note6="Upper left=0; Upper right=1";
extern string note7="Lower left=2; Lower right=3";
extern int WhatCorner=2;
//----
double Old_Price;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
ObjectCreate("Market_Price_Label", OBJ_LABEL, 0, 0, 0);
ObjectSet("Market_Price_Label", OBJPROP_CORNER, WhatCorner);
ObjectSet("Market_Price_Label", OBJPROP_XDISTANCE, 1);
ObjectSet("Market_Price_Label", OBJPROP_YDISTANCE, 1);
//здесь вы объявили и разместили графический объект, но ничего в нем не написали, как вы думаете что будет отображаться на экране?
return(0);
}
//------------------------------------------------------------------
int start()
{
if (Bid_Ask_Colors==True)
{
if (Bid > Old_Price) FontColor=LawnGreen;
if (Bid < Old_Price) FontColor=Red;
Old_Price=Bid;
}
string Market_Price=DoubleToStr(Bid, Digits);
//----
ObjectSetText("Market_Price_Label", Market_Price, FontSize, FontType, FontColor);
// и только здесь вы в него вписали информацию, как вы думаете куда вы будете ее вписывать на следующем тике если ненароком его удалите ?
}
//------------------------------------------------------------------
int deinit()
{
ObjectDelete("Market_Price_Label");

return(0);
}
//+------------------------------------------------------------------+

И что должно выводиться на график, если кроме лейбы ничего не выводиться ?

 
Лишние комменты удалены, с формулировкой "оффтоп"
 

Вообще-то, как я говорил в начале, индикатор писал не я. Я только пытаюсь разобраться, как эта штуковина работает. MQL во многом принципиально отличается от С++.

После Init() действительно ничего не выводится. Согласен, тут можно написать текущую цену. Но после первого тика начинает выводиться.
В принципе, основной вопрос был по конфигурации при старте. Этого тоже не происходит.
А что Вы имеете в виду под "удалил ненароком"? Как это можно "ненароком" что-то удалить?

 

Живой пример, в любом другом советнике\индикаторе\скрипте

void deinit(){ObjectsDeleteAll();return;}

после чего сносится вся графика, куда писать будете ?

корректно было бы прежде чем писать, проверить - а есть ли такой объект ?

   if(ObjectFind("Market_Price_Label")<0){
      ObjectCreate("Market_Price_Label", OBJ_LABEL, 0, 0, 0);
      ObjectSet("Market_Price_Label", OBJPROP_CORNER, WhatCorner);
      ObjectSet("Market_Price_Label", OBJPROP_XDISTANCE, 1);
      ObjectSet("Market_Price_Label", OBJPROP_YDISTANCE, 1);
   }
   ObjectSetText("Market_Price_Label", Market_Price, FontSize, FontType, FontColor);
 
xrust:

корректно было бы прежде чем писать, проверить - а есть ли такой объект ?


Да, логично, согласен.

Я попробую разобраться сам и не забивать форум пустяками.

Спасибо всем.

Причина обращения: