Отображение пользовательского индикатора

 

Привет всем!

Сделал индикатор который отображает точками значения на несколько баров вперёд. Обновляется точки каждый новай бар на ТФ.

Но старые значения сохраняются. Как можно сделать, чтоба показывались только последние скажем 5(Step) значений.

Благодарю за помощь.

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Gold

extern int    Step=5;

#import "DLL_SQL.dll"
void InitConnection(string sStr);
void CloseConnection();
void RunSQL(string sStr);
double GetResult(string sStr);
double T4MBuffer[];
double LastRecievedValue;
int CurrentBar=0,LastMinute=0,PredictedValue=0;
#import
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,159);
   SetIndexBuffer(0,T4MBuffer);
   SetIndexShift(0,Step);
   InitConnection("Provider=SQLOLEDB.1;Persist Security Info=True;User ID=mt;Password=123456;Persist Security Info=True;Initial Catalog=xxxx;Data Source=127.0.0.1");
   return(0);
  }


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
  string str;
  int i,z;
  
      
      if(CurrentBar!=Bars){
       for(i=1;i<=Step;i++){ T4MBuffer[i]=0; } 
      
       for(i=1;i<=Step;i++){     
         str=GetResult(StringConcatenate("SELECT TOP "+i+" PredictedValue FROM  MT_predictions WHERE (symbol = \'", "GBPUSD" , "\') ORDER BY Datums DESC")); 
         T4MBuffer[i]=StrToDouble(str);
         LastRecievedValue=T4MBuffer[i];
       }//for
      CurrentBar=Bars;
     }//CurrentBar 
 
   return(0);
  }
 

Если все правильно понял:

1. То, что Вы написали рисует 5 баров назад - то есть в историю, а не экстраполяцию - то есть в будущее.

2. Наименьший индекс - не 1, а 0 - это индекс незавершенного бара.

3. Индикаторный буфер не сможет вывести информацию правее нулевого бара, поскольку для этого у него должен быть отрицательный индекс [-1] - это индекс бара, который будет за текущим.

Судя по вопросу, Вам нужны бары от [-1] до [-5]. Можно использовать объекты.

 
VladislavVG:

Судя по вопросу Вам нужны бары от [-1] до [-5]. Можно использовать объекты.

Можно сместить значения в буфере ([5]<-[0] ... [0]<-[-5], а затем сдвинуть график на 5 бар вправо

void SetIndexShift( int index, int shift)
Установка смещения линии индикатора относительно начала графика. При положительном значении изображение линии смещается вправо, при отрицательном - влево. Т.е. значение, рассчитанное на текущем баре, рисуется с указанным смещением относительно текущего бара.

 

Спасибо за ответ. Но всё рисуется вперёд. SetIndexShift(0,Step);

проблема в том, если от текущего бара нарисовалось 5 точек вперёд, я хочу чтобы когда образуется новый бар у меня мои точки стёрлись и нарисовались следующие 5 вперёд.

 
Leonid82:

Спасибо за ответ. Но всё рисуется вперёд. SetIndexShift(0,Step);

проблема в том, если от текущего бара нарисовалось 5 точек вперёд, я хочу чтобы когда образуется новый бар у меня мои точки стёрлись и нарисовались следующие 5 вперёд.


Ну так обновите в буфере все точки от Step до 0

а зачем вы точками отображаете? сделайте, например пунктир и не морочьтесь со значками, скажем, в нулевой буфер - вся история до 0-го бара линией, а в 1-й буфер Step значений пунктиром со смещением.

 

Я онуляю

for(i=1;i<=Step;i++){ T4MBuffer[i]=0; }

правильно?

а какой код у пунктира?

Спс

 
Leonid82:

Я онуляю

for(i=1;i<=Step;i++){ T4MBuffer[i]=0; }

правильно?


Вам нужно обнулить буфер на всей истории или, по крайней мере, в пределах видимости, а потом записать новые значения

от i=0, до i=Step;

и сдвинуть график на Step баров вправо

то-есть в сдвинутом буфере прогноза будет присутствовать всего Step значений.

а какой код у пунктира?


наберите в редактор - SetIndexStyle - наведите в редакторе курсор на это слово и нажмите <F1>

 
Точно, со смещением - проморгал. Коды линий : https://docs.mql4.com/ru/constants/drawstyles
 
valenok2003:

Вам нужно обнулить буфер на всей истории или, по крайней мере, в пределах видимости, а потом записать новые значения

от i=0, до i=Step;

и сдвинуть график на Step баров вправо

то-есть в сдвинутом буфере прогноза будет присутствовать всего Step значений.


SetIndexStyle - наведите курсор на код в редакторе и нажмите <F1>


Подскажите, как обнулить буфер на всей истории.

Спс

 
   for(i=Bars;i>=0;i--)                            
   { 
     Buff[i] = EMPTY_VALUE
   }

впрочем, не обязательно всю историю, достаточно обнулить последние заполненные значения, скажем Step+1 значений, только счёт начинайте не с единицы, как у вас здесь

for(i=1;i<=Step;i++){ T4MBuffer[i]=0; }
а с нуля, поскольку в буфере первый бар имеет нулевой индекс
 
merci :)