Код на языке Амиброкера для обычного канала:
bars=10;
HCH=Ref(HHV(H,bars),-1); // верхняя граница канала
LCH=Ref(LLV(L,bars),-1); // нижняя граница канала
Несмотря на простоту обычного канала, основным его недостатком может считаться тот факт что граница канала вовсе не обязательно приходятся на предыдущий экстремум (хай или лоу). То есть присутствует определенная неточность. С этой точки зрения это конечно минус.
Но с другой стороны, есть и определенный плюс. Канал не "заглядывает" в прошлое дальше установленного количества баров. Чаще всего границей канала будет самый сильный экстремум попавший в поле "зрения" канала. В остальных случаях границей канала станет некий средний уровень между попавшимся в канал экстремумом и предыдущим, более сильным экстремумом, но в канал уже не попавшим. В общем-то, и такой вариант не однозначно плохой, скорее это некоторое "приближение".
Для людей, любящих точность и не любящих приближения, предлагаю вариант канала, когда границей канала всегда является предыдущий хай или лоу цены вне зависимости от того как давно он случился.
Код индикатора на языке Амиброкера:
Код:
revers=3; // в процентах
ex1[0]=High[0];
ex2[0]=Low[0];
Lasttype[0]=1;
for (i=1;i<BarCount-1;i++) {
ex1[i]=ex1[i-1];
ex2[i]=ex2[i-1];
Lasttype[i]=Lasttype[i-1];
Hlimit[i]=(1+revers/100)*ex2[i];
Llimit[i]=(1-revers/100)*ex2[i];
if (Lasttype[i-1]==1) {
if (High[i]>Hlimit[i]) {
Lasttype[i]=3-Lasttype[i-1];
ex1[i]=ex2[i];
ex2[i]=High[i];
Llimit[i]=(1-revers/100)*ex2[i];
} else {
if (Low[i]<ex2[i]) {
ex2[i]=Low[i];
newex[i]=1;
}
}
} else {
if (Low[i]<Llimit[i]) {
Lasttype[i]=3-Lasttype[i-1];
ex1[i]=ex2[i];
ex2[i]=Low[i];
Hlimit[i]=(1+revers/100)*ex2[i];
} else {
if (High[i]>ex2[i]) {
ex2[i]=High[i];
newex[i]=1;
}
}
}
}
Hch=Ref(Max(ex1,ex2),-1); // верхняя граница канала
Lch=Ref(Min(ex1,ex2),-1); // нижняя граница канала
Здесь ключевым параметром построения канала является параметр revers, который задает величину движения от предыдущего экстремума, которая будет считаться достаточно сильной чтобы считаться новым экстремумом.
В общем то, принцип здесь тот же что используется в индикаторе ZigZag или при построении графиков крестиков-ноликов.
Достоинство такого канала - границы точно приходятся на экстремумы.
Недостаток - если тренд движется достаточно плавно, а реверс достаточно большой, ширина канала может увеличиться значительно. Собственно, реверс задает ограничение на минимальную ширину канала. Он не может стать меньше реверса. А вот больше - пожалуйста.
Еще один вариант ценового канала:
Код:
bars=150;
HCH=Ref(HHV(H,bars),-1);
LCH=Ref(LLV(L,bars),-1);
LastHigh=Ref(ValueWhen(H>=HCH,H),-1);
LastLow=Ref(ValueWhen(L<=LCH,L),-1);
HCH2=Max(HCH,LastHigh);
LCH2=Min(LCH,LastLow);
Здесь тоже границы канала HCH2 и LCH2 приходятся на экстремумы графика. Если в предыдущей формуле экстремум начинал считаться значимым когда цена отходила от него на указанное число процентов, здесь экстремум начинает считаться значимым когда цена пробивает противоположную сторону "простого" ценового канала HCH-LCH.
Пример картинки с таким каналом:
У фьючерсов, торгуемых круглосуточно, в ночные (по американскому времени) часы волатильность сильно падает. Получается так называемый "тонкий рынок". То же самое на графиках форекса.
Если применять достаточно короткий ценовой канал к такому графику, то канал будет сжиматься к концу тонкого рынка. Не всегда это хорошо. Поэтому я нарисовал формулу для канала, которая позволяет "сжать" весь период тонкого рынка и учитывать весь этот период как один бар.
Код:
bars=175;
starthour=0;
endhour=10;
afterstart=BarsSince((Hour()==starthour)AND(Ref(Hour(),-1)!=starthour));
afterend=BarsSince((Hour()==endhour)AND(Ref(Hour(),-1)!=endhour));
more=IIf(afterstart<afterend,afterstart,IIf(afterend<bars-1,afterstart-afterend-1,0));
bars2=bars+more;
Hc=HHV(H,bars2);
Lc=LLV(L,bars2);
здесь
bars - длина канала в барах
starthour - час начала "тонкого рынка"
endhour - час начала обычного рынка
Весь период от starthour вплоть до endhour учитывается как один бар.