Пользовательские индикаторы > RangeOfDays - экстремумы предыдущих дней

Дополнительные индикаторы от пользователей Альфа-Директ 4. Готовые решения от пользователей.
Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение evge » 28 май 2016, 18:45

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

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

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

RangeOfDays-02.png
RangeOfDays с CDType = 1
RangeOfDays-02.png (38.29 КБ) 38565 просмотров

RangeOfDays-01.png
RangeOfDays с CDType = 0
RangeOfDays-01.png (33.03 КБ) 38602 просмотра


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

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

function Initialize()
{
  IndicatorName = "RangeOfDays";   
  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 Day 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 28.05.2016 http://alfadirect4.ru
//   RangeOfDays - Индикатор рисует экстремумы предыдущих дней и текущего дня, в зависимости от параметров, продолжая экстремумы предыдущего дня или расчитывая в текущем дне динамически.

//первая свечка ТФ
//сохранаем текущий индекс и последние найденные High, Low
if ( BarTime() <= AsTime(10, 0, 0) && BarTime() >= AsTime(0, 0, 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;      
   }
   }

// т.к. таймфреймы H3 выдают начало сессии в 9:00, H4 - в 8:00 и т.д.
if (((BarDate() != DateTime.Today) || CDType != 0) && BarTime() <= AsTime(10, 0, 0) && BarTime() >= AsTime(0, 0, 0))
  {
    High = Input.High[0];
    Low = Input.Low[0];   
  }
  else if (((BarDate() != DateTime.Today) || 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();
}

}


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

RangeOfDays.zip
(1.6 КБ) 1604 скачивания
никогда такого не было и вот опять

Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

Re: RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение evge » 30 май 2016, 18:48

Исправлена ошибка перерисовки предыдущего дня.
Режим CDType по умолчанию теперь равен 1.
никогда такого не было и вот опять

Аватара пользователя
Pavelkor
Сообщения: 21
Зарегистрирован: 05 фев 2016, 10:57
Откуда: Москва
Благодарил (а): 3 раза

Re: RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение Pavelkor » 18 янв 2017, 19:59

Доброго времени суток!
Евгений, может отрисовка индикатора подтормаживать планшет? Если может, то можно ли ограничить отображение индикатора каким-либо периодом за последние несколько дней, например за неделю?

У уважением, Павел.

Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

Re: RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение evge » 22 янв 2017, 14:36

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

AddParameter("MinScan", 163, 2);


попробовать уменьшить этот параметр, здесь 163*2 = 326 баров истории минимум.
никогда такого не было и вот опять

JASON
Сообщения: 27
Зарегистрирован: 31 янв 2017, 21:50
Благодарил (а): 3 раза

Re: RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение JASON » 14 фев 2017, 15:56

Тестировал с условием использования среднего значения диапазона пред.дня в качестве ориентира для выхода из лонга или шорта.
Примерно так :

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

if ( (Input1.Close < MY.RangeOfDays(Input1, 163, 1).GetValue("Mid", -1)) ) {CloseLong();}

и так

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

if ( (Input1.Close < MY.RangeOfDays(Input1, 163, 0).GetValue("Mid", 0)) ) {CloseLong();}

Что может быть правильнее?
Но в любом случае при тестировании как я понял системой брался не уровень Mid пред.дня , мне кажется все таки берется значение Mid текущего.
Может я некорректно условие прописывал?

Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

Re: RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение evge » 16 фев 2017, 09:51

JASON писал(а):Т
Что может быть правильнее?
Но в любом случае при тестировании как я понял системой брался не уровень Mid пред.дня , мне кажется все таки берется значение Mid текущего.
Может я некорректно условие прописывал?


Индикатор перерисовывает значения в истории для текущего дня в режиме CDType = 1. В тестировании вызов индикатора происходит всего 1 раз (проверено), а не для каждой точки истории (на данный момент так в АД4). То что мы визуально видим на графике на последней точке истории эти значения прочитает и тестирование стратегии. Кстати, вот именно реальный робот в рабочем режиме или советника будет брать правильное значение средней именно предыдущего дня.
никогда такого не было и вот опять

JASON
Сообщения: 27
Зарегистрирован: 31 янв 2017, 21:50
Благодарил (а): 3 раза

Re: RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение JASON » 16 фев 2017, 12:14

Спасибо за разъяснения.
Я заметил, что советник (робот) выдает сигналы на барах, которые при тестировании (по итогам торгов) не совпадают или вообще исчезают.
А реальный робот в рабочем режиме или советника берет значение средней именно предыдущего дня или положим при 30 мин (1 час, 15 мин и т.д.) берет значение средней на баре предыдущем (час, 30 мин и т.д.), но в текущем дне , который динамически меняется?

Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

Re: RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение evge » 16 фев 2017, 12:39

JASON писал(а):А реальный робот в рабочем режиме или советника берет значение средней именно предыдущего дня или положим при 30 мин (1 час, 15 мин и т.д.) берет значение средней на баре предыдущем (час, 30 мин и т.д.), но в текущем дне , который динамически меняется?


именно предыдущего дня, т.е. не от текущего ТФ, а именно от дня.
При CDType = 1 от текущего дня.
При CDType = 0 от предыдущего дня.
никогда такого не было и вот опять

mglebs
Сообщения: 1
Зарегистрирован: 05 мар 2021, 12:25
Благодарил (а): 1 раз

Re: RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение mglebs » 05 мар 2021, 12:31

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

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

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

RangeOfDays-02.png
RangeOfDays-01.png

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

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

function Initialize()
{
  IndicatorName = "RangeOfDays";   
  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 Day 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 28.05.2016 http://alfadirect4.ru
//   RangeOfDays - Индикатор рисует экстремумы предыдущих дней и текущего дня, в зависимости от параметров, продолжая экстремумы предыдущего дня или расчитывая в текущем дне динамически.

//первая свечка ТФ
//сохранаем текущий индекс и последние найденные High, Low
if ( BarTime() <= AsTime(10, 0, 0) && BarTime() >= AsTime(0, 0, 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;      
   }
   }

// т.к. таймфреймы H3 выдают начало сессии в 9:00, H4 - в 8:00 и т.д.
if (((BarDate() != DateTime.Today) || CDType != 0) && BarTime() <= AsTime(10, 0, 0) && BarTime() >= AsTime(0, 0, 0))
  {
    High = Input.High[0];
    Low = Input.Low[0];   
  }
  else if (((BarDate() != DateTime.Today) || 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();
}

}


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

RangeOfDays.zip







Добрый день, спасибо за индикатор, большая просьба, могли бы его скорректировать, в связи с вводом начала торговой сессии 7:00

Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

Re: RangeOfDays - экстремумы предыдущих дней

Непрочитанное сообщение evge » 06 мар 2021, 09:04

Добрый день

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

function Initialize()
{
  IndicatorName = "RangeOfDaysForts";   
  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 Day 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 28.05.2016 http://alfadirect4.ru
//   RangeOfDays - Индикатор рисует экстремумы предыдущих дней и текущего дня, в зависимости от параметров, продолжая экстремумы предыдущего дня или расчитывая в текущем дне динамически.

// evge 06.03.2021
//   RangeOfDaysForts - скорректировано начало торгов. Индикатор работает только для ФОРТС.

//первая свечка ТФ
//сохранаем текущий индекс и последние найденные High, Low
if ( BarTime() <= AsTime(7, 0, 0) && BarTime() >= AsTime(0, 0, 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 (((BarDate() != DateTime.Today) || CDType != 0) && BarTime() <= AsTime(7, 0, 0) && BarTime() >= AsTime(0, 0, 0))
  {
    High = Input.High[0];
    Low = Input.Low[0];   
  }
  else if (((BarDate() != DateTime.Today) || 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();
}

}


RangeOfDaysForts-01.png
никогда такого не было и вот опять


Вернуться в «Пользовательские индикаторы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость