Если отклонение превышает порог шума (Zero), то счетчик инкрементируется при продолжении тренда и меняет знак, если тренд сменил направление.
Если отклонение в пределах шума, то значение счетчика уменьшается (но без смены знака тренда), если это (маленькое) изменение противоречит текущему тренду.
Код: Выделить всё
function Initialize()
{
IndicatorName = "TrendCnt";
PriceStudy = false;
AddInput("Input", Inputs.Price);
AddSeries("TrendCnt", DrawAs.Line, Color.Black, AxisType.ZeroBased);
AddLevel(0, Color.Black, "TrendCnt");
AddParameter("Interval", 2, "Интервал рассчета");
AddParameter("Zero", 0.0, "Точность нуля");
AddGlobalVariable("Ext", Types.Double, 0.0);
}
function Evaluate()
{
int ci=(int)CurrentIndex;
if(ci==0) Ext=Input[0];
int h=Math.Min(ci, (int)Interval);
double i0=Input[0];
double i1=Input[-h];
double d=i0-i1;
double z=(double)Zero;
if(Math.Abs(d)<=z) d=i0-Ext;
int p=(ci==0 ? 0 : (int)TrendCnt[-1]);
if(d> z) { p=(p<=0 ? 1 : p+1); Ext=i1; } else
if(d<-z) { p=(p>=0 ? -1 : p-1); Ext=i1; }
else // d~0
{
if(d<0.0 && p> 1) p-=1; else // отмотать счетчик только при "-0"
if(d>0.0 && p<-1) p+=1; // отмотать счетчик только при "+0"
// оставить прежним при точном "0"
}
TrendCnt=p;
}
При смене знака можно рассматривать открытие позиции сразу или ждать двойки или хотя бы нескольких единиц подряд.
Возврат к единице после больших значений - окончание движения или временный застой (можно, например, подтянуть стоп поближе).
Применять можно не только (или даже не столько) к ценам, но и к другим индикаторам (например, к разности бегущих средних в индикаторах вроде Awersome).