//--- описание #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); //--- } |