Вставляйте правильно код -
----------------
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?
ужас ох и язык... думал рихнусь пока это реализовал с плавающим масштабированием при изменении высоты окна
есть спец. функция ChartTimePriceToXY() преобразовать координаты чарта в координаты окна :-)
достаточно взять последнее значение из буфера, запихнуть в ChartTimePriceToXY - и вуалля, у нас есть Y координата для размещения Label. А X у них одинаковый (они-же выровнены)
остаётся только в OnChartEvent отлавливать изменения геометрии графика
есть спец. функция ChartTimePriceToXY() преобразовать координаты чарта в координаты окна :-)
достаточно взять последнее значение из буфера, запихнуть в ChartTimePriceToXY - и вуалля, у нас есть Y координата для размещения Label. А X у них одинаковый (они-же выровнены)
остаётся только в OnChartEvent отлавливать изменения геометрии графика
Пасиб канеш но я ж ее юзал - смотрите код выше. Проблема была в том что нужно было мозгами подраскинуть как эти координаты правильно масштабировать если разный тип просчета индикатора дает разные и плавающие максимумы и минимумы и порой центр индикатора не всегда в центре... поэтому и сбоила отрисовка. Мало того у меня вверху + буферы а внизу - буферы ниже центра. И просто так пердать числовые значения буферов не решение было. Был бы фиксированный зеркальный макс мин вокруг центра не было бы проблем... реализовал так же корректное отображение подписей когда юзер меняет высоту подвала руками
OnChartEvent - тоже не панацея, я все реализовал в int OnCalculate и расчеты все и отрисовку линий и подпись.
Пасиб канеш но я ж ее юзал - смотрите код выше. Проблема была в том что нужно было мозгами подраскинуть как эти координаты правильно масштабировать если разный тип просчета индикатора дает разные и плавающие максимумы и минимумы и порой центр индикатора не всегда в центре... поэтому и сбоила отрисовка. Мало того у меня вверху + буферы а внизу - буферы ниже центра. И просто так пердать числовые значения буферов не решение было. Был бы фиксированный зеркальный макс мин вокруг центра не было бы проблем... реализовал так же корректное отображение подписей когда юзер меняет высоту подвала руками
OnChartEvent - тоже не панацея, я все реализовал в int OnCalculate и расчеты все и отрисовку линий и подпись.
мне кажется вы сами себя запутали..то что приведено на вашем скриншоте пишется элементарно, без фантазий про плавающие мин/макс
чтобы разместить подпись на уровне последнего значения линии, более чем достаточно взять ChartTimePriceToXY от последнего значения. Многократно испытанно и не только мной. Собственно и функция для этого сделана
Там единственное - надо номер подокна передать ChartWindowFind() без_аргументов, то есть окно индикатора
И без обработки OnChartEvent всё-таки не обойтись - вот сегодня например выходной и тиков нет, индикатор лишний раз не пересчитывается и OnCalculate не вызывается. И если изменить геометрию окна то привязки останутся старые, то есть неверные.
То есть в OnChartEvent надо всё-таки пересчитывать координаты меток.
---
Есть ещё более простой способ - это вместо OBJ_LABEL использовать OBJ_TEXT и задавать ему время iTime(_Symbol,_Period,0)+PeriodSeconds(_Period), а цену брать от буфера. Тогда ненадо координаты вручную пересчитывать, а выравнивание будет по 0-му бару

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
}
Есть функция подписи линий графиков в подвале но не могу определеить координаты буферов на последнем баре - у меня оно хранится в массиве Buffer[0-7]
я так понимаю что у это значение а х это время?