Вопрос....

 

Эксперт использует функции iCustom(...).

Один из индикаторов, использует информацию об открытых ордерах ( .......... OrderSelect(i, SELECT_BY_POS);  ........ OrderLots()......... и др.).

В реальных условиях - индикатор работает.

А вот при вызове из эксперта, в режиме тестера - он не получает ни какой информации о счете и ордерах.

Вопрос: это нормально?

Если да, то какой есть способ заставить индикатор работать в режиме тестера?

Или единственный способ - перенести код индикатора в эксперт?

Заранее огромное спасибо откликнувшимся!!!

 

iCustom(...) работает и в тестере.

Возможно, это какая-то ошибка, например, связанная с индексами.

 
SK. писал (а):

iCustom(...) работает и в тестере.

Возможно, это какая-то ошибка, например, связанная с индексами.

Да. В эксперте, используется несколько индикаторов. Все работают, за исключением индикатора, обращающегося к ордерам, он не получает ни какой информации об ордерах. Даже при передачи из индикатора Bid или Ask, они соответствуют последним данным сервера, но не моделируемым в тестере...

 

Если ошибка локализована, то, последовательно отсекая всё второстепенное, можно добраться ..

либо до ошибочной части кода, либо до вопроса разработчикам.

 

Спасибо Сергей, что даже в такое время отвечаете...

Перепробовал все, на что был способен. Но проблему так и не решил.

Отсек, в принципе, все.... Вот код индикатора:

------------------------------------------------------------------------------------------------------------------------- ИНДИКАТОР

#property indicator_chart_window
#property indicator_buffers 8

//---- indicator buffers
double ind0z[], ind1z[], ind2z[], ind3z[], ind4z[], ind5z[], ind6z[], ind7z[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexLabel(7,"ind7z");
SetIndexStyle(7, DRAW_NONE, STYLE_SOLID, 1, Black);
SetIndexBuffer(7,ind7z);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
ind7z[1]=Bid;  
ind7z[2]=Ask;
OrderSelect(1, SELECT_BY_POS);
ind7z[3]=OrderLots();
return(0);
}

------------------------------------------------------------------------------------------------------------------------------------

А в эксперте, индикатор вызывается вот так:

------------------------------------------------------------------------------------------------------------------------------------ КОД В ЭКСПЕРТЕ

string ind="test";
double a=iCustom( NULL, 0, ind, 7, 1);
double b=iCustom( NULL, 0, ind, 7, 2);
double c=iCustom( NULL, 0, ind, 7, 3);
-------------------------------------------------------------------------------------------------------------------------------------

В результате проблема остается таже....

При прогонке в тестере, в режиме визуализации, Bid и Ask или a и b остаются постоянными значениями, равными последним реальным  Bid и Ask полученным с сервера.

Даже при открытии ордеров - OrderLots() = 0.

-----

Еще раз зарание благодарю за ответ.

 
vizit:

А в эксперте, индикатор вызывается вот так:

------------------------------------------------------------------------------------------------------------------------------------ КОД В ЭКСПЕРТЕ

double a=iCustom( NULL, 0, ind, 7, 1);
-------------------------------------------------------------------------------------------------------------------------------------

При прогонке в тестере, в режиме визуализации, Bid и Ask или a и b остаются постоянными значениями, равными последним реальным Bid и Ask полученным с сервера.

Мне кажется причина в механизмах вызова iCustom. Скорее всего вызывая его даже из тестера, терминал обращается к стандартной процедуре перерасчета индикатора, которая, ничего не подозревая про режим тестирования, честно пересчитывает индикатор, но для текущего состояния терминала, а не тестера. Вот код индикатора который подтверждает эту мысль:

//+------------------------------------------------------------------+
//|                                                tester_tester.mq4 |
//|                          Copyright © 2006-2008, Sergey Kravchuk. |
//|                                         http://forextools.com.ua |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006-2008, Sergey Kravchuk."
#property link      "http://forextools.com.ua"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
 
double bClose[],bAsk[];
 
int init()
{
   IndicatorBuffers(2);
   IndicatorDigits(Digits);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(0,bClose);
   SetIndexBuffer(1,bAsk);
 }
 
int start()
{
  Comment(Ask+" "+Close[0]);
  bClose[0]=Close[0];
  bAsk[0]=Ask;
}

Коментарий и горизонтальная синяя линия Ask показывают, что Ask действительно не меняется и соответствует последней котировке. А вот Close[0] в тестере "честно" ездит по графику.

Очевидно решение вашей проблемы нужно искать в использовании в эксперте функции IsTesting(). Она должна скармливать индикатору параметр режима работы. В самом индикаторе придется написать распознавалку этого режима, и если это тестирование - назначать значение Ask = Close[0]; а Bid = Ask - Spread;

 
ForexTools:

Мне кажется причина в механизмах вызова . Скорее всего вызывая его даже из тестера, терминал обращается к стандартной процедуре перерасчета индикатора, которая, ничего не подозревая про режим тестирования, честно пересчитывает индикатор, но для текущего состояния терминала, а не тестера.

Коментарий и горизонтальная синяя линия Ask показывают, что Ask действительно не меняется и соответствует последней котировке. А вот Close[0] в тестере "честно" ездит по графику.

Очевидно решение вашей проблемы нужно искать в использовании в эксперте функции IsTesting(). Она должна скармливать индикатору параметр режима работы. В самом индикаторе придется написать распознавалку этого режима, и если это тестирование - назначать значение Ask = Close[0]; а Bid = Ask - Spread;

Спасибо за ответ, Сергей!!!

Я тоже пришел к такому решению, на счет Bid и Ask. Но Вы доказали, что эта проблема не только у меня. Теперь хоть время на её решение тратить не буду. А на счет информации об ордерах - придётся код переносить в эксперта...


 

К сожалению, да.

Bid и Ask в любом индикаторе берутся из последнего известного реала.

Причину назвать не могу.

// Proba_exp.mq4
int init()
   {
   Print("Proba_exp -----------------------------------------");
   }
int start()
   {
//--------------------------------------------------------------------
   static int eee = 0;
   eee++;
   if (eee<10)
      {
      Print("-- Proba_exp -----------  eee = ", eee);
      Print("Ask = ",Ask);
      Print("Bid = ",Bid);
      Print("High[0] = ",High[0]);
      Print("Low[0] = ",Low[0]);

      double a_ind=iCustom( NULL, 0, "Proba_ind", 7, 1);
      double b_ind=iCustom( NULL, 0, "Proba_ind", 7, 2);
      Print("a_ind = ",a_ind);
      Print("b_ind = ",b_ind);
      }
//--------------------------------------------------------------------
   return;   
   }

// Proba_ind.mq4

#property indicator_chart_window
#property indicator_buffers 8

double ind0z[], ind1z[], ind2z[], ind3z[], ind4z[], ind5z[], ind6z[], ind7z[];

int init()
   {
   SetIndexLabel(7,"ind7z");
   SetIndexStyle(7, DRAW_NONE, STYLE_SOLID, 1, Black);
   SetIndexBuffer(7,ind7z);
   return(0);
   }
int start()
   {
   ind7z[1]=Bid;  
   ind7z[2]=Ask;
   
   static int iii = 0;
   iii++;
   if (iii<10)
      {
      Print(".. Proba_ind ........... iii = ", iii);
      Print("Ask = ",Ask, "    ind7z[2] = ", ind7z[2]);
      Print("Bid = ",Bid, "    ind7z[1] = ", ind7z[1]);
      Print("High[0] = ",High[0]);
      Print("Low[0] = ",Low[0]);
      Print("........................");
      }
   return(0);   
   }

Эта связка даёт такие результаты:

-----------------------------------------
14:16:48 2008.05.14 06:17 Proba_exp EURUSD,M1: -- Proba_exp ----------- eee = 1
14:16:48 2008.05.14 06:17 Proba_exp EURUSD,M1: Ask = 1.5468
14:16:48 2008.05.14 06:17 Proba_exp EURUSD,M1: Bid = 1.5466
14:16:48 2008.05.14 06:17 Proba_exp EURUSD,M1: High[0] = 1.5466
14:16:48 2008.05.14 06:17 Proba_exp EURUSD,M1: Low[0] = 1.5466
14:16:48 2008.05.14 06:17 Proba_ind EURUSD,M1: loaded successfully
14:16:48 2008.05.14 06:17 Proba_ind EURUSD,M1: .. Proba_ind ........... iii = 1
14:16:48 2008.05.14 06:17 Proba_ind EURUSD,M1: Ask = 1.5554 ind7z[2] = 1.5554
14:16:48 2008.05.14 06:17 Proba_ind EURUSD,M1: Bid = 1.5552 ind7z[1] = 1.5552
14:16:48 2008.05.14 06:17 Proba_ind EURUSD,M1: High[0] = 1.5466
14:16:48 2008.05.14 06:17 Proba_ind EURUSD,M1: Low[0] = 1.5466
14:16:48 2008.05.14 06:17 Proba_ind EURUSD,M1: ........................
14:16:48 2008.05.14 06:17 Proba_exp EURUSD,M1: a_ind = 1.5552
14:16:48 2008.05.14 06:17 Proba_exp EURUSD,M1: b_ind = 1.5554
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: -- Proba_exp ----------- eee = 2
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Ask = 1.5469
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Bid = 1.5467
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: High[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Low[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: .. Proba_ind ........... iii = 2
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Ask = 1.5554 ind7z[2] = 1.5554
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Bid = 1.5552 ind7z[1] = 1.5552
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: High[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Low[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: ........................
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: a_ind = 1.5552
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: b_ind = 1.5554
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: -- Proba_exp ----------- eee = 3
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Ask = 1.5468
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Bid = 1.5466
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: High[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Low[0] = 1.5466
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: .. Proba_ind ........... iii = 3
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Ask = 1.5554 ind7z[2] = 1.5554
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Bid = 1.5552 ind7z[1] = 1.5552
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: High[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Low[0] = 1.5466
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: ........................
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: a_ind = 1.5552
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: b_ind = 1.5554
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: -- Proba_exp ----------- eee = 4
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Ask = 1.5469
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Bid = 1.5467
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: High[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Low[0] = 1.5466
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: .. Proba_ind ........... iii = 4
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Ask = 1.5554 ind7z[2] = 1.5554
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Bid = 1.5552 ind7z[1] = 1.5552
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: High[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Low[0] = 1.5466
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: ........................
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: a_ind = 1.5552
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: b_ind = 1.5554
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: -- Proba_exp ----------- eee = 5
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Ask = 1.5468
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Bid = 1.5466
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: High[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: Low[0] = 1.5466
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: .. Proba_ind ........... iii = 5
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Ask = 1.5554 ind7z[2] = 1.5554
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Bid = 1.5552 ind7z[1] = 1.5552
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: High[0] = 1.5467
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: Low[0] = 1.5466
14:16:48 2008.05.14 06:18 Proba_ind EURUSD,M1: ........................
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: a_ind = 1.5552
14:16:48 2008.05.14 06:18 Proba_exp EURUSD,M1: b_ind = 1.5554
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: -- Proba_exp ----------- eee = 6
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: Ask = 1.5469
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: Bid = 1.5467
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: High[0] = 1.5467
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: Low[0] = 1.5466
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: .. Proba_ind ........... iii = 6
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: Ask = 1.5554 ind7z[2] = 1.5554
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: Bid = 1.5552 ind7z[1] = 1.5552
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: High[0] = 1.5467
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: Low[0] = 1.5466
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: ........................
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: a_ind = 1.5552
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: b_ind = 1.5554
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: -- Proba_exp ----------- eee = 7
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: Ask = 1.5468
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: Bid = 1.5466
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: High[0] = 1.5467
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: Low[0] = 1.5466
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: .. Proba_ind ........... iii = 7
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: Ask = 1.5554 ind7z[2] = 1.5554
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: Bid = 1.5552 ind7z[1] = 1.5552
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: High[0] = 1.5467
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: Low[0] = 1.5466
14:16:50 2008.05.14 06:18 Proba_ind EURUSD,M1: ........................
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: a_ind = 1.5552
14:16:50 2008.05.14 06:18 Proba_exp EURUSD,M1: b_ind = 1.5554
14:16:50 2008.05.14 06:19 Proba_exp EURUSD,M1: -- Proba_exp ----------- eee = 8
14:16:50 2008.05.14 06:19 Proba_exp EURUSD,M1: Ask = 1.5469
14:16:50 2008.05.14 06:19 Proba_exp EURUSD,M1: Bid = 1.5467
14:16:50 2008.05.14 06:19 Proba_exp EURUSD,M1: High[0] = 1.5467
14:16:50 2008.05.14 06:19 Proba_exp EURUSD,M1: Low[0] = 1.5467
14:16:50 2008.05.14 06:19 Proba_ind EURUSD,M1: .. Proba_ind ........... iii = 8
14:16:50 2008.05.14 06:19 Proba_ind EURUSD,M1: Ask = 1.5554 ind7z[2] = 1.5554
14:16:50 2008.05.14 06:19 Proba_ind EURUSD,M1: Bid = 1.5552 ind7z[1] = 1.5552
14:16:50 2008.05.14 06:19 Proba_ind EURUSD,M1: High[0] = 1.5467
14:16:50 2008.05.14 06:19 Proba_ind EURUSD,M1: Low[0] = 1.5467
14:16:50 2008.05.14 06:19 Proba_ind EURUSD,M1: ........................
14:16:50 2008.05.14 06:19 Proba_exp EURUSD,M1: a_ind = 1.5552
14:16:50 2008.05.14 06:19 Proba_exp EURUSD,M1: b_ind = 1.5554
14:16:50 2008.05.14 06:20 Proba_exp EURUSD,M1: -- Proba_exp ----------- eee = 9
14:16:50 2008.05.14 06:20 Proba_exp EURUSD,M1: Ask = 1.547
14:16:50 2008.05.14 06:20 Proba_exp EURUSD,M1: Bid = 1.5468
14:16:50 2008.05.14 06:20 Proba_exp EURUSD,M1: High[0] = 1.5468
14:16:50 2008.05.14 06:20 Proba_exp EURUSD,M1: Low[0] = 1.5468
14:16:50 2008.05.14 06:20 Proba_ind EURUSD,M1: .. Proba_ind ........... iii = 9
14:16:50 2008.05.14 06:20 Proba_ind EURUSD,M1: Ask = 1.5554 ind7z[2] = 1.5554
14:16:50 2008.05.14 06:20 Proba_ind EURUSD,M1: Bid = 1.5552 ind7z[1] = 1.5552
14:16:50 2008.05.14 06:20 Proba_ind EURUSD,M1: High[0] = 1.5468
14:16:50 2008.05.14 06:20 Proba_ind EURUSD,M1: Low[0] = 1.5468
14:16:50 2008.05.14 06:20 Proba_ind EURUSD,M1: ........................
14:16:50 2008.05.14 06:20 Proba_exp EURUSD,M1: a_ind = 1.5552
14:16:50 2008.05.14 06:20 Proba_exp EURUSD,M1: b_ind = 1.5554
14:22:12 Proba_ind EURUSD,M1: removed
14:22:12 Proba_exp EURUSD,M1: removed
=========================================================

Индикатор честно работает с массивами и честно передаёт данные вызывающему его эксперту.

Проблема с доступом к историческим таймсериям тоже не возникает. В этой части всё в порядке.

Но спрашивая у терминала текущие тестерные котировки, индикатор получает в ответ текущие.

Такой результат получается и при кастомном вызове и при обычном набрасывании индикатора на чарт.

Эксперт в тестере работает как положено.

--

(вопрос доступа из индикатора к данным по ордерам здесь не рассматривался)

 

Но спрашивая у терминала текущие тестерные котировки, индикатор получает в ответ текущие.

А между прочим - сильно любопытнвй вывод получается. Правильно ли я резюмирую:

1. Тестер генерит "псевдо-тики" и далее по ним гонятся эксперт(Э) и/или индикатор(И).

2. Тайм-серии(High[],Low[],Close[],....) корректно работают и наполняются из псевдо-тиков и для Э и для И.

3. Предопределенные переменные же - Bid/Ask - правильно подаются тестером лишь для Э. Для И это всегда будут цифры с "нормального"(не-тестового) чарта.

Так все? Тогда это крайне важная(и, к сожалению, очередная), хорошо замаскированная в густой траве MQL-кодинга ГРАБЛЯ, поджидающая очередного программиста.

 

Вполне может оказаться, что я не проснулся ещё (просидел со вчера до утра) и чего-то не учёл в представленных рассуждениях.

А может я просто давно не занимался индикаторами и подзабыл что-то.. Очень хотелось бы ошибиться. 

 
SamMan:

3. Предопределенные переменные же - Bid/Ask - правильно подаются тестером лишь для Э. Для И это всегда будут цифры с "нормального"(не-тестового) чарта.

вот что написано в хелпе (Справочник MQL4 - Выполнение программ - Выполнение программ)

Скрипты и эксперты работают в собственном потоке. Пользовательские индикаторы работают в интерфейсном потоке. Если же пользовательский индикатор вызван при помощи функции iCustom(), то этот индикатор работает в потоке вызвавшей его программы.

Получается что индикатор, вызванный из эксперта, работающего в тестере должен работать в его же потоке и получать его данные в том числе и Ask и Bid и ..... Однако наши "исследования" показали что это не так.

Наверно стоит дождаться комментариев разработчиков. Пусть прояснят вопрос - им и коды в руки :)

Причина обращения: