Каналы > PriceChannel – ценовой канал или Канал Дончяна

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

PriceChannel – ценовой канал или Канал Дончяна

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

Ценовой канал – это индикатор показывающий максимум и минимум за последний интервал изменения цен заданной длительности.

Индикатор имеет 2 выходных ряда High и Low. Для их вычисления используются следующие формулы:

Hight = max(Ht, Ht-1, …, Ht-n+1 ),
Lowt = max(Lt, Lt-1, …, Lt-n+1 ).

Типовые параметры

Значение периода усреднения выбирается n = 20 для дневного тайм-фрейма.

Автор: Ричард Дончян (Richard Donchian).
Первоисточник: Википедия. (http://ru.wikipedia.org/wiki/Канал_Дончяна)

Пример:

PriceChannel-00.png
PriceChannel-00.png (25.84 КБ) 9266 просмотров


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

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

function Initialize()
{
// Определение параметров индикатора
  IndicatorName = "PriceChannel4";                  
  AddInput("Input", Inputs.Candle);                  
  AddParameter("Period", 50, 1);                     
  PriceStudy = true;                                 
  AddSeries("Upper", DrawAs.Line, Color.Blue);   
  AddSeries("Lower", DrawAs.Line, Color.Red);      
  AddGlobalVariable("Uppers", Types.DoubleList);
  AddGlobalVariable("Lowers", Types.DoubleList);
}

function Evaluate()
{
// AlfaDirect. 2015. 
// Верхняя линия "Upper" - максимальная цена за Period
// Нижняя линия "Lower" - минимальная цена за Period
   var high = Input.High[0];
   var low = Input.Low[0];
   Uppers.Add(high);
   Lowers.Add(low);
   if ( CurrentIndex > Period )
   {
       Uppers.RemoveAt(0);
       for (var i = 0; i < Uppers.Count-1; i++)
          high = Math.Max(Uppers[i], high);
       Lowers.RemoveAt(0);
       for (var i = 0; i < Lowers.Count-1; i++)
          low = Math.Min(Lowers[i], low);
   }
   Upper = high;
   Lower = low;
}
никогда такого не было и вот опять

keeper
Сообщения: 10
Зарегистрирован: 11 мар 2016, 20:29

Re: PriceChannel – ценовой канал или Канал Дончяна

Непрочитанное сообщение keeper » 11 мар 2016, 21:13

Доработал индикатор на два периода. Т.к. по идее открытие позиции идёт по первому большему периоду (20 например), а закрытие по меньшему (10 к примеру).

Владимир
Сообщения: 81
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: PriceChannel – ценовой канал или Канал Дончяна

Непрочитанное сообщение Владимир » 01 мар 2019, 19:18

Добрый день! На одном курсе вебинаров Станислава Шмелёва-Агинского рассказывалось как этот индикатор можно использовать для выявления боковика и начала трендового движения, только для этого надо сместить сам канал построения линий на несколько баров (4-5 баров). Тогда в случаи проития канала означало бы возможность появления (развития) тренда. В коде добавил смещение переменная "Bias".

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

function Initialize()
{
// Определение параметров индикатора
  IndicatorName = "PriceChannel";                  
  AddInput("Input", Inputs.Candle);                  
  AddParameter("Period", 50, 1);                     
  AddParameter("Bias", 4);
  PriceStudy = true;                                 
  AddSeries("Upper", DrawAs.Line, Color.Blue);   
  AddSeries("Lower", DrawAs.Line, Color.Red);      
}

function Evaluate()
{
// AlfaDirect. 2016. OX
// Верхняя линия "Upper" - максимальная цена за Period
// Нижняя линия "Lower" - минимальная цена за Period
   var high = Input.High[Bias];
   var low = Input.Low[Bias];
   if ( CurrentIndex >= Period )
   {
         int i = 0;
       for (i = 1; i < Period; i++)
              high = Math.Max(Input.High[i+Bias], high);
       for (i = 1; i < Period; i++)
              low = Math.Min(Input.Low[i+Bias], low);
   }
   Upper = high;
   Lower = low;
}
Вложения
1.jpg
Стратегия_PrCh.pdf
(23.96 КБ) 448 скачиваний

Orange2000
Сообщения: 43
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 29 раз
Поблагодарили: 1 раз

Re: PriceChannel – ценовой канал или Канал Дончяна

Непрочитанное сообщение Orange2000 » 18 апр 2019, 19:21

Евгений здравствуйте!, можете подсказать?. Хочу сделать систему на основе канала дончииана.

Только там надо проверять условие внутри бара:
лонг=high>upperline
шорт=low<lowerline

вроде я где то встречал упоминание , что можно иметь 1 сигнал внутри бара?
спасибо

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

Re: PriceChannel – ценовой канал или Канал Дончяна

Непрочитанное сообщение evge » 18 апр 2019, 19:30

UseClosedBar – настройка, позволяющая вызывать код метода OnUpdate() внутри бара (по приходу новых сделок). Если в коде указано UseClosedBar = false, то вызов метода будет происходить внутри бара не чаще чем один раз в LiveBarTimeout секунд.
Тестирование стратегии с UseClosedBar = false невозможно. Предварительно оценить ее эффективность можно в режиме робота-советника.

Пример.

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

   UseClosedBar = false;
   LiveBarTimeout = 10; // Вызывать не чаще чем раз в 10 секунд
никогда такого не было и вот опять

Orange2000
Сообщения: 43
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 29 раз
Поблагодарили: 1 раз

Re: PriceChannel – ценовой канал или Канал Дончяна

Непрочитанное сообщение Orange2000 » 18 апр 2019, 20:45

благодарю за пояснение. А если вызывать каждую секунду., сильно будет грузить систему? и к слову таких роботов будет несколько.
и я так понимаю выше указанный код надо поместить в инициализацию?

и как грамотно добавить в индикатор линию middle=(upper+lower)/2
что бы потом к ней обращаться

Orange2000
Сообщения: 43
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 29 раз
Поблагодарили: 1 раз

Re: PriceChannel – ценовой канал или Канал Дончяна

Непрочитанное сообщение Orange2000 » 18 апр 2019, 21:15

так правильно?

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

function Initialize()
{
// Определение параметров индикатора
IndicatorName = "don";
AddInput("Input", Inputs.Candle);
AddParameter("Period", 50, 1);
PriceStudy = true;
AddSeries("Upper", DrawAs.Line, Color.Blue);
AddSeries("Lower", DrawAs.Line, Color.Red);
AddSeries("Midl", DrawAs.Line, Color.Green);
AddGlobalVariable("Uppers", Types.DoubleList);
AddGlobalVariable("Lowers", Types.DoubleList);
AddGlobalVariable("Midls", Types.DoubleList);
}

function Evaluate()
{
// AlfaDirect. 2015.
// Верхняя линия "Upper" - максимальная цена за Period
// Нижняя линия "Lower" - минимальная цена за Period
var high = Input.High[0];
var low = Input.Low[0];
Uppers.Add(high);
Lowers.Add(low);
if ( CurrentIndex > Period )
{
Uppers.RemoveAt(0);
for (var i = 0; i < Uppers.Count-1; i++)
high = Math.Max(Uppers[i], high);
Lowers.RemoveAt(0);
for (var i = 0; i < Lowers.Count-1; i++)
low = Math.Min(Lowers[i], low);
}
Upper = high;
Lower = low;
Midl = (high + low)/2;
}

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

Re: PriceChannel – ценовой канал или Канал Дончяна

Непрочитанное сообщение evge » 19 апр 2019, 07:36

Нормально, но есть лишнее:

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

AddGlobalVariable("Midls", Types.DoubleList);


можно убрать
никогда такого не было и вот опять

Orange2000
Сообщения: 43
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 29 раз
Поблагодарили: 1 раз

Re: PriceChannel – ценовой канал или Канал Дончяна

Непрочитанное сообщение Orange2000 » 22 апр 2019, 18:57

Евгений, нужен хелп.Вот что у меня получилось. Индикатор don как вверъу только со сдвигом на 1.

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

/**

**/

function Initialize()
{
   StrategyName = "don1";
   AddParameter("P1", 15, "", 1);

   AddInput("Input1", Inputs.Candle, 10, true, "");
   LongLimit = 0;
   ShortLimit = 0;
   UseClosedBar = false;
   LiveBarTimeout = 1; // Вызывать не чаще чем раз в 10 секунд
}

function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (Input1.High > MY.don(Input1, P1).GetValue("Upper", 0)) )
   {
      EnterLong();
   }

   /// ПРАВИЛО 2
   if ( (Input1.Low < MY.don(Input1, P1).GetValue("Midl", 0)) )
   {
      CloseLong();
   }

   /// ПРАВИЛО 3
   if ( (Input1.Low < MY.don(Input1, P1).GetValue("Lower", 0)) )
   {
      EnterShort();
   }

   /// ПРАВИЛО 4
   if ( (Input1.High > MY.don(Input1, P1).GetValue("Midl", 0)) )
   {
      CloseShort();
   }
   
   if ( ( RealizedPL() + CurrentPL() ) < -9000.0 )
   {
      Stop();
   }


}




Робот не открывает лонг( Не пойму в чем ошибка.Около 17-00 должен ьыл купить. Чуть раньше закрыл шорт, но как-то не в момент пересечения, а на след баре...

Orange2000
Сообщения: 43
Зарегистрирован: 13 мар 2019, 00:45
Благодарил (а): 29 раз
Поблагодарили: 1 раз

Re: PriceChannel – ценовой канал или Канал Дончяна

Непрочитанное сообщение Orange2000 » 22 апр 2019, 18:59

вот картинка
Вложения
Снимок.PNG
Снимок.PNG (11.02 КБ) 6483 просмотра


Вернуться в «Каналы»

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

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