| #property strict//--- описание
 #property description "Скрипт создает графический объект \"Текст\"."
 //--- покажем окно входных параметров при запуске скрипта
 #property script_show_inputs
 //--- входные параметры скрипта
 input string            InpFont="Arial";         // Шрифт
 input int               InpFontSize=10;          // Размер шрифта
 input color             InpColor=clrRed;         // Цвет
 input double            InpAngle=90.0;           // Угол наклона в градусах
 input ENUM_ANCHOR_POINT InpAnchor=ANCHOR_LEFT;   // Способ привязки
 input bool              InpBack=false;           // Объект на заднем плане
 input bool              InpSelection=false;      // Выделить для перемещений
 input bool              InpHidden=true;          // Скрыт в списке объектов
 input long              InpZOrder=0;             // Приоритет на нажатие мышью
 //+------------------------------------------------------------------+
 //| Создает объект "Текст"                                           |
 //+------------------------------------------------------------------+
 bool TextCreate(const long              chart_ID=0,               // ID графика
 const string            name="Text",              // имя объекта
 const int               sub_window=0,             // номер подокна
 datetime                time=0,                   // время точки привязки
 double                  price=0,                  // цена точки привязки
 const string            text="Text",              // сам текст
 const string            font="Arial",             // шрифт
 const int               font_size=10,             // размер шрифта
 const color             clr=clrRed,               // цвет
 const double            angle=0.0,                // наклон текста
 const ENUM_ANCHOR_POINT anchor=ANCHOR_LEFT_UPPER, // способ привязки
 const bool              back=false,               // на заднем плане
 const bool              selection=false,          // выделить для перемещений
 const bool              hidden=true,              // скрыт в списке объектов
 const long              z_order=0)                // приоритет на нажатие мышью
 {
 //--- установим координаты точки привязки, если они не заданы
 ChangeTextEmptyPoint(time,price);
 //--- сбросим значение ошибки
 ResetLastError();
 //--- создадим объект "Текст"
 if(!ObjectCreate(chart_ID,name,OBJ_TEXT,sub_window,time,price))
 {
 Print(__FUNCTION__,
 ": не удалось создать объект \"Текст\"! Код ошибки = ",GetLastError());
 return(false);
 }
 //--- установим текст
 ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
 //--- установим шрифт текста
 ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
 //--- установим размер шрифта
 ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
 //--- установим угол наклона текста
 ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle);
 //--- установим способ привязки
 ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor);
 //--- установим цвет
 ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
 //--- отобразим на переднем (false) или заднем (true) плане
 ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
 //--- включим (true) или отключим (false) режим перемещения объекта мышью
 ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
 ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
 //--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
 ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
 //--- установим приоритет на получение события нажатия мыши на графике
 ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
 //--- успешное выполнение
 return(true);
 }
 //+------------------------------------------------------------------+
 //| Перемещает точку привязки                                        |
 //+------------------------------------------------------------------+
 bool TextMove(const long   chart_ID=0,  // ID графика
 const string name="Text", // имя объекта
 datetime     time=0,      // координата времени точки привязки
 double       price=0)     // координата цены точки привязки
 {
 //--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
 if(!time)
 time=TimeCurrent();
 if(!price)
 price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
 //--- сбросим значение ошибки
 ResetLastError();
 //--- переместим точку привязки
 if(!ObjectMove(chart_ID,name,0,time,price))
 {
 Print(__FUNCTION__,
 ": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
 return(false);
 }
 //--- успешное выполнение
 return(true);
 }
 //+------------------------------------------------------------------+
 //| Изменяет текст объекта                                           |
 //+------------------------------------------------------------------+
 bool TextChange(const long   chart_ID=0,  // ID графика
 const string name="Text", // имя объекта
 const string text="Text") // текст
 {
 //--- сбросим значение ошибки
 ResetLastError();
 //--- изменим текст объекта
 if(!ObjectSetString(chart_ID,name,OBJPROP_TEXT,text))
 {
 Print(__FUNCTION__,
 ": не удалось изменить текст! Код ошибки = ",GetLastError());
 return(false);
 }
 //--- успешное выполнение
 return(true);
 }
 //+------------------------------------------------------------------+
 //| Удаляет объект "Текст"                                           |
 //+------------------------------------------------------------------+
 bool TextDelete(const long   chart_ID=0,  // ID графика
 const string name="Text") // имя объекта
 {
 //--- сбросим значение ошибки
 ResetLastError();
 //--- удалим объект
 if(!ObjectDelete(chart_ID,name))
 {
 Print(__FUNCTION__,
 ": не удалось удалить объект \"Текст\"! Код ошибки = ",GetLastError());
 return(false);
 }
 //--- успешное выполнение
 return(true);
 }
 //+------------------------------------------------------------------+
 //| Проверяет значения точки привязки и для пустых значений          |
 //| устанавливает значения по умолчанию                              |
 //+------------------------------------------------------------------+
 void ChangeTextEmptyPoint(datetime &time,double &price)
 {
 //--- если время точки не задано, то она будет на текущем баре
 if(!time)
 time=TimeCurrent();
 //--- если цена точки не задана, то она будет иметь значение Bid
 if(!price)
 price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
 }
 //+------------------------------------------------------------------+
 //| Script program start function                                    |
 //+------------------------------------------------------------------+
 void OnStart()
 {
 datetime date[]; // массив для хранения дат видимых баров
 double   low[];  // массив для хранения цен Low видимых баров
 double   high[]; // массив для хранения цен High видимых баров
 //--- количество видимых баров в окне графика
 int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS);
 //--- выделение памяти
 ArrayResize(date,bars);
 ArrayResize(low,bars);
 ArrayResize(high,bars);
 //--- заполним массив дат
 ResetLastError();
 if(CopyTime(Symbol(),Period(),0,bars,date)==-1)
 {
 Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
 return;
 }
 //--- заполним массив цен Low
 if(CopyLow(Symbol(),Period(),0,bars,low)==-1)
 {
 Print("Не удалось скопировать значения цен Low! Код ошибки = ",GetLastError());
 return;
 }
 //--- заполним массив цен High
 if(CopyHigh(Symbol(),Period(),0,bars,high)==-1)
 {
 Print("Не удалось скопировать значения цен High! Код ошибки = ",GetLastError());
 return;
 }
 //--- определим, как часто надо делать надписи
 int scale=(int)ChartGetInteger(0,CHART_SCALE);
 //--- определим шаг
 int step=1;
 switch(scale)
 {
 case 0:
 step=12;
 break;
 case 1:
 step=6;
 break;
 case 2:
 step=4;
 break;
 case 3:
 step=2;
 break;
 }
 //--- создадим надписи для значений High и Low баров (с промежутками)
 for(int i=0;i<bars;i+=step)
 {
 //--- создаем надписи
 if(!TextCreate(0,"TextHigh_"+(string)i,0,date[i],high[i],DoubleToString(high[i],5),InpFont,InpFontSize,
 InpColor,InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
 {
 return;
 }
 if(!TextCreate(0,"TextLow_"+(string)i,0,date[i],low[i],DoubleToString(low[i],5),InpFont,InpFontSize,
 InpColor,-InpAngle,InpAnchor,InpBack,InpSelection,InpHidden,InpZOrder))
 {
 return;
 }
 //--- проверим факт принудительного завершения скрипта
 if(IsStopped())
 return;
 //--- перерисуем график
 ChartRedraw();
 // задержка в 0.05 секунды
 Sleep(50);
 }
 //--- задержка в полсекунды
 Sleep(500);
 //--- удалим надписи
 for(int i=0;i<bars;i+=step)
 {
 if(!TextDelete(0,"TextHigh_"+(string)i))
 return;
 if(!TextDelete(0,"TextLow_"+(string)i))
 return;
 //--- перерисуем график
 ChartRedraw();
 // задержка в 0.05 секунды
 Sleep(50);
 }
 //---
 }
 |