Что не так с индикаторами Pivot?

 

Долго не трогал пивоты, а сейчас попытался запустить в тестере на пустом советнике несколько версий из кодобазы и одну переработанную мной, странное поведение у них, на смене периода расчёта индикатор или вообще не пересчитывается (моя версия), или рисует какую-то чушь, до принудительной инициализации вызовом и подтверждением настроек. Билд  670. Все эти индикаторы взяты из кодобазы, на билде 482 всё работает, а на 670 что-то не так.

Вот, например, этот - в 482 перерасчитывается нормально, сам, в 670 рисует такое, пока не стукнешь его по башке:

а вот этот мой, он просто прямые линии рисует с момента первого расчёта и до повторной компиляции (в билде 482 всё нормально перерасчитывается без дополнительных пинков или пляски с бубном):

#property indicator_chart_window
#property indicator_buffers 7
#property indicator_color1 Gold
#property indicator_color2 OrangeRed
#property indicator_color3 SkyBlue
#property indicator_color4 OrangeRed
#property indicator_color5 SkyBlue
#property indicator_color6 Maroon
#property indicator_color7 RoyalBlue

//---- buffers
double PBuffer[];
double S1Buffer[];
double R1Buffer[];
double S2Buffer[];
double R2Buffer[];
double S3Buffer[];
double R3Buffer[];

  int period=PERIOD_D1,k=1,d=0,limit=0;
  double P=0,S1=0,R1=0,S2=0,R2=0,S3=0,R3=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexBuffer(0,PBuffer);
   SetIndexBuffer(1,S1Buffer);
   SetIndexBuffer(2,R1Buffer);
   SetIndexBuffer(3,S2Buffer);
   SetIndexBuffer(4,R2Buffer);
   SetIndexBuffer(5,S3Buffer);
   SetIndexBuffer(6,R3Buffer);
   
   SetIndexLabel(0,"Pivot");
   SetIndexLabel(1,"Su1");
   SetIndexLabel(2,"Re1");
   SetIndexLabel(3,"Su2");
   SetIndexLabel(4,"Re2");
   SetIndexLabel(5,"Su3");
   SetIndexLabel(6,"Re3");
   SetIndexStyle(0,DRAW_LINE,0,2,indicator_color1);
   SetIndexStyle(1,DRAW_LINE,0,2,indicator_color2);
   SetIndexStyle(2,DRAW_LINE,0,2,indicator_color3);
   SetIndexStyle(3,DRAW_LINE,0,2,indicator_color4);
   SetIndexStyle(4,DRAW_LINE,0,2,indicator_color5);
   SetIndexStyle(5,DRAW_LINE,0,2,indicator_color6);
   SetIndexStyle(6,DRAW_LINE,0,2,indicator_color7);

    if(Period()>60 && Period()<=240) period=PERIOD_W1;
    if(Period()>240) period=PERIOD_MN1;
    d=Digits;
    IndicatorDigits(Digits);
   return(0);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
  limit=Bars-IndicatorCounted();
  if (limit>0) limit=Bars-1;

  for (int i=limit; i>=0;i--)
  { 
    int sh = iBarShift(NULL, period, Time[i], false);
    
    double H = iHigh(NULL, period, sh + 1);
    double L = iLow(NULL, period, sh + 1); 
    double C = iClose(NULL, period, sh + 1);
    double O = iOpen(NULL, period, sh + 1);
    double RG = H-L;
    
    P =  (H+L+C)/3; 
    R1 = 2*P-L;
    S1 = 2*P-H;
    R2 = P+RG;
    S2 = P-RG;
    R3 = R1+RG;
    S3 = S1-RG;
    
    PBuffer[i]  = NormalizeDouble(P,d); 
    R1Buffer[i] = NormalizeDouble(R1,d);
    S1Buffer[i] = NormalizeDouble(S1,d);
    R2Buffer[i] = NormalizeDouble(R2,d);
    S2Buffer[i] = NormalizeDouble(S2,d);
    R3Buffer[i] = NormalizeDouble(R3,d);
    S3Buffer[i] = NormalizeDouble(S3,d);
  }
   return(0);
}
 
Вот-вот, так я о том же спрашивал, а меня вы все не хотели понять! Но спасибо вам всем, что никто не мог ничего толком помочь, поэтому я всё отладил самостоятельно, и всё в 00:00 меняется чётко по всем парам без компилляций и обновлений и без применения newMQL4! И всё благодаря вам!
 
borilunad:
Вот-вот, так я о том же спрашивал, а меня вы все не хотели понять! Но спасибо вам всем, что никто не мог ничего толком помочь, поэтому я всё отладил самостоятельно, и всё в 00:00 меняется чётко по всем парам без компилляций и обновлений и без применения newMQL4! И всё благодаря вам!
Позлорадствовал вволю, ядом, поди, всю клавиатуру забрызгал )))
 
evillive:
Позлорадствовал вволю, ядом, поди, всю клавиатуру забрызгал )))


Да обидно! Перечитай, сколько мне прочли поучений, особенно, ты! Конечно, старался как-то навести меня на что-то, но сам не удосужился вникнуть! А ведь главная ошибка оказалась в оригинале, потому в 0 часов, поскольку с сервера нет тика буфферы отключались и не рисовали, а рисовали только на следующем баре уже новое значение, потому образовывался перерыв. А объекты уровней, вообще сами не переключались, т.к. Автор думал, наверно, что всё равно спать пора! А мне важно было сразу видеть изменения уровней!
 

Читай внимательнее что я написал в вопросе - все буферы рисует у меня, ничего нигде не пропускает, да и код не менялся с до-маркетового билда. А вот считать перестали все версии что в кодобазе нашёл плюс переделанная моя версия тоже не пересчитывает значения буферов, какие были - те дальше и рисует...


Да и поучения я тебе по большей части насчёт винды той восьмой, а не индикатора какого-то вроде писал, и вообще, на обиженных воду возят (:

 

Вот она ошибка в DailyPivotPoints:

    for(cnt=begin_bar; cnt>=0; cnt--)
    {
      yesterday_close=iClose(NULL,PERIOD_D1,cnt+1);
      today_open=iOpen(NULL,PERIOD_D1,cnt);
      yesterday_high=iHigh(NULL,PERIOD_D1,cnt+1);
      yesterday_low=iLow(NULL,PERIOD_D1,cnt+1);
      P = (yesterday_high+yesterday_low+yesterday_close+today_open)/4;//
      switch(ExtFormula)
      {
        case 1 :
          R = P + P - yesterday_low;
          S = P + P - yesterday_high;
          break;
        case 2 :
          R = P + yesterday_high - yesterday_low;
          S = P - yesterday_high + yesterday_low;
          break;
        case 3 :
          R = P + P - yesterday_low - yesterday_low + yesterday_high;
          S = P + P - yesterday_high - yesterday_high + yesterday_low;        
      }
      if(ExtDraw==true)
      {
        first_bar=iBarShift(NULL,0,iTime(NULL,PERIOD_D1,cnt)); //-1;            // эти минусы 1 не дают соединиться линиям-
        if(cnt>0) last_bar=iBarShift(NULL,0,iTime(NULL,PERIOD_D1,cnt-1)); //-1; // уровням, т.к. в 0:00:00 никогда нет тика!
        else last_bar=0;
        while(first_bar>=last_bar)
        {
          if(first_bar==last_bar && last_bar>0) break;
          if(ExtFormula==0) ExtMapBuffer1[first_bar]=P;
          else
          {
            ExtMapBuffer1[first_bar]=R;
            ExtMapBuffer2[first_bar]=S;
          }
          first_bar--;
    } } }
    P = NormalizeDouble((yesterday_high + yesterday_low + yesterday_close)/3,Digits);

Но потом воодушевившись, ещё многое поменял и получил полноценный автомат, т.к. на ночь не отключаюсь!

 
borilunad:

Вот она ошибка в DailyPivotPoints:

Но потом воодушевившись, ещё многое поменял и получил полноценный автомат, т.к. на ночь не отключаюсь!

про iBarShift ещё почитай, особенно про 4й параметр )

 
evillive:

Читай внимательнее что я написал в вопросе - все буферы рисует у меня, ничего нигде не пропускает, да и код не менялся с до-маркетового билда. А вот считать перестали все версии что в кодобазе нашёл плюс переделанная моя версия тоже не пересчитывает значения буферов, какие были - те дальше и рисует...


Да и поучения я тебе по большей части насчёт винды той восьмой, а не индикатора какого-то вроде писал, и вообще, на обиженных воду возят (:


Так у меня тоже из кодобазы МКовский! Да я не обижаюсь, просто страшно на себя злился, что не мог допетрить! Потом стал всё разбирать по косточкам и нашёл ещё много других возможностей, и теперь это у меня, как информационный центр, все комменты о торговле выводит, а советник только занят своим прямым делом, но ещё не готов. Пришлось многое менять, так что сейчас всё внимание ему! 
 
evillive:

про iBarShift ещё почитай, особенно про 4й параметр )


Этот что ли 4й:      yesterday_low=iLow(NULL,PERIOD_D1,cnt+1); 

Ну и что? А iBarShift(NULL,0,iTime(NULL,PERIOD_D1,cnt)); У него 3 параметра, а не 4.

 
borilunad:


Этот что ли 4й:      yesterday_low=iLow(NULL,PERIOD_D1,cnt+1); 

Ну и что? А iBarShift(NULL,0,iTime(NULL,PERIOD_D1,cnt)); У него 3 параметра, а не 4.

 
evillive:




Спасибо! Справился в Доке, что нужен 4й параметр: exact=false    Так что нужно вставить, но тогда

 iBarShift(NULL,0,iTime(NULL,PERIOD_D1,cnt),false); Что-то не то!

Но у меня и без этого всё меняется по времени, не дожидаясь бара! ;))

А у тебя это:  int sh = iBarShift(NULL, period, Time[i], false); 

Благодарю за наводку! А почему сами Стринги-скрипторы от МКотцев не пишут по правилам?!