Скачать MetaTrader 5

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

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

Привет всем!

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

Но старые значения сохраняются. Как можно сделать, чтоба показывались только последние скажем 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);
  }
Vladyslav Goshkov
2146
Vladyslav Goshkov  

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

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

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

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

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

Sergey Guliaev
2301
Sergey Guliaev  
VladislavVG:

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

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

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

chemical1
238
chemical1  

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

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

Sergey Guliaev
2301
Sergey Guliaev  
Leonid82:

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

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


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

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

chemical1
238
chemical1  

Я онуляю

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

правильно?

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

Спс

Sergey Guliaev
2301
Sergey Guliaev  
Leonid82:

Я онуляю

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

правильно?


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

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

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

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

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


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

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

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

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

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

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


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


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

Спс

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

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

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