Вертикальная линия на каждую последующую свечу - страница 2

 
Вот посмотри . Думаю что тебе подходит полностью. 
Файлы:
 
Дмитрий Ушаков:

Вы файл ошибочно приложили или автор темы вам что-то очень плохое сделал?

Просто код в приложенном файле на каждом тике удаляет линию и вновь её создаёт.

int start(){
ObjectDelete("1_bars");
ObjectCreate("1_bars",OBJ_VLINE,0,Time[Create_bar],Bid);// Time [0] - ставиться на нулевой бар, самый первый на графике. если 1 значит на первый
ObjectSet   ("1_bars",OBJPROP_COLOR,Line_1_barsColor);
ObjectSet   ("1_bars",OBJPROP_STYLE,Line_1_barsStyle);
ObjectSet   ("1_bars",OBJPROP_WIDTH,Line_1_barsWidth);
ObjectSet   ("1_bars",OBJPROP_BACK,Draw_as_Background);


return(0);}

Видны и другие не оптимальные моменты.

P./S.: Да и сконструировать в коде перемещение линии при появлении нового бара (вместо создания-удаления каждый раз) - как-то по оптимальнее будет, полагаю.

 
Dina Paches:

Вы файл ошибочно приложили или автор темы вам что-то очень плохое сделал?

Просто код в приложенном файле на каждом тике удаляет линию и вновь её создаёт.

Видны и другие не оптимальные моменты.

P./S.: Да и сконструировать в коде перемещение линии при появлении нового бара (вместо создания-удаления каждый раз) - как-то по оптимальнее будет, полагаю.

Нет ничего проще сделать функцию, которая будет и линию строить, и перемещать её, и другие нужные изменения с ней проводить. Каждый раз, при необходимости создать линию, или поменять её параметры, или восстановить случайно удалённую, вызывается одна и та же функция с нужными параметрами.

//+------------------------------------------------------------------+
void SetVLine(const long chart_id, const string name, color line_color, const int sub_window,
              datetime line_time, int line_width=1, int line_style=STYLE_SOLID, string line_text="", 
              string tooltip="\n", int zorder=0, bool selectable=false, bool selection=false, bool hidden=true) {
   
   if(ObjectFind(name)<0) ObjectCreate(chart_id,name,OBJ_VLINE,sub_window,line_time,0);
   ObjectSetInteger(chart_id,name,OBJPROP_TIME1,line_time);
   ObjectSetInteger(chart_id,name,OBJPROP_COLOR,line_color);
   ObjectSetInteger(chart_id,name,OBJPROP_STYLE,line_style);
   ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,line_width);
   ObjectSetString(chart_id,name,OBJPROP_TEXT,line_text);
   ObjectSetString(chart_id,name,OBJPROP_FONT,"Tahoma");
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,selectable);
   ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(chart_id,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,zorder);
   ObjectSetString(chart_id,name,OBJPROP_TOOLTIP,tooltip);
}
//+------------------------------------------------------------------+
 
Artyom Trishkin:

Нет ничего проще сделать функцию, которая будет и линию строить, и перемещать её, и другие нужные изменения с ней проводить. Каждый раз, при необходимости создать линию, или поменять её параметры, или восстановить случайно удалённую, вызывается одна и та же функция с нужными параметрами.

Разный подход к этому может быть.

Но проверка наличия объекта, да, и я считаю должна быть.

У меня это может применяться, например, по такой схеме:

 if(ObjectFind(chart_ID,...)<0)
        {
         VLineCreate(...);
        }

где для создания объектов, например, отдельная функция на основе из Документации:

//+------------------------------------------------------------------+
//| Создает вертикальную линию                                       |
//+------------------------------------------------------------------+
//| На основе:                                                       |
//| Справочник MQL5 / Стандартные константы, перечисления и структуры| 
//| / Константы объектов  / Типы объектов / OBJ_VLINE                |
//+------------------------------------------------------------------+
bool VLineCreate(const long            chart_ID=0,        // ID графика
                 const string          name="VLine",      // имя линии
                 const int             sub_window=0,      // номер подокна
                 datetime              time=0,            // время линии
                 const string          toolTip="\n",      // текст всплывающей подсказки
                 const color           clr=clrRed,        // цвет линии
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
                 const int             width=1,           // толщина линии
                 const bool            back=false,        // на заднем плане
                 const bool            selection=true,    // выделить для перемещений
                 const bool            ray=true,          // продолжение линии вниз
                 const bool            hidden=true,       // скрыт в списке объектов
                 const long            z_order=0,         // приоритет на нажатие мышью
                 const int             timeFrames=OBJ_ALL_PERIODS)//отображение объекта на различных периодах
  {
//--- если время линии не задано, то проводим ее через последний бар
   if(!time)
      time=TimeCurrent();
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим вертикальную линию
   if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0))
     {
      Print(LINE_NUMBER,__FUNCTION__,
            ": failed to create a vertical line! Error code = ",GetLastError());
      return(false);
     }
//--- установим текст всплывающей подсказки
   ObSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- установим цвет линии  
   ObSetIntegerColor(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObSetIntegerLineStyle(chart_ID,name,style);
//--- установим толщину линии
   ObSetIntegerInt(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObSetIntegerBool(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTED,selection);
//--- включим (true) или отключим (false) режим отображения линии в подокнах графика
   ObSetIntegerBool(chart_ID,name,OBJPROP_RAY,ray);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObSetIntegerBool(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObSetIntegerLong(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- установка видимости объекта на различных таймфреймах  
   ObSetIntegerInt(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
//--- успешное выполнение
   return(true);
  }

Где, в свою очередь, ObSetString(), ObSetIntegerColor(), ObSetIntegerLineStyle() и т.д. - это отдельные функции с проверочными условиями (вместе с функциями по созданию объектов, они у меня здесь в Кодобазе выложены одним включаемым файлом).


Для перемещения же объектов сама предпочитаю применение отдельных целенаправленных функций.

Как и для различных модификаций объектов (т.е., применение отдельных функций, состоящих, в т.ч., возможно из каких-то отдельных с включением каких-то проверочных условий). Чтоб не поднимать и не перезаписывать то, что не требуется, когда это возможно. Пример из таких функций:

//+--------------------------------------------------------------------+
//| ObSetString (Установка значения свойства, не имеющего модификатора)|
//| значения перечислений ENUM_OBJECT_PROPERTY_STRING:                 |
//+--------------------------------------------------------------------+
//| OBJPROP_NAME - Имя объекта - string;                               |
//+--------------------------------------------------------------------+
//| OBJPROP_TEXT - Описание объекта (текст, содержащийся в объекте)-   |
//| string;                                                            |
//+--------------------------------------------------------------------+
//| OBJPROP_TOOLTIP - Текст всплывающей подсказки. Если свойство не    |
//| задано, то показывается подсказка, автоматически сформированная    |
//| терминалом. Можно  отключить показ подсказки, установив для нее    |
//| значение "\n" (перевод строки)- string;                            |
//+--------------------------------------------------------------------+
//| OBJPROP_FONT - Шрифт - string;                                     |
//+--------------------------------------------------------------------+
//| OBJPROP_SYMBOL Символ для объекта "График" - string.               |
//+--------------------------------------------------------------------+
bool ObSetString(long chart_ID,// идентификатор графика
                 string name,// имя объекта
                 ENUM_OBJECT_PROPERTY_STRING prop_id,// свойство
                 string prop_value)// значение
  {
   ResetLastError();
   if(!ObjectSetString(chart_ID,name,prop_id,prop_value))
     {
      Print(LINE_NUMBER,__FUNCTION__,", Error Code = ",
            GetLastError());
      return(false);
     }
   return(true);
  }

Как-то так.

 

Т.е., если конструировать программу чисто только в рамках вопроса автора темы, то, с моей точки зрения, примерно такая схема:

Если MQL4, то наличие #property strict в коде. Если MQL5, то без него.

Входные параметры через input.

В OnDeinit() примерно такое удаление, как в этой функции или через эту или подобную функцию:

//+------------------------------------------------------------------+
//| Удаление одиночного объекта с известным именем                   |
//+------------------------------------------------------------------+
bool ObDelete(long chart_ID,string name)
  {
   if(ObjectFind(chart_ID,name)>-1)
     {
      ResetLastError();
      if(!ObjectDelete(chart_ID,name))
        {
         Print(LINE_NUMBER,__FUNCTION__,", Error Code = ",
               GetLastError(),", name: ",name);
         return(false);
        }
     }
   return(true);
  }

В OnCalculate():

  • проверка новый бар или нет;
  • если бар не новый - ничего не делаем;
  • если новый, то проверка есть вертикальная линия программы на графике или нет;
  • если её нет - создание;
  • если же она есть  - её перемещение.
 
RamsesBor:
Ребята всем привет! Ищу индикатор который бы на каждую новую свечу последовательно рисовал вертикальную линию вместе с подвалом. А предыдущие вертикальные линии убирал. Короче каждая новая свеча сразу появлялась с новой вертикальной линией и линия исчезала с появлением новой свечи. Если нету такого индикатора, то плиз его написать помоему просто, выложите кто нибудь. Чтоб в настройках индюка можно было менять тип линии и толщину и цвет. Плиз помогите.
Держите.
Файлы:
 
Сергей, а можно исходник?
Причина обращения: