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.
-----
Еще раз зарание благодарю за ответ.
А в эксперте, индикатор вызывается вот так:
------------------------------------------------------------------------------------------------------------------------------------ КОД В ЭКСПЕРТЕ
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;
Мне кажется причина в механизмах вызова . Скорее всего вызывая его даже из тестера, терминал обращается к стандартной процедуре перерасчета индикатора, которая, ничего не подозревая про режим тестирования, честно пересчитывает индикатор, но для текущего состояния терминала, а не тестера.
Коментарий и горизонтальная синяя линия 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-кодинга ГРАБЛЯ, поджидающая очередного программиста.
Вполне может оказаться, что я не проснулся ещё (просидел со вчера до утра) и чего-то не учёл в представленных рассуждениях.
А может я просто давно не занимался индикаторами и подзабыл что-то.. Очень хотелось бы ошибиться.
3. Предопределенные переменные же - Bid/Ask - правильно подаются тестером лишь для Э. Для И это всегда будут цифры с "нормального"(не-тестового) чарта.
вот что написано в хелпе (Справочник MQL4 - Выполнение программ - Выполнение программ)
Скрипты и эксперты работают в собственном потоке. Пользовательские индикаторы работают в интерфейсном потоке. Если же пользовательский индикатор вызван при помощи функции iCustom(), то этот индикатор работает в потоке вызвавшей его программы.
Получается что индикатор, вызванный из эксперта, работающего в тестере должен работать в его же потоке и получать его данные в том числе и Ask и Bid и ..... Однако наши "исследования" показали что это не так.
Наверно стоит дождаться комментариев разработчиков. Пусть прояснят вопрос - им и коды в руки :)

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Эксперт использует функции iCustom(...).
Один из индикаторов, использует информацию об открытых ордерах ( .......... OrderSelect(i, SELECT_BY_POS); ........ OrderLots()......... и др.).
В реальных условиях - индикатор работает.
А вот при вызове из эксперта, в режиме тестера - он не получает ни какой информации о счете и ордерах.
Вопрос: это нормально?
Если да, то какой есть способ заставить индикатор работать в режиме тестера?
Или единственный способ - перенести код индикатора в эксперт?
Заранее огромное спасибо откликнувшимся!!!