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

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

Добавлено: 07 фев 2016, 12:39
evge
Ценовой канал – это индикатор показывающий максимум и минимум за последний интервал изменения цен заданной длительности.

Индикатор имеет 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 КБ) 39470 просмотров


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

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

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;
}

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

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

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;
}

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

Добавлено: 18 апр 2019, 19:21
Orange2000
Евгений здравствуйте!, можете подсказать?. Хочу сделать систему на основе канала дончииана.

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

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

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

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

Пример.

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

   UseClosedBar = false;
   LiveBarTimeout = 10; // Вызывать не чаще чем раз в 10 секунд

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

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

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

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

Добавлено: 18 апр 2019, 21:15
Orange2000
так правильно?

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

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;
}

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

Добавлено: 19 апр 2019, 07:36
evge
Нормально, но есть лишнее:

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

AddGlobalVariable("Midls", Types.DoubleList);


можно убрать

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

Добавлено: 22 апр 2019, 18:57
Orange2000
Евгений, нужен хелп.Вот что у меня получилось. Индикатор 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 должен ьыл купить. Чуть раньше закрыл шорт, но как-то не в момент пересечения, а на след баре...

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

Добавлено: 22 апр 2019, 18:59
Orange2000
вот картинка