Модификация правой метки

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey Kornishkin
9938
Andrey Kornishkin  

Приветствую! Пытаюсь модифицировать координату времени правой метки:


void ModeObjects()
  {
   for(int i=ObjectsTotal()-1;i>=0;i--)
     {
      if(ObjectType(ObjectName(i))==OBJ_TREND) ObjectSet(ObjectName(i),OBJPROP_TIME2,Time[0]+PeriodSeconds()*BarsCount);
      if(ObjectType(ObjectName(i))==OBJ_ARROW_RIGHT_PRICE) (ObjectName(i),OBJPROP_TIME,Time[0]+PeriodSeconds()*BarsCount);
     }
  }

Таким образом модифицируется координата времени трендовой линии, но метка не модифицируется. В чем может быть причина?
По задумке метка должна быть на правом конце трендовой линии и перемещаться вместе с ее правым концом. 

Пробовал двигать метку с помощью ObjectMove, ObjectSetInteger, менял свойства метки, но никак.

рис.1.

null


код индикатора:

#property version   "1.00"
#property strict
#property indicator_chart_window

input int LineWidth=1;
input int LineStyle=3;
input color LineColor=Red;

input int LabelWidth=1;
input color LabelColor=Red;

input int BarsCount=10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ModeObjects();
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutTrendLine(string name,datetime time1,double price1,datetime time2,double price2)
  {
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
//--- установим цвет линии 
   ObjectSetInteger(0,name,OBJPROP_COLOR,LineColor);
//--- установим стиль отображения линии 
   ObjectSetInteger(0,name,OBJPROP_STYLE,LineStyle);
//--- установим толщину линии 
   ObjectSetInteger(0,name,OBJPROP_WIDTH,LineWidth);
//--- включим (true) или отключим (false) режим продолжения отображения линии вправо 
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModeObjects()
  {
   for(int i=ObjectsTotal()-1;i>=0;i--)
     {
      if(ObjectType(ObjectName(i))==OBJ_TREND) ObjectSet(ObjectName(i),OBJPROP_TIME2,Time[0]+PeriodSeconds()*BarsCount);
      if(ObjectType(ObjectName(i))==OBJ_ARROW_RIGHT_PRICE) ObjectSet(ObjectName(i),OBJPROP_TIME,Time[0]+PeriodSeconds()*BarsCount);
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutRightLabel(string name,datetime time,double price)
  {
//--- создадим текстовую метку
   ObjectCreate(0,name,OBJ_ARROW_RIGHT_PRICE,0,time,price);
//--- установим размер метки
   ObjectSetInteger(0,name,OBJPROP_WIDTH,LabelWidth);
//--- установим цвет
   ObjectSetInteger(0,name,OBJPROP_COLOR,LabelColor);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- если это события клика мышки на графике
   if(id==CHARTEVENT_CLICK)
     {
      //--- подготовим переменные
      int      x     =(int)lparam;
      int      y     =(int)dparam;
      datetime dt    =0;
      double   price =0;
      int      window=0;
      //--- преобразуем координаты X и Y  в терминах дата/время
      if(ChartXYToTimePrice(0,x,y,window,dt,price))
        {
         PutTrendLine("Line"+(string)price,dt,price,Time[0]+PeriodSeconds()*BarsCount,price);
         PutRightLabel("Label"+(string)price,Time[0]+PeriodSeconds()*BarsCount,price);
         ChartRedraw(0);
        }
     }
  }
//+------------------------------------------------------------------+




FXwin
754
FXwin  
Andrey Kornishkin:

Пытаюсь модифицировать координату времени правой метки:

Исправил

void ModeObjects()
  {
   for(int i=ObjectsTotal()-1;i>=0;i--)
     {
      if(ObjectType(ObjectName(i))==OBJ_TREND) ObjectSet(ObjectName(i),OBJPROP_TIME2,Time[0]+PeriodSeconds()*BarsCount);
      if(ObjectType(ObjectName(i))==OBJ_ARROW_RIGHT_PRICE) ObjectSet(ObjectName(i),OBJPROP_TIME1,Time[0]+PeriodSeconds()*BarsCount);
     }
  }
Файлы:
Andrey.mq4 10 kb
Aleksandr Sokolov
134
Aleksandr Sokolov  
Andrey Kornishkin:

Приветствую! Пытаюсь модифицировать координату времени правой метки:


Таким образом модифицируется координата времени трендовой линии, но метка не модифицируется. В чем может быть причина?
По задумке метка должна быть на правом конце трендовой линии и перемещаться вместе с ее правым концом. 

Пробовал двигать метку с помощью ObjectMove, ObjectSetInteger, менял свойства метки, но никак.

у меня работает старым способом через ObjectMove

//+------------------------------------------------------------------+
//| Перемещает точку привязки                                        |
//+------------------------------------------------------------------+
bool ArrowPriceMove(const long   chart_ID=0,// ID графика
                    const string name="Price",// имя метки
                    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);

Aleksandr Sokolov
134
Aleksandr Sokolov  
да, вот только хотел написать, вместо
OBJPROP_TIME надо OBJPROP_TIME1 это координата 1-ой точки
Andrey Kornishkin
9938
Andrey Kornishkin  
FXwin:

Исправил

Когда делал перебор по типу объекта, не работало а когда показали перебор по именам объектов заработало. Благодарствую!

void ModeObjects()
  {
   for(int i=ObjectsTotal()-1;i>=0;i--)
     {
      string name=ObjectName(i);
      if(StringFind(name,"Line",0)>-1)   ObjectSet(ObjectName(i),OBJPROP_TIME2,Time[0]+PeriodSeconds()*BarsCount);
      if(StringFind(name,"Label",0)>-1)  ObjectSet(ObjectName(i),OBJPROP_TIME1,Time[0]+PeriodSeconds()*BarsCount);
      WindowRedraw();
     }
  }
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий