не могу определеить координаты буферов инд в подвале...

 
//+------------------------------------------------------------------+
//| Create a single descriptive object at the given coordinates      |
//+------------------------------------------------------------------+
bool LabelCreate(string currency, int sub_window, int x, int y, int clr)
  {
   const string name="obj_csi_"+currency;
//--- reset the error value
   ResetLastError();
//--- create a text label
   if(!ObjectCreate(0,name,OBJ_LABEL,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": failed to create text label! Error code=",GetLastError());
      return(false);
     }
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   ObjectSetString(0,name,OBJPROP_TEXT,currency);
//--- successful execution
   return(true);

  }


Есть функция подписи линий графиков в подвале но не могу определеить координаты буферов на последнем баре - у меня оно хранится в массиве Buffer[0-7] 

я так понимаю что у это значение а х это время? 

 

Вставляйте правильно код -

----------------‌

MQL5.community - Памятка пользователя 

Кнопка  Исходный кодпредназначена для вставки исходного кода в текст сообщения. При нажатии появляется пустое окно, в которое необходимо вставить код и далее нажать кнопку Вставить. Для отмены вставки кода необходимо нажать кнопку Отмена.

 
LabelCreate(Currencies[0],1,1800,(int)iEURBuffer[0],Color_EUR);
LabelCreate(Currencies[1],1,1800,(int)iGBPBuffer[0],Color_GBP);
LabelCreate(Currencies[2],1,1800,(int)iAUDBuffer[0],Color_AUD);
LabelCreate(Currencies[3],1,1800,(int)iNZDBuffer[0],Color_NZD);
LabelCreate(Currencies[4],1,1800,(int)iUSDBuffer[0],Color_USD);
LabelCreate(Currencies[5],1,1800,(int)iCADBuffer[0],Color_CAD);
LabelCreate(Currencies[6],1,1800,(int)iCHFBuffer[0],Color_CHF);
LabelCreate(Currencies[7],1,1800,(int)iJPYBuffer[0],Color_JPY);



//+------------------------------------------------------------------+
//| Create a single descriptive object at the given coordinates      |
//+------------------------------------------------------------------+
bool LabelCreate(string currency, int sub_window, int x, int y, int clr)
  {
   const string name="obj_csi_"+currency;
//--- reset the error value
   ResetLastError();
//--- create a text label
   if(!ObjectCreate(0,name,OBJ_LABEL,sub_window,0,0))
     {
      Print(__FUNCTION__,
            ": failed to create text label! Error code=",GetLastError());
      return(false);
     }
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   ObjectSetString(0,name,OBJPROP_TEXT,currency);
//--- successful execution
   return(true);
  }

Почему в подвале когда я рисую линии индикатора и беру их буфера, что бы подписать - то подписи не соответствуют координатам Y своих же линий и подписи сбиваются в правом углу подвала по Х координате ? 
Так же как время текущее в координату Х перевести мне не ясно?



 
Вопрос решен. Нужно было найти Центр и от него плясать + % масштабирования добавить при изменении футера
 


Всеравно оно както некорректрно определяет координаты от центра футера и подписывает как то не возле линий и масштабируется некорректно. 

datetime currentTime = TimeCurrent(); // Получаем текущее время
// Получаем координату X для текущего времени
int chartX;
int chartY;
ChartTimePriceToXY(0,1,currentTime,iClose(_Symbol,PERIOD_CURRENT,0),chartX,chartY); //Print("Текущее время в пикселях на графике: ", chartX); 
string Currencies[]= {"EUR","GBP","AUD","NZD","USD","CAD","CHF","JPY"};
long footerHeight = ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS,1);// Измеряем высоту подвала
int centerY = ((int)footerHeight)/2; // Определяем центр подвала
// Подписываем Индикатор подвала Буферы      
    // Вычисляем новые координаты Y для каждой метки относительно центра подвала
    int newY_EUR = centerY - (int)footerHeight*(int)iEURBuffer[0]/100;
    int newY_GBP = centerY - (int)footerHeight*(int)iGBPBuffer[0]/100;
    int newY_AUD = centerY - (int)footerHeight*(int)iAUDBuffer[0]/100;
    int newY_NZD = centerY - (int)footerHeight*(int)iNZDBuffer[0]/100;
    int newY_USD = centerY - (int)footerHeight*(int)iUSDBuffer[0]/100;
    int newY_CAD = centerY - (int)footerHeight*(int)iCADBuffer[0]/100;
    int newY_CHF = centerY - (int)footerHeight*(int)iCHFBuffer[0]/100;
    int newY_JPY = centerY - (int)footerHeight*(int)iJPYBuffer[0]/100;
LabelCreate(Currencies[0],1,chartX+25,newY_EUR,Color_EUR);
LabelCreate(Currencies[1],1,chartX+25,newY_GBP,Color_GBP);
LabelCreate(Currencies[2],1,chartX+25,newY_AUD,Color_AUD);
LabelCreate(Currencies[3],1,chartX+25,newY_NZD,Color_NZD);
LabelCreate(Currencies[4],1,chartX+25,newY_USD,Color_USD);
LabelCreate(Currencies[5],1,chartX+25,newY_CAD,Color_CAD);
LabelCreate(Currencies[6],1,chartX+25,newY_CHF,Color_CHF);
LabelCreate(Currencies[7],1,chartX+25,newY_JPY,Color_JPY);

Может кто подстажет более правильное решение под МТ5? 

 

ужас ох и язык... думал рихнусь пока это реализовал с плавающим масштабированием при изменении высоты окна


 
Alex Renko #:

ужас ох и язык... думал рихнусь пока это реализовал с плавающим масштабированием при изменении высоты окна


есть спец. функция ChartTimePriceToXY() преобразовать координаты чарта в координаты окна :-)

достаточно взять последнее значение из буфера, запихнуть в ChartTimePriceToXY - и вуалля, у нас есть Y координата для размещения Label. А X у них одинаковый (они-же выровнены)

остаётся только в OnChartEvent отлавливать изменения геометрии графика 

 
Maxim Kuznetsov #:

есть спец. функция ChartTimePriceToXY() преобразовать координаты чарта в координаты окна :-)

достаточно взять последнее значение из буфера, запихнуть в ChartTimePriceToXY - и вуалля, у нас есть Y координата для размещения Label. А X у них одинаковый (они-же выровнены)

остаётся только в OnChartEvent отлавливать изменения геометрии графика 

Пасиб канеш но я ж ее юзал - смотрите код выше. Проблема была в том что нужно было мозгами подраскинуть как эти координаты правильно масштабировать если разный тип просчета индикатора дает разные и плавающие максимумы и минимумы и порой центр индикатора не всегда в центре... поэтому и сбоила отрисовка. Мало того у меня вверху + буферы а внизу - буферы ниже центра. И просто так пердать числовые значения буферов не решение было. Был бы фиксированный зеркальный макс мин вокруг центра не было бы проблем...  реализовал так же корректное отображение подписей когда юзер меняет высоту подвала руками


OnChartEvent  -  тоже не панацея, я все реализовал в int OnCalculate и расчеты все и отрисовку линий и подпись. 

 
Alex Renko #:

Пасиб канеш но я ж ее юзал - смотрите код выше. Проблема была в том что нужно было мозгами подраскинуть как эти координаты правильно масштабировать если разный тип просчета индикатора дает разные и плавающие максимумы и минимумы и порой центр индикатора не всегда в центре... поэтому и сбоила отрисовка. Мало того у меня вверху + буферы а внизу - буферы ниже центра. И просто так пердать числовые значения буферов не решение было. Был бы фиксированный зеркальный макс мин вокруг центра не было бы проблем...  реализовал так же корректное отображение подписей когда юзер меняет высоту подвала руками


OnChartEvent  -  тоже не панацея, я все реализовал в int OnCalculate и расчеты все и отрисовку линий и подпись. 

мне кажется вы сами себя запутали..то что приведено на вашем скриншоте пишется элементарно, без фантазий про плавающие мин/макс

чтобы разместить подпись на уровне последнего значения линии, более чем достаточно взять ChartTimePriceToXY от последнего значения. Многократно испытанно и не только мной. Собственно и функция для этого сделана

Там единственное - надо номер подокна передать ChartWindowFind() без_аргументов, то есть окно индикатора

И без обработки OnChartEvent всё-таки не обойтись - вот сегодня например выходной и тиков нет, индикатор лишний раз не пересчитывается и OnCalculate не вызывается. И если изменить геометрию окна то привязки останутся старые, то есть неверные.
То есть в OnChartEvent надо всё-таки пересчитывать координаты меток.

---

Есть ещё более простой способ - это вместо OBJ_LABEL использовать OBJ_TEXT и задавать ему время iTime(_Symbol,_Period,0)+PeriodSeconds(_Period), а цену брать от буфера. Тогда ненадо координаты вручную пересчитывать, а выравнивание будет по 0-му бару