функция OnCalculate и OnTick

 

Здравствуйте , уважаемые программисты. 

Подскажите пожалуйста , почему и по какому принципу работают 2-е эти функции. А конкретние  меня интересует следующий вопрос.

 OnCalculate - Эта функция работает от послупнения нового тика. Но если начать считать тики , то их получиться больше чем в  функции OnTick.

 Например в виде подсчета возьмем вот этот код.

 

static int t;

t++; 

Alert("Количество тиков -  ",t); 

Если поставить на график  советник , в котором   реализован этот код в  OnTick  и одновременно или почти одновременно , установить на на этот же график индикатор , в котором будет реализован этот код в OnCalculate , то спустя некоторое время , значения будут разные.

в  индикаторе значение будет больше , чем в советнике.

Мое предположение что индикатор будет считать  вот  так -   цена 100  -  произошел тик стало 110 - Индикатор посчитал что прошло 10 тиков.
Советник считает так - цена 100 - произошел тик стало 110 - советник посчитал что прошел 1 тик.
    

Спасибо за ответ всем кто поможет разобраться в этом. 

 

OnCalculate может вызываться, например, при подкачке истории.

Но если не брать во внимание возможные пропуски тиков, то в долгосрочной перспективе счетчики индикатора и эксперта должны показывать примерно одно и то же (+/- 2%).

Оставьте своих подопытных на несколько часов, а потом поделитесь результатами (кодом и распечатками).

 

Предположение, выделенное синим, неверно. 

 
komposter:

OnCalculate может вызываться, например, при подкачке истории.

Но если не брать во внимание возможные пропуски тиков, то в долгосрочной перспективе счетчики индикатора и эксперта должны показывать примерно одно и то же (+/- 2%).

Оставьте своих подопытных на несколько часов, а потом поделитесь результатами (кодом и распечатками).

 

Предположение, выделенное синим, неверно. 

Хорошо, проверю еще .И постараюсь выложить максимум информации.
 

 Начали отсчет

2013.10.24 20:21:49 Experts777 (EURUSD.e,H1) Количество тиков от советника -  7

2013.10.24 20:21:49 Indicators777 (EURUSD.e,H1) Количество тиков от индикатора - 11

 

Закончили отсчет.

2013.10.24 20:23:09 Indicators777 (EURUSD.e,H1) Количество тиков от индикатора - 327

2013.10.24 20:23:09 Experts777 (EURUSD.e,H1) Количество тиков от советника -  120

 Код индикатора :

#property link      "http://www.mql5.com"

#property version   "1.00"

#property indicator_chart_window

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int OnInit()

  {

//--- indicator buffers mapping

   

//---

   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[])

  {

//---

static int t;


t++; 


Print("Количество тиков от индикатора - ",t);    

   

   

   

   

//--- return value of prev_calculated for next call

   return(rates_total);

  }

//+------------------------------------------------------------------+


   

   Код советника:

 #property link      "http://www.mql5.com"

#property version   "1.00"

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

  {

//---

   

//---

   return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

//---

   

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

static int t;


t++; 


Alert("Количество тиков от советника -  ",t);   

   

  }

//+------------------------------------------------------------------+

   

   



 

 

Разница почти в 3 раза. Причем советник был установлен на 4 тика раньше.

 

Кто  что может сказать по этому поводу?



 
Думаю, здесь (пост Renata) все ясно сказано: когда терминал посчитает нужным. OnCalculate зависит не только от тиков.
 
Scriptong:
Думаю, здесь (пост Renata) все ясно сказано: когда терминал посчитает нужным. OnCalculate зависит не только от тиков.
Спасибо за отзыв.
 

Нет, разница в 200 вызовов за 2 минуты - многовато.

А что будет, если на несколько часов оставить?

И есть ли сообщения о реконнектах в журнале?

 
У этого символа есть реальный стакан цен?
 
komposter:

Нет, разница в 200 вызовов за 2 минуты - многовато.

А что будет, если на несколько часов оставить?

И есть ли сообщения о реконнектах в журнале?

Попробую с понедельника на несколько часов поставить счетчик.

А насчет реконнектов  , при тестировании не замечал их.

 
MetaQuotes:
У этого символа есть реальный стакан цен?
Стакан цен есть.Правда пока еще не знаю насколько он реальный.   Счет Demo RoboForexECN .
 
Если советник обрабатывает тик долго, а может вы сами там организовали задержку функцией Sleep. то пришедшие в это время тики будут пропущены. Индикатор же специально так построен, чтобы не пропускать тики. Можно очень большую разницу накопить.
Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Общие функции / Sleep - Документация по MQL5