Вопрос по алгоритму на примере простенького индикатора

 

Здравствуйте! как сделать чтобы цикл выполнялся на каждом тике, а не баре как в примере ниже. Весь день ломаю голову, помогите!

//+------------------------------------------------------------------+ 
//|                                              TestCopyBuffer.mq5  | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                             https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00"
#property indicator_separate_window 

#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "ma"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

double                   MABuffer[],_MABuffer[];
int                      handle_ma;

datetime                 gdt_BarOpenTime;
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit()
  {
   handle_ma=iMA(Symbol(),0,15,0,MODE_EMA,PRICE_CLOSE);
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   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[])
  {
   if(BarsCalculated(handle_ma)<rates_total) return(0);

   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<=0)
     {
      to_copy=rates_total-1;
      gdt_BarOpenTime=0;
     }
   else
     {
      to_copy=rates_total-prev_calculated+1; // кол-во копируемых данных 
     }

   if(gdt_BarOpenTime!=time[rates_total-1])
     {
      CopyBuffer(handle_ma,0,1,to_copy,_MABuffer);

      CopyBuffer(handle_ma,0,1,to_copy,MABuffer);
      MABuffer[rates_total-1]=EMPTY_VALUE;
      gdt_BarOpenTime=time[rates_total-1];
     }
     
   for(int i=1; i<to_copy && !IsStopped();i++) // ЭТОТ ЦИКЛ ДОЛЖЕН ВЫПОЛНЯТСЯ НА КАЖДОМ ТИКЕ
     {
      Print(rates_total-1," ",i," 2-ой бар ",DoubleToString(_MABuffer[i-1],6),
                                " 1-ый бар ",DoubleToString(_MABuffer[i],6));
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Tango_X:

Здравствуйте! как сделать чтобы цикл выполнялся на каждом тике, а не баре как в примере ниже. Весь день ломаю голову, помогите!

Задача довольно трудоемкая. Во первых, надо сделать свой тиковый индикатор МА, сейчас вы используете стандартный, там минимальное время расчета - 1 бар.

Тиковые данные можно достать через CopyTicks

Когда будет тиковый МА, можно будет обрабатывать тиковые данные

 
Alexey Volchanskiy:

Задача довольно трудоемкая. Во первых, надо сделать свой тиковый индикатор МА, сейчас вы используете стандартный, там минимальное время расчета - 1 бар.

Тиковые данные можно достать через CopyTicks

Когда будет тиковый МА, можно будет обрабатывать тиковые данные

Ма данные я получаю на новом баре и то только последние два бара это 1-ый и второй бар, нулевой не нужен, но я хочу получать цену на каждом тике, Ма тут не при чем. Т.е. значения индикатора я хочу считывать на новом баре, а цену на каждом тике

 
Tango_X:

Ма данные я получаю на новом баре и то только последние два бара это 1-ый и второй бар, нулевой не нужен, но я хочу получать цену на каждом тике, Ма тут не при чем. Т.е. значения индикатора я хочу считывать на новом баре, а цену на каждом тике

Так у вас OnCalculate и так вызывается на каждом тике. Что еще нужно, напишите подробнее, я не понимаю.

 
Alexey Volchanskiy:

Так у вас OnCalculate и так вызывается на каждом тике. Что еще нужно, напишите подробнее, я не понимаю.

Цикл , который я выделил жирным шрифтом, выполняется на каждом новом баре, но не на каждом тике. Не могу придумать алгоритм как сделать выполнение этого цикла на каждом тике. 

 
 to_copy=rates_total-prev_calculated+1; // кол-во копируемых данных 
     
 for(int i=1; i<to_copy && !IsStopped();i++) // ЭТОТ ЦИКЛ ДОЛЖЕН ВЫПОЛНЯТСЯ НА КАЖДОМ ТИКЕ

Похоже, вот в чем дело.

Когда появляется новый барto_copy = 2. Цикл выполняется один раз.

А когда тики идут на текущем баре (rates_total == prev_calculated), то в цикле Вы пишете i<to_copy, то есть, с 1 до меньше 1. Цикл не выполняется вообще. Поменяйте на i<=to_copy