Не отображается индикатор..... ошибка в ДНК или "неправильные пчелы", помогите определиться ) - страница 4

 

Part Two


//======================================================================
// вычисление узлов зигзага на эмуляции старших ТФ и отображение на текущем
//======================================================================
void FractalCalc ()
{   
   // не использую  конструкцию типа int IC=IndicatorCounted(); и т.д.
   // как-то слабо представляю нужна ли она здесь и как ее сюда вставить...... ???????
   // и не факт, что это будет быстрее работать.
   // Для ускорения можно просто уменьшить "VOLEXT" (см. ниже) - больше 15-20 вряд ли кому нужно
 
   // Экономия №1 - вычисление один раз только на полностью сформировавшемся баре рабочего ТФ
   if (PrevTimeCalc == Time[0]) return; else PrevTimeCalc=Time[0];
   
   int VolExt=50, NumberExt, Per; // вычисление "VolExt+1" последних фракталов (без учета последующей очистки)   
   int y, x, k, i, j;
   int t1, t2, t3, t4, t5;                     // время последнего бара тек ТФ, закрывающего бар №1-5 старшего ТФ
   int limit1, limit2, limit3, limit4, limit5; // номер последнего бара тек ТФ, закрывающего бар №1-5 старшего ТФ
   int up1,up2,up3,up4,up5,dn1,dn2,dn3,dn4,dn5;// номера баров тек ТФ с пиками и донышками соотв барам 1-5 старшего ТФ
 
   for (y=1; y<=3; y++) // цикл по рассчитываемым ТФ
      {
      if (y==1) Per=TFLarge; if (y==2) Per=TFMidle; if (y==3) Per=TFSmall;
      
      // Экономия №2 - Вычисляем потенциальные изломы только с окончанием формирования бара старшего ТФ
      if (PrevTimePer[y] !=0)
         { 
         if (Per<43200 && (Time[0] - PrevTimePer[y])<Per*60 )continue; // так работает
         // if (Per<43200 && (TimeCurrent() - PrevTimePer[y])<Per*60 )continue; // а так работает, но некорректно
         if (Per==43200 && Month()==TimeMonth(PrevTimePer[y]))continue;
         }
      PrevTimePer[y]=MathCeil(Time[0]/Per/60)*Per*60; 
      // Если прямолинейно PrevTimePer[y]=Time[0]; то в случае пропуска бара на рабочем таймфрейме
      // произойдет сдвиг всей цепочки расчета на величину пропуска
      
      // инициализация.... если использовать IndicatorCounted(), то эту строку нужно убирать
      // ... а как выяснилось при внимательном рассмотрении, то она и вовсе не нужна :)
      //if (y==1) ArrayInitialize(Large,0.0); if (y==2) ArrayInitialize(Midle,0.0); if (y==3) ArrayInitialize(Small,0.0);
      NumberExt=0;
      k=Per/CurPeriod;
      i=MathCeil(Bars/k)-5; // ограничение цикла - в зависимости от того какой ТФ обсчитываем
      for (x=1; x<=i; x++) 
         {
         // находим пики и донышки
         // время начала последнего бара тек ТФ, закрывающего бар №1 старшего ТФ
         //##################  Так Не Работает ###############################  - вопрос к разработчикам!!!!!!!!!!!!
         //t1=MathCeil(TimeCurrent()/Per/60)*Per*60-x*Per*60+(k-1)*CurPeriod*60;
         //################## А Так Заработало ############################### 
         t1=MathCeil(Time[0]/Per/60)*Per*60-x*Per*60+(k-1)*CurPeriod*60;
         t2=t1-k*CurPeriod*60; t3=t2-k*CurPeriod*60; t4=t3-k*CurPeriod*60; t5=t4-k*CurPeriod*60;
         limit1=iBarShift(NULL,0,t1, false); limit2=iBarShift(NULL,0,t2, false); limit3=iBarShift(NULL,0,t3, false);
         limit4=iBarShift(NULL,0,t4, false); limit5=iBarShift(NULL,0,t5, false);         
         up1=iHighest(NULL,0,MODE_HIGH,k,limit1);up2=iHighest(NULL,0,MODE_HIGH,k,limit2);up3=iHighest(NULL,0,MODE_HIGH,k,limit3);
         up4=iHighest(NULL,0,MODE_HIGH,k,limit4);up5=iHighest(NULL,0,MODE_HIGH,k,limit5);
         dn1=iLowest(NULL,0,MODE_LOW,k,limit1);dn2=iLowest(NULL,0,MODE_LOW,k,limit2);dn3=iLowest(NULL,0,MODE_LOW,k,limit3);
         dn4=iLowest(NULL,0,MODE_LOW,k,limit4);dn5=iLowest(NULL,0,MODE_LOW,k,limit5);
 
         // ищем фракталы
         if(High[up3]>High[up2] && High[up3]>High[up1] && High[up3]>=High[up4] && High[up3]>=High[up5])
            {
            if (y==1)Large[up3]=High[up3]; if (y==2)Midle[up3]=High[up3]; if (y==3) Small[up3]=High[up3];    
            NumberExt++;
            }
         if(Low[dn3]<Low[dn2] && Low[dn3]<Low[dn1] && Low[dn3]<=Low[dn4] && Low[dn3]<=Low[dn5])
            {
            if (y==1)Large[dn3]=Low[dn3]; if (y==2)Midle[dn3]=Low[dn3]; if (y==3) Small[dn3]=Low[dn3];    
            NumberExt++;
            }
         if (NumberExt>VolExt) break;
         } 
      }
}
Причина обращения: