Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Делай скриншоты в MetaTrader и управляй ими в галерее!
Anton
52
Anton 2012.04.14 15:26 
Здравствуйте! Помогите, пожалуйста, разобраться с задачей. Сам я никак не въеду.

Имеется код параболика. Требуется на текущий график вывести индикатор старшего таймфрейма (например на графике М5 мы должны видеть расположение индикатора на М15, период меняется). Причем сделать это получается только с через iSAR с помощью iBarShift(NULL, TF,Time[b], false)

А вот как написать это в данном коде никак не пойму. В том виде, что привел ниже, попытался сделать просто через деление
max и step на таймфрейм. В итоге обработка идет по барам текущего таймфрейма, и результаты расчета не совпадают со старшим. А как рассчитать по барам старшего?


int TF= 15 ; // таймфрейм
   
   for(int b=Bars-2; b>=0; b--)  
      {
       if(b == Bars-2)
         {
          Bufer_ST[b] = Low[b] - 10.0 * Point;
          n_ST = 1;
          S_ST = step/TF;
          barA_ST = High[b];
          barB_ST = Low[b];
         }
       else
        {
         if(Close[b] > barA_ST)
           {
             barA_ST = Close[b];
               if (n_ST==1 && S_ST <= max/TF - step/TF)
                  { S_ST = S_ST + step/TF; }
             k_ST=1;
           }          
         if(Close[b] < barB_ST)
           {
            barB_ST = Close[b];
              if (n_ST == -1 && S_ST <= max/TF - step/TF)
                 { S_ST = S_ST + step/TF;}
            k_ST=2;
           }
        if (n_ST == 1)
           { Bufer_ST[b] = Bufer_ST[b + 1] + S_ST * (barA_ST - (Bufer_ST[b + 1]));}
       else
           { Bufer_ST[b] = Bufer_ST[b + 1] + S_ST * (barB_ST - (Bufer_ST[b + 1]));}
      
       if ((Bufer_ST[b+1] < Close[b + 1] && Bufer_ST[b] > Close[b]) || (Bufer_ST[b + 1] > Close[b + 1] && Bufer_ST[b] < Close[b]))
          {
           S_ST = step/TF;
             if (n_ST == 1)
                {Bufer_ST[b] = barA_ST;}
             else
                {Bufer_ST[b] = barB_ST;}
           barB_ST = Close[b];
           barA_ST = Close[b];
           n_ST = -1 * n_ST;
          }
        }
     }
Sergey Guliaev
2303
Sergey Guliaev 2012.04.15 05:41  
Вот так я сделал для стохастика.
Файлы:
Anton
52
Anton 2012.04.15 17:16  
valenok2003:
Вот так я сделал для стохастика.
Это тоже новое для меня. Я попробую разобрать Ваш код и сделать все на основе вашего кода. Думаю получится сделать то же самое с этим самодельным параболиком. Но будем надеяться все же, что это не единственный вариант.
Спасибо!
Anton
52
Anton 2012.04.15 17:52  
Все же результат тот же. Положение индикатора не соответствует положению на старшем таймфрейме. С встроенной функцией все ок, а с таким кодом думаю нет. Думаю, что без iBarShift здесь не обойтись, но как это сделать ума не приложу.
Anton
52
Anton 2012.04.23 18:59  

Двигаюсь в правильном направлении. В простом индикаторе такое получается, а в этом нет. Чего-то опять не учел... Не прорисовывает на старшем, не пойму, в чем проблема:

for (int i=Bars-2; i >= 0; i--)
   {   
       int st=iBarShift(NULL, TF,Time[i], true); 
       int ml = iBarShift(NULL, 0,  iTime(0,TF,st+1),  true); 
       
       int bars= iBars(NULL,TF); 
       double high= iHigh(NULL,TF,st);
       double low= iLow(NULL,TF,st);
       double close= iClose(NULL,TF,st); 
        
       if(i == Bars-2) 
         {     
          n_ST = 1;
          S_ST = step;
          barA_ST =  iClose(NULL,TF,st); 
          barB_ST =  iClose(NULL,TF,st);  
          Bufer_ST[i] = iLow(NULL,TF,st) - 10 * Point; 
         }
       else
        {     
         if(iClose(NULL,TF,st) > barA_ST) 
           {
             barA_ST = iClose(NULL,TF,st);
               if (n_ST==1 && S_ST <= max - step)
                  { S_ST = S_ST + step; }
           }          
         if(iClose(NULL,TF,st) < barB_ST) 
           {
            barB_ST = iClose(NULL,TF,st);  
              if (n_ST == -1 && S_ST <= max - step)
                 { S_ST = S_ST + step;}
           }
      //-------------  Формула:   
        if (n_ST == 1) // если бай
           { Bufer_ST[i] = Bufer_ST[ml] + S_ST * (barA_ST - (Bufer_ST[ml]));
           } 
       else
           { Bufer_ST[i] = Bufer_ST[ml] + S_ST * (barB_ST - (Bufer_ST[ml]));
           } 
       // если сигналит либо вниз либо вверх:
       if ((Bufer_ST[ml] < iClose(NULL,TF,st+1) && Bufer_ST[i] > iClose(NULL,TF,st)) || (Bufer_ST[ml] > iClose(NULL,TF,st+1) && Bufer_ST[i] < iClose(NULL,TF,st)))
          {
           S_ST = step;
           if (n_ST == 1)
              {Bufer_ST[i] = barA_ST;}
           else
              {Bufer_ST[i] = barB_ST;}
           barB_ST = iClose(NULL,TF,st);
           barA_ST = iClose(NULL,TF,st);
           n_ST = -1 * n_ST;
          }
        }
   }

Прошу спецов снизойти наконец к простым смертным )) А то чувствую, буду так колдыбаситься еще целый месяц над, наверное, простыми вещами (для кого-то).

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий