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

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

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

//+------------------------------------------------------------------+ 
//|                                              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);
  }
//+------------------------------------------------------------------+
Alexey Volchanskiy
27275
Alexey Volchanskiy  
Tango_X:

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

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

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

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

Tango_X
717
Tango_X  
Alexey Volchanskiy:

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

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

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

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

Alexey Volchanskiy
27275
Alexey Volchanskiy  
Tango_X:

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

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

Tango_X
717
Tango_X  
Alexey Volchanskiy:

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

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

Sergey Savinkin
2104
Sergey Savinkin  
 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

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