Помогите доработать индикатор.

 

Есть индикатор. Работает как тиковый, но рисует кривую по принципу: если тик вверх - прибавляет 1, если вниз - убавляет - 1. Начинает рисовать от нуля.

Нужно сделать чтобы начинал расчет с цены Bid (первое значение индикатора когда вешаем его на график) и прибавлял-убавлял 1 пункт (0,00001).

Сам не могу, не получается.

#property  indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red

double old_price;
double count_tick=0;
double x[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,x);
   SetIndexDrawBegin(0,0);
   IndicatorDigits(5);
   SetIndexLabel(0,"x");
   SetIndexShift(0,0);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() 
  {  
   double price;
   int i=0;
   int limit; 
   double delta;  
         
   int counted_bars=IndicatorCounted();   
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
 
   if(limit>0) limit=0;
  
   for(i=limit; i>=0; i--) 
   {     
    if(old_price==0) old_price=MarketInfo(Symbol(),MODE_BID);  
    price = MarketInfo(Symbol(),MODE_BID);
    delta = price - old_price;    
     //-- считаем "верхние" тики 
    if(delta>0) 
      {
       count_tick++;
       x[0]=count_tick;
      }     
     //-- считаем "нижние" тики
    if(delta<0) 
      {
       count_tick--;
       x[0]=count_tick;
      }
    if(delta==0) 
      {
       x[0]=count_tick;
      }
    for(int j=ArraySize(x)-1;j>=1;j--){x[j]=x[j-1];}        
        //----
    old_price=price; 
  }  
  return(0);
}
//----

Спасибо.

 
Может кто примеры подкинет?
 
Oleg Bondarev:

Есть индикатор. Работает как тиковый, но рисует кривую по принципу: если тик вверх - прибавляет 1, если вниз - убавляет - 1. Начинает рисовать от нуля.

Нужно сделать чтобы начинал расчет с цены Bid (первое значение индикатора когда вешаем его на график) и прибавлял-убавлял 1 пункт (0,00001).

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

 
Sergey Kolemanov:

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

Я это понимаю. Просто хочу сравнить с тиковым, а так мне удобнее.

 
Oleg Bondarev:

Я это понимаю. Просто хочу сравнить с тиковым, а так мне удобнее.

#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_type1  DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_width1 1


input uint Limit = 100;

double PriceBuffer[];
double Price[];
double prev_bid;
bool flag_start;
int arr_limit;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   SetIndexBuffer(0, PriceBuffer);
   SetIndexEmptyValue(0, 0.0);
   IndicatorSetInteger(INDICATOR_DIGITS, _Digits);
//---
   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[])
{
   double delta = 0;
   double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

   if(!flag_start)
   {
      if(Limit == 0 || (int)Limit >= rates_total)arr_limit = rates_total;
      else
      if((int)Limit < rates_total)arr_limit = (int)Limit;
      ArrayResize(Price, arr_limit);
      Price[0] = bid;
      prev_bid = bid;
      flag_start = true;
      return(0);
   }
   if(arr_limit > rates_total)
   {
      arr_limit = rates_total;
      ArrayResize(Price, arr_limit);
   }
   
   delta =  NormalizeDouble(bid - prev_bid, _Digits);
   if(delta > 0)Shift_Buffers(arr_limit, _Point);   //UP
   else
   if(delta < 0)Shift_Buffers(arr_limit, -_Point);  //DOWN
   prev_bid = bid;

//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+
//                                                                  //
//+------------------------------------------------------------------+
void Shift_Buffers(int limit, double value)
{
   ArrayCopy(Price, Price, 1, 0);
   Price[0] = Price[1] + value; 
   ArrayCopy(PriceBuffer, Price, 0, 0, arr_limit);
   if(PriceBuffer[limit - 1] != 0.0)PriceBuffer[limit - 1] = 0.0;
}
//+------------------------------------------------------------------+
 
Sergey Kolemanov:

Сергей, спасибо огромное! Попробую в понедельник.

 
Oleg Bondarev:

Сергей, спасибо огромное! Попробую в понедельник.

Можете в тестере проверить.

 
Sergey Kolemanov:

Можете в тестере проверить.

Не работает у меня. В режиме визуализации смотрел.
 
Oleg Bondarev:
Не работает у меня. В режиме визуализации смотрел.

Значит не правильно проверяете.У меня всё работает:

история должна быть загружена, М1, модель "все тики"

 
Sergey Kolemanov:

Значит не правильно проверяете.У меня всё работает:

история должна быть загружена, М1, модель "все тики"

Все работает, ступил я. Спасибо!