Страница 1 из 2

RangeOfHours - экстремумы предыдущих часов

Добавлено: 27 апр 2020, 19:16
evge
Индикатор RangeOfHours отображает уровни минимальной, средней, максимальной цены предыдущих часов.
2 варианта расчета экстремумов текущего часа:
  • В текущий час рисуются уровни предыдущего часа. В начале текущего часа, на первом баре, уровни предыдущего часа перерисовываются в соответствии с его экстремумами;
  • Экстремумы определяются динамически.
Параметры

MinScan - необходимая история в барах. Загружаемая история = MinScan * 2
CDType - Current Data Type - тип определения экстремумов текущего часа. 0 - продолжение экстремумов предыдущего часа, 1 - динамическое определение экстремумов текущего часа.

Примеры работы

RangeOfHours-01.png
RangeOfHours-01.png (27.12 КБ) 34372 просмотра

RangeOfHours-02.png
RangeOfHours-02.png (28.44 КБ) 34372 просмотра


Исходный текст индикатора:

Код: Выделить всё

function Initialize()
{
  IndicatorName = "RangeOfHours";   
  AddInput("Input", Inputs.Candle);   
  PriceStudy = true;
  AddSeries("Hi", DrawAs.Custom, Color.Green); // максимум предыдущего часа
  AddSeries("Lo", DrawAs.Custom, Color.Red);   // минимум предыдущего часа
  AddSeries("Mid", DrawAs.Custom, Color.Silver);  // средняя цена
  AddParameter("MinScan", 163, 2); // подзагрузка истории количество 5-минутных баров
  AddParameter("CDType", 1);  // Current Data Type - тип текущего часа, 0 - продолжать отображение экстремумов предыдущего часа, 1 - экстремумы текущего часа (будут меняться динамически в течение часа)
  AddGlobalVariable("High", Types.Double, 0);
  AddGlobalVariable("Low", Types.Double, 0);
  AddGlobalVariable("LastHigh", Types.Double, 0);
  AddGlobalVariable("LastLow", Types.Double, 0);
  AddGlobalVariable("SI", Types.Int, 0);
  AddGlobalVariable("SIO", Types.Int, 0);
}

function Evaluate()
{
// evge 27.04.2020 https://alfadirect4.ru
//   RangeOfHours - Индикатор рисует экстремумы предыдущих часов и текущего часа, в зависимости от параметров, продолжая экстремумы предыдущего часа или расчитывая в текущем часе динамически.

//первая свечка часа
//сохранаем текущий индекс и последние найденные High, Low
if ( BarTime().Hours != BarTime(1).Hours)
   {
   SIO = SI;
   SI = CurrentIndex;
   LastHigh = High;
   LastLow = Low;

   //перерисовываем
   if (SIO != 0)
   for (var x=0; x <= CurrentIndex - SIO; x++)
   {
   Hi[x] = High;
   Lo[x] = Low;
   Mid[x] = (Low + High) * 0.5;     
   }
   }

if (((BarTime().Hours != DateTime.Today.Hour) || CDType != 0) && BarTime().Hours != BarTime(1).Hours)
  {
    High = Input.High[0];
    Low = Input.Low[0];   
  }
  else if (((BarTime().Hours != DateTime.Today.Hour) || CDType != 0) && BarTime() > AsTime(0, 0, 0))
  {
    if ( Input.High[0] > High) High = Input.High[0];
    if ( Input.Low[0] < Low) Low = Input.Low[0];
  }

if (CDType == 0)
{
   if (LastHigh !=0 && LastLow !=0)
   {
   Hi[0] = LastHigh;
   Lo[0] = LastLow;
   Mid[0] = (LastLow + LastHigh) * 0.5;
   
   Hi.DrawDash();
   Lo.DrawDash();
   Mid.DrawDash();
   }
} else
{

if (SI != 0)
for (var x=0; x <= CurrentIndex - SI; x++)
{
Hi[x] = High;
Lo[x] = Low;
Mid[x] = (Low + High) * 0.5;     
}

Hi.DrawDash();
Lo.DrawDash();
Mid.DrawDash();
}

}


Скачать исходный текст

RangeOfHours.zip
(49.29 КБ) 1383 скачивания

Re: RangeOfHours - экстремумы предыдущих часов

Добавлено: 28 апр 2020, 05:48
Velper
Супер! Огромная благодарность!

Re: RangeOfHours - экстремумы предыдущих часов

Добавлено: 14 авг 2020, 13:41
George69
Скажите, пожалуйста, а есть ли такой же индикатор, только не для одного последнего часа, а для двух последних часов?

Re: RangeOfHours - экстремумы предыдущих часов

Добавлено: 14 авг 2020, 14:41
evge
Сделал универсально, теперь можно задать нужное кол-во часов в параметрах

добавил параметр Hours

George69 писал(а):Скажите, пожалуйста, а есть ли такой же индикатор, только не для одного последнего часа, а для двух последних часов?


в этом случае задаем Hours = 2

RangeHours-01.png
RangeHours, параметр Hours = 2
RangeHours-01.png (37.47 КБ) 32974 просмотра


Код: Выделить всё

function Initialize()
{
  IndicatorName = "RangeHours";
  AddInput("Input", Inputs.Candle);   
  PriceStudy = true;
  AddSeries("Hi", DrawAs.Custom, Color.Green); // максимум предыдущего часа
  AddSeries("Lo", DrawAs.Custom, Color.Red);   // минимум предыдущего часа
  AddSeries("Mid", DrawAs.Custom, Color.Silver);  // средняя цена
  AddParameter("MinScan", 163, 2); // подзагрузка истории количество 5-минутных баров
  AddParameter("CDType", 1);  // Current Data Type - тип текущего часа, 0 - продолжать отображение экстремумов предыдущего часа, 1 - экстремумы текущего часа (будут меняться динамически в течение часа)
  AddParameter("Hours", 1); // кол-во часов
  AddGlobalVariable("High", Types.Double, 0);
  AddGlobalVariable("Low", Types.Double, 0);
  AddGlobalVariable("LastHigh", Types.Double, 0);
  AddGlobalVariable("LastLow", Types.Double, 0);
  AddGlobalVariable("SI", Types.Int, 0);
  AddGlobalVariable("SIO", Types.Int, 0);
  AddGlobalVariable("HRS", Types.Double, 0);
}

function Evaluate()
{
// evge 27.04.2020 https://alfadirect4.ru
//   RangeHours - Индикатор рисует экстремумы предыдущих часов и текущего часа, в зависимости от параметров, продолжая экстремумы предыдущего часа (кол-ва часов Hours) или расчитывая в текущем часе динамически.
//   14.08.2020 - добавлен параметр Hours, где можно задать количество часов для вычисления диапазона.

var isH = false;

//первая свечка часа
//сохранаем текущий индекс и последние найденные High, Low
if ( BarTime().Hours != BarTime(1).Hours)
   {
   HRS += BarTime(0).Hours > BarTime(1).Hours ? BarTime(0).Hours - BarTime(1).Hours : BarTime(0).Hours;
   if (HRS >= Hours)
      {
         isH = true;
      HRS = 0;
      SIO = SI;
      SI = CurrentIndex;
      LastHigh = High;
      LastLow = Low;
   
      //перерисовываем
      if (SIO != 0)
      for (var x=0; x <= CurrentIndex - SIO; x++)
      {
      Hi[x] = High;
      Lo[x] = Low;
      Mid[x] = (Low + High) * 0.5;     
      }
      }
   }

if ((BarTime().Hours != DateTime.Today.Hour) || CDType != 0)
if (isH)
  {
    High = Input.High[0];
    Low = Input.Low[0];   
  }
  else if (BarTime() > AsTime(0, 0, 0))
  {
    if ( Input.High[0] > High) High = Input.High[0];
    if ( Input.Low[0] < Low) Low = Input.Low[0];
  }

if (CDType == 0)
{
   if (LastHigh !=0 && LastLow !=0)
   {
   Hi[0] = LastHigh;
   Lo[0] = LastLow;
   Mid[0] = (LastLow + LastHigh) * 0.5;
   
   Hi.DrawDash();
   Lo.DrawDash();
   Mid.DrawDash();
   }
} else
{

if (SI != 0)
for (var x=0; x <= CurrentIndex - SI; x++)
{
Hi[x] = High;
Lo[x] = Low;
Mid[x] = (Low + High) * 0.5;     
}

Hi.DrawDash();
Lo.DrawDash();
Mid.DrawDash();
}

}

Re: RangeOfHours - экстремумы предыдущих часов

Добавлено: 14 авг 2020, 21:44
evge
// 14.08.2020 добавлен пересчет часов под реальный таймфрейм. Для совпадения показаний индикатора с данными графика в указанном таймфрейме (в часах) H1, H2, H3, H4, H6, H8, H12

т.е. теперь должно быть соответствие значений High, Low от таймфрейма значениям Hi, Lo серий для аналогичного таймфрейму значения параметра Hours

RangeHours-02.png
RangeHours-02.png (58.31 КБ) 32932 просмотра

RangeHours-03.png
RangeHours-03.png (34.54 КБ) 32932 просмотра


Код: Выделить всё

function Initialize()
{
  IndicatorName = "RangeHours";
  AddInput("Input", Inputs.Candle);   
  PriceStudy = true;
  AddSeries("Hi", DrawAs.Custom, Color.Green); // максимум предыдущего часа
  AddSeries("Lo", DrawAs.Custom, Color.Red);   // минимум предыдущего часа
  AddSeries("Mid", DrawAs.Custom, Color.Silver);  // средняя цена
  AddParameter("MinScan", 163, 2); // подзагрузка истории количество 5-минутных баров
  AddParameter("CDType", 1);  // Current Data Type - тип текущего часа, 0 - продолжать отображение экстремумов предыдущего часа, 1 - экстремумы текущего часа (будут меняться динамически в течение часа)
  AddParameter("Hours", 4); // кол-во часов
  AddGlobalVariable("High", Types.Double, 0);
  AddGlobalVariable("Low", Types.Double, 0);
  AddGlobalVariable("Open", Types.Double, 0);
  AddGlobalVariable("Close", Types.Double, 0); 
  AddGlobalVariable("LastHigh", Types.Double, 0);
  AddGlobalVariable("LastLow", Types.Double, 0);
  AddGlobalVariable("SI", Types.Int, 0);
  AddGlobalVariable("SIO", Types.Int, 0);
  AddGlobalVariable("HRS", Types.Double, 0);
}

function Evaluate()
{
// evge 27.04.2020 https://alfadirect4.ru
//   RangeHours - Индикатор рисует экстремумы предыдущих часов и текущего часа, в зависимости от параметров, продолжая экстремумы предыдущего часа (кол-ва часов Hours) или расчитывая в текущем часе динамически.
//   14.08.2020 добавлен параметр Hours, где можно задать количество часов для вычисления диапазона.
//   14.08.2020 добавлен пересчет часов под реальный таймфрейм. Для совпадения показаний индикатора с данными графика в указанном таймфрейме (в часах) H1, H2, H3, H4, H6, H8, H12

bool isH = false;

int[] HH = {0,0,0,1,2,0,4,0,2,0,0,0,10};

//первая свечка часа
//сохранаем текущий индекс и последние найденные High, Low
if ( BarTime().Hours != BarTime(1).Hours)
   {
   bool NewDay = BarTime(0).Hours < BarTime(1).Hours;
   HRS = BarTime(0).Hours > BarTime(1).Hours ? HRS + BarTime(0).Hours - BarTime(1).Hours : Hours > 0 && Hours <= 12 ? HH[(int)Hours] : BarTime(0).Hours;
   if (HRS >= Hours || NewDay)
      {
         isH = true;
      if (!NewDay) HRS = 0;
      SIO = SI;
      SI = CurrentIndex;
      LastHigh = High;
      LastLow = Low;
   
      //перерисовываем
      if (SIO != 0)
      for (var x=0; x <= CurrentIndex - SIO; x++)
      {
      Hi[x] = High;
      Lo[x] = Low;
      Mid[x] = (Low + High) * 0.5;
      }
      }
   }

if ((BarTime().Hours != DateTime.Today.Hour) || CDType != 0)
if (isH)
  {
    High = Input.High[0];
    Low = Input.Low[0];
    Open = Input.Open[0];
    Close = Input.Close[0]; 
  }
  else if (BarTime() > AsTime(0, 0, 0))
  {
    if ( Input.High[0] > High) High = Input.High[0];
    if ( Input.Low[0] < Low) Low = Input.Low[0];
    Close = Input.Close[0];
  }

if (CDType == 0)
{
   if (LastHigh !=0 && LastLow !=0)
   {
   Hi[0] = LastHigh;
   Lo[0] = LastLow;
   Mid[0] = (LastLow + LastHigh) * 0.5;
   
   Hi.DrawDash();
   Lo.DrawDash();
   Mid.DrawDash();
   }
} else
{

if (SI != 0)
for (var x=0; x <= CurrentIndex - SI; x++)
{
Hi[x] = High;
Lo[x] = Low;
Mid[x] = (Low + High) * 0.5;     
}

Hi.DrawDash();
Lo.DrawDash();
Mid.DrawDash();

}

}

Re: RangeOfHours - экстремумы предыдущих часов

Добавлено: 15 авг 2020, 09:22
evge
Вариация с отображением в виде баров на графике от таймфрейма Hours

RangeHours-04.png
GZU0, RangeHoursBars, Hours = 1, Таймфрейм M5
RangeHours-04.png (42.99 КБ) 32893 просмотра

RangeHours-05.png
GZU0, RangeHoursBars, Hours = 1, Таймфрейм M5
RangeHours-05.png (40.91 КБ) 32892 просмотра

RangeHours-06.png
GZU0, График с таймфреймом H1
RangeHours-06.png (26.37 КБ) 32892 просмотра

Код: Выделить всё

function Initialize()
{
  IndicatorName = "RangeHoursBars";
  AddInput("Input", Inputs.Candle);   
  PriceStudy = true;
  AddSeries("H", DrawAs.Custom, Color.Black);
  AddSeries("L", DrawAs.Custom, Color.Black);
  AddSeries("Ou", DrawAs.Custom, Color.Green);
  AddSeries("Cu", DrawAs.Custom, Color.Green);   
  AddSeries("Od", DrawAs.Custom, Color.Red);
  AddSeries("Cd", DrawAs.Custom, Color.Red);   
  AddSeries("Mid", DrawAs.Custom, Color.Silver);  // средняя цена
  AddParameter("MinScan", 163, 2); // подзагрузка истории количество 5-минутных баров
  AddParameter("Hours", 1); // кол-во часов
  AddGlobalVariable("High", Types.Double, 0);
  AddGlobalVariable("Low", Types.Double, 0);
  AddGlobalVariable("Open", Types.Double, 0);
  AddGlobalVariable("Close", Types.Double, 0); 
  AddGlobalVariable("LastHigh", Types.Double, 0);
  AddGlobalVariable("LastLow", Types.Double, 0);
  AddGlobalVariable("SI", Types.Int, 0);
  AddGlobalVariable("SIO", Types.Int, 0);
  AddGlobalVariable("HRS", Types.Double, 0);
}

function Evaluate()
{
// evge 27.04.2020 https://alfadirect4.ru
//   RangeHours - Индикатор рисует экстремумы предыдущих часов и текущего часа, в зависимости от параметров, продолжая экстремумы предыдущего часа (кол-ва часов Hours) или расчитывая в текущем часе динамически.
//   14.08.2020 добавлен параметр Hours, где можно задать количество часов для вычисления диапазона.
//   14.08.2020 добавлен пересчет часов под реальный таймфрейм. Для совпадения показаний индикатора с данными графика в указанном таймфрейме (в часах) H1, H2, H3, H4, H6, H8, H12
//   15.08.2020 отрисовка в виде баров часовых таймфремов Hours

bool isH = false;

int[] HH = {0,0,0,1,2,0,4,0,2,0,0,0,10};

//первая свечка часа
//сохранаем текущий индекс и последние найденные High, Low
if ( BarTime().Hours != BarTime(1).Hours)
   {
   bool NewDay = BarTime(0).Hours < BarTime(1).Hours;
   HRS = BarTime(0).Hours > BarTime(1).Hours ? HRS + BarTime(0).Hours - BarTime(1).Hours : Hours > 0 && Hours <= 12 ? HH[(int)Hours] : BarTime(0).Hours;
   if (HRS >= Hours || NewDay)
      {
         isH = true;
      if (!NewDay) HRS = 0;
      SIO = SI;
      SI = CurrentIndex;
      LastHigh = High;
      LastLow = Low;
   
      //перерисовываем
      if (SIO != 0)
      for (var x=0; x <= CurrentIndex - SIO; x++)
      {
       Mid[x] = (Open + Close) * 0.5;
      if (Math.Round((CurrentIndex - SIO) * 0.5) == x)
         {
         H[x] = High;
            L[x] = Low;
         } else
      {
         H[x] = Mid[x];
            L[x] = Mid[x];
         }         
      Ou[x] = Mid[x];
      Cu[x] = Mid[x];
      Od[x] = Mid[x];
      Cd[x] = Mid[x];
       if (Close > Open)
          {
         Ou[x] = Open;
            Cu[x] = Close;
         }
       if (Close < Open)
          {
         Od[x] = Open;
            Cd[x] = Close;
         }
            
      }
      }
   }

if (isH)
  {
    High = Input.High[0];
    Low = Input.Low[0];
    Open = Input.Open[0];
    Close = Input.Close[0]; 
  }
  else if (BarTime() > AsTime(0, 0, 0))
  {
    if ( Input.High[0] > High) High = Input.High[0];
    if ( Input.Low[0] < Low) Low = Input.Low[0];
    Close = Input.Close[0];
  }

if (SI != 0)
for (var x=0; x <= CurrentIndex - SI; x++)
{
Mid[x] = (Open + Close) * 0.5;
if (Math.Round((CurrentIndex - SI) * 0.5) == x)
   {
      H[x] = High;
      L[x] = Low;
   }
   else
   {
   H[x] = Mid[x];
   L[x] = Mid[x];
   }
Ou[x] = Mid[x];
Cu[x] = Mid[x];
Od[x] = Mid[x];
Cd[x] = Mid[x];
if (Close > Open)
   {
      Ou[x] = Open;
      Cu[x] = Close;
   }
if (Close < Open)
   {
      Od[x] = Open;
      Cd[x] = Close;
   }
}

H.DrawVertical(L);
if (!isH)
{
   Ou.DrawChannel(Cu);
   Od.DrawChannel(Cd);   
}

}

Re: RangeOfHours - экстремумы предыдущих часов

Добавлено: 15 авг 2020, 09:39
evge
Вариант без рисования "хвостов" внутри баров

RangeHours-07.png
GZU0, RangeHoursBars, Hours = 1, Таймфрейм M5
RangeHours-07.png (40.39 КБ) 32890 просмотров


Код: Выделить всё

function Initialize()
{
  IndicatorName = "RangeHoursBars";
  AddInput("Input", Inputs.Candle);   
  PriceStudy = true;
  AddSeries("Hu", DrawAs.Custom, Color.Black);
  AddSeries("Lu", DrawAs.Custom, Color.Black);
  AddSeries("Hd", DrawAs.Custom, Color.Black);
  AddSeries("Ld", DrawAs.Custom, Color.Black);   
  AddSeries("Ou", DrawAs.Custom, Color.Green);
  AddSeries("Cu", DrawAs.Custom, Color.Green);   
  AddSeries("Od", DrawAs.Custom, Color.Red);
  AddSeries("Cd", DrawAs.Custom, Color.Red);   
  AddSeries("Mid", DrawAs.Custom, Color.Silver);  // средняя цена
  AddParameter("MinScan", 163, 2); // подзагрузка истории количество 5-минутных баров
  AddParameter("Hours", 1); // кол-во часов
  AddGlobalVariable("High", Types.Double, 0);
  AddGlobalVariable("Low", Types.Double, 0);
  AddGlobalVariable("Open", Types.Double, 0);
  AddGlobalVariable("Close", Types.Double, 0); 
  AddGlobalVariable("LastHigh", Types.Double, 0);
  AddGlobalVariable("LastLow", Types.Double, 0);
  AddGlobalVariable("SI", Types.Int, 0);
  AddGlobalVariable("SIO", Types.Int, 0);
  AddGlobalVariable("HRS", Types.Double, 0);
}

function Evaluate()
{
// evge 27.04.2020 https://alfadirect4.ru
//   RangeHours - Индикатор рисует экстремумы предыдущих часов и текущего часа, в зависимости от параметров, продолжая экстремумы предыдущего часа (кол-ва часов Hours) или расчитывая в текущем часе динамически.
//   14.08.2020 добавлен параметр Hours, где можно задать количество часов для вычисления диапазона.
//   14.08.2020 добавлен пересчет часов под реальный таймфрейм. Для совпадения показаний индикатора с данными графика в указанном таймфрейме (в часах) H1, H2, H3, H4, H6, H8, H12
//   15.08.2020 отрисовка в виде баров часовых таймфремов Hours

bool isH = false;

int[] HH = {0,0,0,1,2,0,4,0,2,0,0,0,10};

//первая свечка часа
//сохранаем текущий индекс и последние найденные High, Low
if ( BarTime().Hours != BarTime(1).Hours)
   {
   bool NewDay = BarTime(0).Hours < BarTime(1).Hours;
   HRS = BarTime(0).Hours > BarTime(1).Hours ? HRS + BarTime(0).Hours - BarTime(1).Hours : Hours > 0 && Hours <= 12 ? HH[(int)Hours] : BarTime(0).Hours;
   if (HRS >= Hours || NewDay)
      {
         isH = true;
      if (!NewDay) HRS = 0;
      SIO = SI;
      SI = CurrentIndex;
      LastHigh = High;
      LastLow = Low;
   
      //перерисовываем
      if (SIO != 0)
      for (var x=0; x <= CurrentIndex - SIO; x++)
      {
       Mid[x] = (Open + Close) * 0.5;
      if (Math.Round((CurrentIndex - SIO) * 0.5) == x)
         {
         Hu[x] = High;
            Lu[x] = Math.Max(Open, Close);
         Hd[x] = Math.Min(Open, Close);
            Ld[x] = Low;
         } else
      {
         Hu[x] = Mid[x];
            Lu[x] = Mid[x];
         Hd[x] = Mid[x];
            Ld[x] = Mid[x];
         }         
      Ou[x] = Mid[x];
      Cu[x] = Mid[x];
      Od[x] = Mid[x];
      Cd[x] = Mid[x];
       if (Close > Open)
          {
         Ou[x] = Open;
            Cu[x] = Close;
         }
       if (Close < Open)
          {
         Od[x] = Open;
            Cd[x] = Close;
         }
            
      }
      }
   }

if (isH)
  {
    High = Input.High[0];
    Low = Input.Low[0];
    Open = Input.Open[0];
    Close = Input.Close[0]; 
  }
  else if (BarTime() > AsTime(0, 0, 0))
  {
    if ( Input.High[0] > High) High = Input.High[0];
    if ( Input.Low[0] < Low) Low = Input.Low[0];
    Close = Input.Close[0];
  }

if (SI != 0)
for (var x=0; x <= CurrentIndex - SI; x++)
{
Mid[x] = (Open + Close) * 0.5;
if (Math.Round((CurrentIndex - SI) * 0.5) == x)
   {
         Hu[x] = High;
            Lu[x] = Math.Max(Open, Close);
         Hd[x] = Math.Min(Open, Close);
            Ld[x] = Low;
   }
   else
   {
   Hu[x] = Mid[x];
   Lu[x] = Mid[x];
   Hd[x] = Mid[x];
   Ld[x] = Mid[x];
   }
Ou[x] = Mid[x];
Cu[x] = Mid[x];
Od[x] = Mid[x];
Cd[x] = Mid[x];
if (Close > Open)
   {
      Ou[x] = Open;
      Cu[x] = Close;
   }
if (Close < Open)
   {
      Od[x] = Open;
      Cd[x] = Close;
   }
}

Hu.DrawVertical(Lu);
Hd.DrawVertical(Ld);
if (!isH)
{
   Ou.DrawChannel(Cu);
   Od.DrawChannel(Cd);   
}

}

Re: RangeOfHours - экстремумы предыдущих часов

Добавлено: 25 мар 2021, 22:23
Pavelkor
Здравствуйте!
Классный индикатор, спасибо! Очень удобно, что можно задать любое значение "Hours".
При значении "Hours" 24 вообще получаются дневные свечи поверх любых других младших таймфреймов.
А теперь замечания-пожелания и просто пожелания.
1. Евгений, это не очень критично, но если исправить некоторые вещи, о которых я сбивчиво рассказал в ролике https://take.ms/6U8hz, то будет совсем красиво.
2. Можно сделать индикатор по такому принципу, чтобы он строил НЕДЕЛЬНЫЕ свечи поверх свечей младших таймфреймов?
3. Можно сделать индикатор по такому принципу, чтобы он строил МЕСЯЧНЫЕ свечи поверх свечей младших таймфреймов?

Re: RangeOfHours - экстремумы предыдущих часов

Добавлено: 21 окт 2021, 21:54
Pavelkor
Здравствуйте!
Евгений, можно ли в индикаторе (индикаторах) сделать так, чтобы индикатор(ы) можно было убирать/визуализировать по горячей клавише.

Re: RangeOfHours - экстремумы предыдущих часов

Добавлено: 22 окт 2021, 22:20
evge
Программно в индикаторе - нет.