#property strict 
//--- описание 
#property description "Скрипт рисует знак \"Галка\"." 
#property description "Координата точки привязки задается в" 
#property description "процентах от размеров окна графика." 
//--- покажем окно входных параметров при запуске скрипта 
#property script_show_inputs 
//--- входные параметры скрипта 
input string            InpName="ArrowCheck"; // Имя знака 
input int               InpDate=10;           // Дата точки привязки в % 
input int               InpPrice=50;          // Цена точки привязки в % 
input ENUM_ARROW_ANCHOR InpAnchor=ANCHOR_TOP; // Способ привязки 
input color             InpColor=clrRed;      // Цвет знака 
input ENUM_LINE_STYLE   InpStyle=STYLE_DOT;   // Стиль окаймляющей линии 
input int               InpWidth=5;           // Размер знака 
input bool              InpBack=false;        // Знак на заднем плане 
input bool              InpSelection=false;   // Выделить для перемещений 
input bool              InpHidden=true;       // Скрыт в списке объектов 
input long              InpZOrder=0;          // Приоритет на нажатие мышью 
//+------------------------------------------------------------------+ 
//| Создает знак "Галка"                                             | 
//+------------------------------------------------------------------+ 
bool ArrowCheckCreate(const long              chart_ID=0,           // ID графика 
                      const string            name="ArrowCheck",    // имя знака 
                      const int               sub_window=0,         // номер подокна 
                      datetime                time=0,               // время точки привязки 
                      double                  price=0,              // цена точки привязки 
                      const ENUM_ARROW_ANCHOR anchor=ANCHOR_BOTTOM, // способ привязки 
                      const color             clr=clrRed,           // цвет знака 
                      const ENUM_LINE_STYLE   style=STYLE_SOLID,    // стиль окаймляющей линии 
                      const int               width=3,              // размер знака 
                      const bool              back=false,           // на заднем плане 
                      const bool              selection=true,       // выделить для перемещений 
                      const bool              hidden=true,          // скрыт в списке объектов 
                      const long              z_order=0)            // приоритет на нажатие мышью 
  { 
//--- установим координаты точки привязки, если они не заданы 
   ChangeArrowEmptyPoint(time,price); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим знак 
   if(!ObjectCreate(chart_ID,name,OBJ_ARROW_CHECK,sub_window,time,price)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать знак \"Галка\"! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- установим способ привязки 
   ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); 
//--- установим цвет знака 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль окаймляющей линии 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим размер знака 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим перемещения знака мышью 
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект 
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   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 ArrowCheckMove(const long   chart_ID=0,        // ID графика 
                    const string name="ArrowCheck", // имя объекта 
                    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 ArrowCheckAnchorChange(const long              chart_ID=0,        // ID графика 
                            const string            name="ArrowCheck", // имя объекта 
                            const ENUM_ARROW_ANCHOR anchor=ANCHOR_TOP) // способ привязки 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- изменим способ привязки 
   if(!ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось изменить способ привязки! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Удаляет знак "Галка"                                             | 
//+------------------------------------------------------------------+ 
bool ArrowCheckDelete(const long   chart_ID=0,        // ID графика 
                      const string name="ArrowCheck") // имя знака 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- удалим знак 
   if(!ObjectDelete(chart_ID,name)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось удалить знак \"Галка\"! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Проверяет значения точки привязки и для пустых значений          | 
//| устанавливает значения по умолчанию                              | 
//+------------------------------------------------------------------+ 
void ChangeArrowEmptyPoint(datetime &time,double &price) 
  { 
//--- если время точки не задано, то она будет на текущем баре 
   if(!time) 
      time=TimeCurrent(); 
//--- если цена точки не задана, то она будет иметь значение Bid 
   if(!price) 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID); 
  } 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- проверим входные параметры на корректность 
   if(InpDate<0 || InpDate>100 || InpPrice<0 || InpPrice>100) 
     { 
      Print("Ошибка! Некорректные значения входных параметров!"); 
      return; 
     } 
//--- количество видимых баров в окне графика 
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS); 
//--- размер массива price 
   int accuracy=1000; 
//--- массивы для хранения значений дат и цен, которые будут использованы 
//--- для установки и изменения координат точки привязки знака 
   datetime date[]; 
   double   price[]; 
//--- выделение памяти 
   ArrayResize(date,bars); 
   ArrayResize(price,accuracy); 
//--- заполним массив дат 
   ResetLastError(); 
   if(CopyTime(Symbol(),Period(),0,bars,date)==-1) 
     { 
      Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError()); 
      return; 
     } 
//--- заполним массив цен 
//--- найдем максимальное и минимальное значение графика 
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX); 
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN); 
//--- определим шаг изменения цены и заполним массив 
   double step=(max_price-min_price)/accuracy; 
   for(int i=0;i<accuracy;i++) 
      price[i]=min_price+i*step; 
//--- определим точки для рисования знака 
   int d=InpDate*(bars-1)/100; 
   int p=InpPrice*(accuracy-1)/100; 
//--- создадим знак "Галка" на графике 
   if(!ArrowCheckCreate(0,InpName,0,date[d],price[p],InpAnchor,InpColor, 
      InpStyle,InpWidth,InpBack,InpSelection,InpHidden,InpZOrder)) 
     { 
      return; 
     } 
//--- перерисуем график и подождем 1 секунду 
   ChartRedraw(); 
   Sleep(1000); 
//--- теперь будем перемещать точку привязки и менять ее положение относительно знака 
//--- счетчик цикла 
   int h_steps=bars*2/5; 
//--- перемещаем точку привязки 
   for(int i=0;i<h_steps;i++) 
     { 
      //--- возьмем следующее значение 
      if(d<bars-1) 
         d+=1; 
      //--- сдвигаем точку 
      if(!ArrowCheckMove(0,InpName,date[d],price[p])) 
         return; 
      //--- проверим факт принудительного завершения скрипта 
      if(IsStopped()) 
         return; 
      //--- перерисуем график 
      ChartRedraw(); 
      // задержка в 0.025 секунды 
      Sleep(25); 
     } 
//--- меняем положение точки привязки относительно знака 
   ArrowCheckAnchorChange(0,InpName,ANCHOR_BOTTOM); 
//--- перерисуем график 
   ChartRedraw(); 
//--- счетчик цикла 
   h_steps=bars*2/5; 
//--- перемещаем точку привязки 
   for(int i=0;i<h_steps;i++) 
     { 
      //--- возьмем следующее значение 
      if(d<bars-1) 
         d+=1; 
      //--- сдвигаем точку 
      if(!ArrowCheckMove(0,InpName,date[d],price[p])) 
         return; 
      //--- проверим факт принудительного завершения скрипта 
      if(IsStopped()) 
         return; 
      //--- перерисуем график 
      ChartRedraw(); 
      // задержка в 0.025 секунды 
      Sleep(25); 
     } 
//--- задержка в 1 секунду 
   Sleep(1000); 
//--- удалим знак с графика 
   ArrowCheckDelete(0,InpName); 
   ChartRedraw(); 
//--- задержка в 1 секунду 
   Sleep(1000); 
//--- 
  }  |