mql5: OnCalculate разница цен закрытия каждого индикатора бара - PullRequest
0 голосов
/ 18 марта 2019

Я довольно новичок в mql5 и пытаюсь создать индикатор, что я хочу, это просто, но мне кажется, что-то упущено из этого.

Я хочу сравнить цену закрытия 2баров в минуту, если оно больше определенного значения, оно добавляет 1 к индикатору (Массив?)

Так скажем

Бар A-1 закрывается на 1,555

Бар A закрывается в 1.455

каждый 0.01, он добавляет 1 к индикатору бара, следовательно, должен быть бар со значением 10.

#property copyright "Copyright 2011, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00" 
  
#property indicator_separate_window 
#property indicator_buffers 4 
#property indicator_plots   1 
//--- plot Bars 
#property indicator_label1  "Bars" 
#property indicator_type1   DRAW_BARS 
#property indicator_color1  clrGreen 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  5

#property indicator_maximum 5
#property indicator_minimum 0.000


//--- input parameter 
input int      pip=100;         // Number of pip  
//--- An indicator buffer for the plot 
double         LineBuffer[]; 

//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- Binding an array and an indicator buffer 
   SetIndexBuffer(1,LineBuffer,INDICATOR_DATA); 
//--- Initializing the generator of pseudo-random numbers 

//--- 
   return(INIT_SUCCEEDED); 
  } 
//+------------------------------------------------------------------+ 
//| 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[]) 
  { 

  
//--- Block for calculating indicator values 
   for(int i=0;i<rates_total;i++) 
     { 
      if(i>= 1 && (close[i] - close[i-1] >= pip*_Point))
      {
      LineBuffer[i]=1;
      }
     } 
  
//--- return value of prev_calculated for next call
   return(rates_total); 
  } 

все же, когда я тестировал его, кажется, что close [i] вызывается каждый тик вместо каждого бара, и я не могу получить индикатор LineBuffer, чтобы показатьразница между close [i] и close [i-1] (поэтому я прикрепил его к 1, чтобы получить показатель, он имеет разницу больше, чем значение, называемое pip)

1 Ответ

0 голосов
/ 19 марта 2019

Зачем вам нужно 4 буфера?

При вызове `SetIndexBuffer 'присваивайте идентификаторы буфера по одному, начиная с нуля.

Действительно, он вызывается для каждого бара, потому что вы выполняете цикл из бараОт # 0 до rates_total, если вам нужно вызывать его один раз для бара, сравните prev_calculated' or use datetime lastCandleClosed and check whether time [rate_total-1]> lastCandleClosed 'для запуска логики нового бара.

Byкстати как тебе удается звонить close[i-1] когда i=0?Я полагаю, у вас есть критическая ошибка.

...