В чем ошибка?

 
Взгляните что не так!!! Индикатор кидаю на график, рисует все правильно. Открываю окно данных - все верно(те числа, по которым нарисован график). С помощью Comment вывожу в верхний правый угол, там фигурирует совсем другая цифра, откуда она? Это еще не все! Вызываю его из эксперта, опять же Comment рисует вообще сплошной ноль(0).
Вот код индикатора:
#property indicator_chart_window
extern int Length=21;
#property indicator_buffers 1
#property indicator_color1 Red

double Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Buffer);
   SetIndexDrawBegin(0,Length);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
  Comment(""); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//---- TODO: add your code here
   double LinearRegValue=0,Slop=0,Num1=0,Num2=0,SumBars=0,SumSqrBars=0,SumY=0,Sum1=0,Sum2=0,Slope=0,Intercept=0;
   int ExtCountedBars=0;
   ExtCountedBars=IndicatorCounted();
   if(Bars<=Length) return(0);
   //---- check for possible errors
   if (ExtCountedBars<0) return(-1);
   //---- last counted bar will be recounted
   if (ExtCountedBars>0) ExtCountedBars--;
   int    shift,i;
//---- initial accumulation
   shift=Bars-Length-1;
   if(ExtCountedBars>=Length) shift=Bars-ExtCountedBars-1;
   for(shift=1;shift<=Bars;shift++)
      {
      SumBars=0; //Обнуляем для расчетов
      SumSqrBars=0;
      SumY=0;
      Sum1=0;
      Sum2=0;
      for(i=0;i<=Length-1;i++)
         {
         SumY+=Close[shift+i-1];
         Sum1+=i*Close[shift+i-1];
         }
      SumBars=Length*(Length-1)*0.5;
      SumSqrBars=(Length-1)*Length*(2*Length-1)/6;
      Sum2=SumBars*SumY;
      Num1=Length*Sum1-Sum2;
      Num2=SumBars*SumBars-Length*SumSqrBars;
      if (Length==0) LinearRegValue=0;
      if (Num2!=0) 
         Slope=(Num1/Num2);
      else 
         Slope=0;
      Intercept=(SumY-Slope*SumBars)/Length;
      LinearRegValue=Intercept+Slope*(Length-1);
      Buffer[shift-1]=LinearRegValue;
      }
//---- zero initial bars
      if(ExtCountedBars<1)
      for(i=0;i<Length;i++) Buffer[Bars-i]=0;
      Comment("LinearRegValue ",LinearRegValue);
      return(0);
  }


Что не так?

 
Comment("LinearRegValue ",LinearRegValue);
return(0)
}

return(0); кроме как точку с запятой надо поставить:) с числом в комент действительно засада...
 
У меня в правом верхнем углу вообще ничего не вывелось, зато в левом - "LinearRegValue 0.3248" , чарт - GBPUSD , M30
 
У меня в правом верхнем углу вообще ничего не вывелось, зато в левом - "LinearRegValue 0.3248" , чарт - GBPUSD , M30

Обшибся про правый! Вот и про это: Пишет одно, а рисует другое.
 
SumY+=Close[shift+i-1];

вроде намудрили , что будет когда shift=Bars да еще к нему плюс i , которое может быть от 0 до Length-1 (Length=21), здесь тоже не понятно

Slope=0;
Intercept=(SumY-Slope*SumBars)/Length;

, экономичнее будет так

Slope=0;
Intercept=SumY/Length;

все равно Slope*SumBars будет равно 0, далее по коду также

 
Slope=0;
Intercept=(SumY-Slope*SumBars)/Length;

, экономичнее будет так

Slope=0;
Intercept=SumY/Length;

все равно Slope*SumBars будет равно 0, далее по коду также


Перед Slope=0; стоит условие, это к нему относится.
if (Num2!=0) 
         Slope=(Num1/Num2);
      else 
         Slope=0;



У меня же Slope не всегда равен 0, здесь, я думаю, правильно.

 
Перед Slope=0; стоит условие, это к нему относится.
if (Num2!=0) 
         Slope=(Num1/Num2);
      else 
         Slope=0;



У меня же Slope не всегда равен 0, здесь, я думаю, правильно.


просмотрел, а как насчет обращения к несуществующим барам, хотя результат вроде высчитан и он должен быть отрисован, но с другой стороны если вставить алерт в твой цикл то индикатор убивает терминал зацикливанием (проц загружается на 100%) скорее всего внимательнее нужно посмотреть организацию цикла
 
Перед Slope=0; стоит условие, это к нему относится.
if (Num2!=0) 
         Slope=(Num1/Num2);
      else 
         Slope=0;



У меня же Slope не всегда равен 0, здесь, я думаю, правильно.


просмотрел, а как насчет обращения к несуществующим барам, хотя результат вроде высчитан и он должен быть отрисован, но с другой стороны если вставить алерт в твой цикл то индикатор убивает терминал зацикливанием (проц загружается на 100%) скорее всего внимательнее нужно посмотреть организацию цикла

Бары существуют, shift может быть равен (Bars-1), а это существующий бар. Немного подправил, вроде рисунок с цифрами совпадает, но в эксперте все равно 0.
#property copyright "Copyright © 2005, Ekc"
#property link      ""

#property indicator_chart_window
extern int Length=21;
#property indicator_buffers 1
#property indicator_color1 Red

double Buffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Buffer);
   SetIndexDrawBegin(0,Length);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
  Comment(""); 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//---- TODO: add your code here
   double LinearRegValue=0,Slop=0,Num1=0,Num2=0,SumBars=0,SumSqrBars=0,SumY=0,Sum1=0,Sum2=0,Slope=0,Intercept=0;
   int ExtCountedBars=0;
   ExtCountedBars=IndicatorCounted();
   if(Bars<=Length) return(0);
   //---- check for possible errors
   if (ExtCountedBars<0) return(-1);
   //---- last counted bar will be recounted
   if (ExtCountedBars>0) ExtCountedBars--;
   int    shift,i;
//---- initial accumulation
   shift=Bars-Length-1;
   if(ExtCountedBars>=Length) shift=Bars-ExtCountedBars-1;
   //for(shift=1;shift<=Bars;shift++)
     while(shift>0) 
      {
      SumBars=0; //Обнуляем для расчетов
      SumSqrBars=0;
      SumY=0;
      Sum1=0;
      Sum2=0;
      for(i=0;i<=Length-1;i++)
         {
         SumY+=Close[shift+i];
         Sum1+=i*Close[shift+i];
         }
      SumBars=Length*(Length-1)*0.5;
      SumSqrBars=(Length-1)*Length*(2*Length-1)/6;
      Sum2=SumBars*SumY;
      Num1=Length*Sum1-Sum2;
      Num2=SumBars*SumBars-Length*SumSqrBars;
      if (Length==0) LinearRegValue=0;
      if (Num2!=0) Slope=(Num1/Num2);
        else Slope=0;
      Intercept=(SumY-Slope*SumBars)/Length;
      LinearRegValue=Intercept+Slope*(Length-1);
      Buffer[shift]=LinearRegValue;
      shift--;
      }
//---- zero initial bars
      if(ExtCountedBars<1)
      for(i=0;i<Length;i++) Buffer[Bars-i]=0;
      Comment("SumY ",SumY,"\n","SumBars ",SumBars,"\n","SumSqrBars ",SumSqrBars,
            "\n","Sum1 ",Sum1,"\n","Sum2 ",Sum2,"\n","Num1 ",DoubleToStr(Num1,6),"\n","Num2 ",Num2,
            "\n","Slope ",DoubleToStr(Slope,6),"\n","Intercept ",Intercept,"\n","LinearRegValue ",LinearRegValue,
            "\n","Counted_bars ", ExtCountedBars,"\n","Bars ",Bars);
   
//----
   return(0);
  }


Куда вы вставляете Alert?

 
Куда вы вставляете Alert?

после
LinearRegValue=Intercept+Slope*(Length-1);
Alert("LinearRegValue ",LinearRegValue);
 
Куда вы вставляете Alert?

после
LinearRegValue=Intercept+Slope*(Length-1);
Alert("LinearRegValue ",LinearRegValue);


Все нормально работает, правда не сразу, секунд 5 подумал и выдал.
 
да теперь он и результаты по комент выдает верные, дальше нужно с экспертом разбираться :)