В индикаторе если убрать из кода ТФ то всё виснет

 

Подскажите, не могу понять, если я убираю из кода параметр TimeFrame, то терминал виснет
Что-то нарушается в цикле по барам в истории?

#property indicator_chart_window
#property indicator_buffers 5
#property indicator_color1 clrNONE
#property indicator_color2 clrNONE
#property indicator_color3 clrNONE
#property indicator_color4 Aqua
#property indicator_color5 Magenta

#property indicator_width4 1
#property indicator_width5 1
//+------------------------------------------------------------------+
extern string TimeFrame = "current time frame";
extern int    Smoothing = 120;
extern double Dev       = 0.5;
//+------------------------------------------------------------------+
int TF;
string ind;
bool CalTF=false,RetTF=false;
bool Interpolate=true;
bool buy=true,sell=true;
double BuffInd0[];
double BuffInd1[];
double BuffInd2[];
double BuffInd3[];
double BuffInd4[];
double SigSell[];
double SigBuy[];
//+------------------------------------------------------------------+
//| Custom initialization function                                   |
//+------------------------------------------------------------------+
int init(){
   TF=StrTF(TimeFrame);
   IndicatorBuffers(7);
   SetIndexBuffer(0,BuffInd0); SetIndexStyle(0,DRAW_NONE);
   SetIndexBuffer(1,BuffInd1); SetIndexStyle(1,DRAW_NONE);
   SetIndexBuffer(2,BuffInd2); SetIndexStyle(2,DRAW_NONE);
   SetIndexBuffer(3,SigBuy);   SetIndexStyle(3,DRAW_ARROW); SetIndexArrow(3,233);
   SetIndexBuffer(4,SigSell);  SetIndexStyle(4,DRAW_ARROW); SetIndexArrow(4,234);
   SetIndexBuffer(5,BuffInd3); SetIndexStyle(5,DRAW_NONE);
   SetIndexBuffer(6,BuffInd4); SetIndexStyle(6,DRAW_NONE);
   if(TimeFrame=="calculateTma"){CalTF=true;return(0);}
   if(TimeFrame=="returnBars"){RetTF=true;return(0);}
   ind=WindowExpertName();
return(0);}
//+------------------------------------------------------------------+
//| Custom deinitialization function                                 |
//+------------------------------------------------------------------+
void deinit(){
   Comment("");}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,   // Количество просчитанных баров 
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int bar;
   datetime tm;
   double num;
   
   int limit=rates_total-prev_calculated;
   if(limit==0) return(rates_total);
   
   if(RetTF){BuffInd0[0]=limit;return(0);}
   if(CalTF){Dist(limit);return(0);}
   
   if(TF>Period()) limit=MathMax(limit,MathMin(Bars-1,iCustom(NULL,TF,ind,"returnBars",0,0)*TF/Period()));
  
   for(int i=rates_total-1; i>0; i--)
      {
      bar=iBarShift(NULL,TF,Time[i]);
      tm=iTime(NULL,TF,bar);
      
      BuffInd0[i]=iCustom(NULL,TF,ind,"calculateTma",Smoothing,Dev,0,bar);
      BuffInd1[i]=iCustom(NULL,TF,ind,"calculateTma",Smoothing,Dev,1,bar);
      BuffInd2[i]=iCustom(NULL,TF,ind,"calculateTma",Smoothing,Dev,2,bar);

// Стрелки
      SigSell[i]=EMPTY_VALUE;
      SigBuy [i]=EMPTY_VALUE;

      if(((High[i+1]>BuffInd1[i+1] && Close[i+1]>Open[i+1] && Close[i]<Open[i])||
          (Open[i+1]>BuffInd1[i+1] && Open[i]<BuffInd1[i]))&& sell) 
          {
          SigSell[i]=High[i];
          buy=true;
          sell=false;
          }
      if(((Low[i+1]<BuffInd2[i+1]  && Close[i+1]<Open[i+1] && Close[i]>Open[i])||
          (Open[i+1]<BuffInd2[i+1] && Open[i]>BuffInd2[i]))&& buy) 
          { 
          SigBuy[i]=Low[i];
          sell=true;
          buy=false;
          }
//=============================================================================|  
      if(TF<=Period()||bar==iBarShift(NULL,TF,Time[i-1])) continue;
      if(Interpolate){
         for(int j=1; i+j<Bars && Time[i+j]>=tm; j++){
         num=1.0/j;
         for(int n=1; n<j; n++){
            BuffInd0[i+n]=n*num*(BuffInd0[i+j])+(1.0-n*num)*BuffInd0[i];
            BuffInd1[i+n]=n*num*(BuffInd1[i+j])+(1.0-n*num)*BuffInd1[i];
            BuffInd2[i+n]=n*num*(BuffInd2[i+j])+(1.0-n*num)*BuffInd2[i];
            } 
         }
      }
   }
return(rates_total);}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Dist(int lmt){
   int limit;
   double dist1,dist2,ma,MultDist=2.0*Smoothing+1.0;
   for(int i=lmt; i>=0; i--){
      dist1=(Smoothing+1)*iMA(NULL,0,1,0,MODE_SMA,1,i);
      dist2=Smoothing+1;
      limit=1;
      for(int h=Smoothing; limit<=Smoothing; h--){
         dist1 += h*iMA(NULL,0,1,0,MODE_SMA,1,i+limit);
         dist2 += h;
         if(limit<=i){
            dist1 += h*iMA(NULL,0,1,0,MODE_SMA,1,i-limit);
            dist2 += h;
         }
         limit++;
      }
      BuffInd0[i]=dist1/dist2;
      ma=iMA(NULL,0,1,0,MODE_SMA,1,i)-BuffInd0[i];
      if(i<=Bars-Smoothing-1){
         if(i==Bars-Smoothing-1){
            BuffInd1[i]=BuffInd0[i];
            BuffInd2[i]=BuffInd0[i];
            if(ma>=0.0){
               BuffInd3[i]=MathPow(ma,2);
               BuffInd4[i]=0;
               continue;
               }
               BuffInd4[i]=MathPow(ma,2);
               BuffInd3[i]=0;
               continue;
           }
         if(ma>=0.0){
            BuffInd3[i]=((BuffInd3[i+1])*(MultDist-1.0)+MathPow(ma,2))/MultDist;
            BuffInd4[i]=(BuffInd4[i+1])*(MultDist-1.0)/MultDist;
            } else {
            BuffInd4[i]=((BuffInd4[i+1])*(MultDist-1.0)+MathPow(ma,2))/MultDist;
            BuffInd3[i]=(BuffInd3[i+1])*(MultDist-1.0)/MultDist;
            }
         BuffInd1[i]=BuffInd0[i]+Dev*MathSqrt(BuffInd3[i]);
         BuffInd2[i]=BuffInd0[i]-Dev*MathSqrt(BuffInd4[i]);
      }
   }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int StrTF(string tf){
   int zn;
   for(int k=StringLen(tf)-1; k>=0; k--){
      zn=StringGetChar(tf,k);
      if((zn>'`' && zn<'{')||(zn>'Я' && zn<256)) tf=StringSetChar(tf,1,zn-32);
      else
      if(zn>-33 && zn<0) tf=StringSetChar(tf,1,zn+224);
      }
   int per=0;
   if(tf=="M1"||tf=="1")     per=1;
   if(tf=="M5"||tf=="5")     per=5;
   if(tf=="M15"||tf=="15")   per=15;
   if(tf=="M30"||tf=="30")   per=30;
   if(tf=="H1"||tf=="60")    per=60;
   if(tf=="H4"||tf=="240")   per=240;
   if(tf=="D1"||tf=="1440")  per=1440;
   if(tf=="W1"||tf=="10080") per=10080;
   if(tf=="MN"||tf=="43200") per=43200;
   if(per==0||per<Period())  per=Period();
return(per);}
//+------------------------------------------------------------------+
 
зачем убирать ? цель какая ?
 
Iurii Tokman:
зачем убирать ? цель какая ?

Чтобы зависло…

 
Iurii Tokman:
зачем убирать ? цель какая ?

Если обращаться к нему из советника, то тяжело тянет, да и не нужен он там, всё равно не используется.
Я в индикаторе убираю всё что связанно с параметром TimeFrame и терминал вообще зависает 
Заметил так же что если сместить этот параметр ниже на пару строчек то так же терминал зависает

 
forex2030:

Если обращаться к нему из советника, то тяжело тянет, 

тяжело тянет скорей всего из за кастомного индикатора

смотрите в - calculateTma и returnBars

 
Iurii Tokman:

смотрите в - calculateTma и returnBars

Ни чего нового я там не увидел))
Как правильно удалить параметр TimeFrame ?

 
forex2030:

Ни чего нового я там не увидел))
Как правильно удалить параметр TimeFrame ?

Это удалять не надо. Достаточно указать нормальный TF простым числом. 1, 5, 15 и так далее из списка

int StrTF(string tf){
   int zn;
   for(int k=StringLen(tf)-1; k>=0; k--){
      zn=StringGetChar(tf,k);
      if((zn>'`' && zn<'{')||(zn>'Я' && zn<256)) tf=StringSetChar(tf,1,zn-32);
      else
      if(zn>-33 && zn<0) tf=StringSetChar(tf,1,zn+224);
      }
   int per=0;
   if(tf=="M1"||tf=="1")     per=1;
   if(tf=="M5"||tf=="5")     per=5;
   if(tf=="M15"||tf=="15")   per=15;
   if(tf=="M30"||tf=="30")   per=30;
   if(tf=="H1"||tf=="60")    per=60;
   if(tf=="H4"||tf=="240")   per=240;
   if(tf=="D1"||tf=="1440")  per=1440;
   if(tf=="W1"||tf=="10080") per=10080;
   if(tf=="MN"||tf=="43200") per=43200;
   if(per==0||per<Period())  per=Period();
return(per);}

А вообще… какой ……… это придумал¿¿¿ Зачем так издеваться?

 
Alexey Viktorov:

Это удалять не надо. Достаточно указать нормальный TF простым числом. 1, 5, 15 и так далее из списка

Не помогает такое решение, виснет
 
forex2030:
Не помогает такое решение, виснет

Значит надо просто выбросить и никогда не вспоминать такой код. При использовании void OnCalculate использовать int init() просто что-то с чем-то, не сказать ещё хужей…

 
Alexey Viktorov:

Значит надо просто выбросить и никогда не вспоминать такой код.

Выбросить это не выход
Хочется разобраться с этим вопросом, да и в будущем пригодиться данное решение проблемы 

 
forex2030:

Выбросить это не выход
Хочется разобраться с этим вопросом, да и в будущем пригодиться данное решение проблемы 

Решение проблемы это самостоятельно писать так как не будет виснуть, а не чужой код реставрировать. Можно заказать… тоже решение проблемы.