Скачать MetaTrader 5

Убрать пропуски в котировках в индикаторе

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
igrok333
65
igrok333  
Есть индикатор, показывает 2 графика. Но, как видно, один график запаздывает.
Почему это происходит. Потому что есть пропуски в котировках.

Как эти пропуски убрать?

Вот так заганяются данные в буфера.

int i;                                    
i=0;        
while(i<=a)                          
     {
      Buf_0[i]=iClose("#UKOIL",PERIOD_CURRENT,i);
      Buf_1[i]=iClose("#USOIL",PERIOD_CURRENT,i);
      i++;                      
     }
Нужно чтобы, если по одному из графиков за эту минутку нет котировки - чтобы данные в буфера не загружались, не по тому не по тому графику. То есть эту минутку пропускаем.
Как это можно сделать?

Может как-то использовать iTime?

Есть еще такой вариант - если котировка отсутствует, заполнять ее предыдущим значением.




Renat Akhtyamov
5220
Renat Akhtyamov  
igrok333:
 

int i; 

datetime tm;

int bs;

                                   
i=0;        
while(i<=a)                          
     {

      tm=iTime(Symbol(),Period(),i);

      bs=iBarShift("#UKOIL",Period(),tm);
      Buf_0[i]=iClose("#UKOIL",Period(),bs);

      bs=iBarShift("#USOIL",Period(),tm); 
      Buf_1[i]=iClose("#USOIL",Period(),bs);
      i++;                      
     }


попробуйте так
igrok333
65
igrok333  
Renat Akhtyamov:
попробуйте так
Скопировал ваш код и вставил в индикаторе вместо своего. Теперь картинка вот такая:


Спасибо!)))

... я не знал о функции iBarShift
Renat Akhtyamov
5220
Renat Akhtyamov  
igrok333:
Скопировал ваш код и вставил в индикаторе вместо своего. Теперь картинка вот такая:

Спасибо!)))

... я не знал о функции iBarShift

На здоровье

Это "синхронизация графиков по времени" местными словами.

igrok333
65
igrok333  
вариант с выбрасываниям бара, если нет по нему котировки:
int i;
int j=-1;
datetime tm;
int bs1, bs2;
                                  
i=0;        
while(i<=a)                          
     {
      j=j+1;
      tm=iTime(Symbol(),Period(),j);
      
      bs1=iBarShift(d,Period(),tm,true);
      bs2=iBarShift(e,Period(),tm,true);
      
      if (bs1==-1 || bs2==-1) continue;      
      
      Buf_0[i]=iClose(d,Period(),bs1);      
      Buf_1[i]=iClose(e,Period(),bs2);    
          
      i++;                      
     }
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий