//+------------------------------------------------------------------+ //| Indicator: Centered Rectangle (simplified, uses ColorToARGB) | //+------------------------------------------------------------------+ #property version "1.00" #property indicator_chart_window #property indicator_plots 0 input int InpWidthBars = 100; // ширина в барах input int InpHeightPoints = 500; // высота в пунктах (units = _Point) input color InpColor = (color)0xFF0F0F0F; // базовый цвет input uchar InpAlpha = 255; // прозрачность 0..255 (используется ColorToARGB) input bool InpSelectable = true; // можно ли выделять/перемещать string RectName = "Centered_Rectangle_Simple"; //+------------------------------------------------------------------+ //| Создать прямоугольник в центре видимой области | //+------------------------------------------------------------------+ bool CreateCenteredRectangle() { // Получаем индекс первого видимого бара и количество видимых баров long first_visible = ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR); long visible_bars = ChartGetInteger(0, CHART_VISIBLE_BARS); if(visible_bars <= 0) { visible_bars = (int)(iBars(_Symbol, _Period) - 1); first_visible = 0; } long center_idx = first_visible + visible_bars / 2; int half_width = InpWidthBars / 2; long left_idx = center_idx - half_width; long right_idx = center_idx + half_width; if(left_idx < 0) left_idx = 0; if(right_idx > (int)(iBars(_Symbol, _Period) - 1) - 1) right_idx = (int)(iBars(_Symbol, _Period) - 1) - 1; datetime t_left = (datetime)iTime(_Symbol, _Period, (int) left_idx); //<<--- исправлено: использована функция iTime(...) // double p_top = (double)iHigh(_Symbol, _Period, idx); //<<--- исправлено: использована функция iHigh(...) datetime t_right = (datetime)iTime(_Symbol, _Period, 0); //<<--- исправлено: использована функция iTime(...) double p_bottom= (double)iLow(_Symbol, _Period, 0); // вертикальный центр = середина видимой ценовой области double price_max = ChartGetDouble(0, CHART_PRICE_MAX); double price_min = ChartGetDouble(0, CHART_PRICE_MIN); double center_price = (price_max + price_min) / 2.0; double half_price_range = (double)InpHeightPoints * _Point / 2.0; double top_price = center_price + half_price_range; double bottom_price = center_price - half_price_range; // удалить старый объект if(ObjectFind(0, RectName) >= 0) ObjectDelete(0, RectName); // создать прямоугольник if(!ObjectCreate(0, RectName, OBJ_RECTANGLE_LABEL, 0, t_left, top_price, t_right, bottom_price)) { Print("CreateCenteredRectangle: ObjectCreate failed, error=", GetLastError()); return false; } // задать цвет с прозрачностью через ColorToARGB uint clr_argb = ColorToARGB(InpColor, InpAlpha); ObjectSetInteger(0, RectName, OBJPROP_COLOR, (long)clr_argb); // цвет с alpha ObjectSetInteger(0, RectName, OBJPROP_FILL, true); // заливка ObjectSetInteger(0, RectName, OBJPROP_BACK, false); // рисовать перед барами ObjectSetInteger(0, RectName, OBJPROP_SELECTABLE, InpSelectable); //ObjectSetInteger(0, RectName, OBJPROP_HIDDEN, false); ObjectSetInteger(0, RectName, OBJPROP_WIDTH, 1); ObjectSetInteger(0, RectName, OBJPROP_STYLE, STYLE_SOLID); // принудительный перерис графика OBJ_RECTANGLE_LABEL ChartRedraw(); return true; } //+------------------------------------------------------------------+ //| Инициализация | //+------------------------------------------------------------------+ int OnInit() { if(!CreateCenteredRectangle()) return(INIT_FAILED); return(INIT_SUCCEEDED); // По умолчанию хотим полностью перекрыть бары => рекомендуем InpAlpha = 255 if(InpAlpha < 255) Print("Внимание: InpAlpha < 255 — сквозь заливку будут проглядывать бары."); } //+------------------------------------------------------------------+ //| Очистка | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(ObjectFind(0, RectName) >= 0) ObjectDelete(0, RectName); } //+------------------------------------------------------------------+ //| OnCalculate (не используется) | //+------------------------------------------------------------------+ 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[]) { return(rates_total); } //+------------------------------------------------------------------+