Позиционирование прямоугольника на баре, Баг?

Alexey Valeev  

Понадобилось в кои-то веки раскрасить бар, и казалось бы что может пойти не так... Прямоугольник вообще нереально с позиционировать точно на баре, он либо исчезает, либо всегда сдвинут в какую-либо сторону. Либо я уже заработался и что-то очевидное упускаю.

//+------------------------------------------------------------------+
//|                                                 RectangleBar.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
//---
   MqlRates rates[];
//---
   ObjectDelete(0,"TEST");
   
   CopyRates(Symbol(),PERIOD_CURRENT,1,1,rates);
   
   datetime t1=rates[0].time-PeriodSeconds();
   datetime t2=rates[0].time+PeriodSeconds()/2;
   
   double pr1=rates[0].high;
   double pr2=rates[0].low;
   
   RectangleCreate("TEST",t1,pr1+10*Point(),t2,pr2-10*Point(),clrRed);
}
//+------------------------------------------------------------------+
//| Cоздает прямоугольник по заданным координатам                    |
//+------------------------------------------------------------------+
bool RectangleCreate(const string          name="Rectangle",   // имя прямоугольника 
                     datetime              time1=0,            // время первой точки
                     double                price1=0,           // цена первой точки
                     datetime              time2=0,            // время второй точки
                     double                price2=0,           // цена второй точки
                     const color           clr=clrRed,         // цвет прямоугольника
                     const ENUM_LINE_STYLE style=STYLE_SOLID,  // стиль линий прямоугольника
                     const int             width=1,            // толщина линий прямоугольника
                     const bool            fill=true,          // заливка прямоугольника цветом
                     const bool            back=true,          // на заднем плане
                     const bool            selection=false,     // выделить для перемещений
                     const bool            hidden=true,        // скрыт в списке объектов
                     const long            z_order=50)          // приоритет на нажатие мышью
{
//---
   ResetLastError();
   if(!ObjectCreate(0,name,OBJ_RECTANGLE,0,time1,price1,time2,price2))
   {
      Print(__FUNCTION__,": не удалось создать прямоугольник! Код ошибки = ",GetLastError());
      return(false);
   }
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(0,name,OBJPROP_STYLE,style);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,width);
   ObjectSetInteger(0,name,OBJPROP_FILL,fill);
   ObjectSetInteger(0,name,OBJPROP_BACK,back);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,selection);
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(0,name,OBJPROP_ZORDER,z_order);
//---
   return(true);
}
//+------------------------------------------------------------------+
Denis Nikolaev  

заработались

как-то так через свойства графика

      ChartSetInteger(0,CHART_COLOR_CHART_DOWN,BearBrickColor);
      ChartSetInteger(0,CHART_COLOR_CHART_UP,BullBrickColor);
      ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,BearBrickColor);
      ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,BullBrickColor);
      ChartSetInteger(0,CHART_COLOR_BACKGROUND,BackgroundColor);
      ChartSetInteger(0,CHART_SHOW_GRID,false);
Alexey Valeev  
Denis Nikolaev #:

заработались

как-то так через свойства графика

Нет, это то я знаю, но мне нужно именно отдельные бары цветом выделить.

Alexey Viktorov  
Alexey Valeev #:

Нет, это то я знаю, но мне нужно именно отдельные бары цветом выделить.

Вы никогда документацию не читали? Никогда не слышали о стиле рисования DRAW_COLOR_CANDLES

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_CANDLES
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_CANDLES
  • www.mql5.com
DRAW_COLOR_CANDLES - Стили индикаторов в примерах - Пользовательские индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Alexey Valeev  
Alexey Viktorov #:

Вы никогда документацию не читали? Никогда не слышали о стиле рисования DRAW_COLOR_CANDLES

В советнике ведь надо, в заголовке указано. Без индикаторов. Вопрос в том, почему невозможно позиционировать прямоугольник точно на баре, даже если он выступает вверх и низ.

Denis Nikolaev  
Alexey Valeev #:

Нет, это то я знаю, но мне нужно именно отдельные бары цветом выделить.

можно глянуть как это сделано в индикаторе хейкен аши, затем связку советника с индикатором через глобальные переменные

Nikolai Semko  

Канвас работает везде. В Советниках даже быстрее.

Вот здесь предлагал простое решение

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Цветные свечи (пожелания)

Nikolai Semko, 2019.03.02 14:28

Я все же потратил пару часов для демонстрационного примера замены индикатора канвасными свечами чтобы не быть голословным.

Я даже преувеличил на счет 30-50 строк кода. Основная функция ShowBars, которая формирует свечи на экране всего 9 строк кода:

void ShowBars(bool change=true)
  {
   static MqlRates B[];
   uint clrBody=0;
   if(change) CopyRates(_Symbol,_Period,(int)W.Right_bar,W.BarsInWind,B); else B[ArraySize(B)-1]=Bar0;
   Canvas.Erase(W.Color);
   for(int i=0,x=-1; i<W.BarsInWind;i++,x+=W.dx_pix) 
     {
      Canvas.LineVertical(x,(int)(Canvas.Y(B[i].high)-0.5),(int)(Canvas.Y(B[i].low)-0.5),clrLine);
      if(B[i].close>B[i].open) clrBody=clrBull; else if(B[i].close<B[i].open) clrBody=clrBear; else clrBody=clrLine;
      Canvas.FillRectangle(x-int(W.dx_pix*0.35),(int)(Canvas.Y(B[i].open)-0.5),x+int(W.dx_pix*0.35),(int)(Canvas.Y(B[i].close)-0.5),clrBody);
     }
   Canvas.Update();
  }

Это дорого?

Конечно, этот код только демонстрационный, но все же вполне рабочий. И "контроль ширины, высоты окна, масштаба отображения графика, перемотка, смещение " выполняет.



Alexey Valeev  
Nikolai Semko #:

Канвас работает везде. В Советниках даже быстрее.

Вот здесь предлагал простое решение


Очень здорово, благодарю!

Причина обращения: