Несовпадение графика индикатора и значений iCustom

 
Господа, подскажите пожалуйста, где я недогоняю.

1. График индикатора на тестере стратегий и значения iCustom этого индикатора местами не совпадают.
Причем график рисуется правильно, а iCustom возвращает неверные значения.
Пробовал на билдах 186 и 188

2. Как можно вывести свой график прямо из советника. А то пришлось стрелочками отделаться.

Безмерно благодарен.

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


//---- input parameters extern double cPTICo=85; extern double cStochCo=25; extern double Lots=1; // кол-во лотов в одной сделке extern double TakeProfit = 80; // начальный TakeProfit extern double InitStopLoss = 25; // начальный StopLoss double Points; datetime prevtime = 0; // время образовагия нового бара double iValue=0; int linenum=0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Points = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int cnt = 0; int total = 0; //---- проверки --------------------- if(Bars<100) { Print("На графике менее 100 баров"); return(0); // на графике менее 100 баров } // проверяем, что образовался новый бар, если бар старый - выходим if(prevtime == Time[0]) { return(0); } prevtime = Time[0]; //---- iValue = iCustom( NULL, 0, "Test_PTI1_2emp", cPTICo, cStochCo, 0, 0 ); ObjectCreate(StringConcatenate("object", linenum), OBJ_ARROW, 0, Time[0], iValue); linenum++; return(0); } //+------------------------------------------------------------------+
Файлы:
1.jpg  21 kb
 
какой режим и качество моделирования?
индюк считается на том ТФ где идёт тест, или на другом?
2. Как можно вывести свой график прямо из советника. А то пришлось стрелочками отделаться.
если в шаблоне tester.tpl нет ни одного индикатора, он должен сам нарисоваться
 
komposter:
какой режим и качество моделирования?
моделируется EUR_USD M15 по ценам открытия

индюк считается на том ТФ где идёт тест, или на другом?
на том же ТФ

если в шаблоне tester.tpl нет ни одного индикатора, он должен сам нарисоваться
Сам индикатор вырисовывается(красная сполошная линия), но я хотел вывести в виде графика возвращаемые значения iCustom (для сравнения).
Смог только стрелочками обозначить.
 
моделируется EUR_USD M15 по ценам открытия
качество? (в отчёте написано)

Сам индикатор вырисовывается(красная сполошная линия), но я хотел вывести в виде графика возвращаемые значения iCustom (для сравнения).
Смог только стрелочками обозначить.
кастум тоже должен рисоваться..

А для дальнейшего разбора надо код - так ничего нельзя сказать. ..

И ещё - можно попробовать вызывать кастум не на 0-м баре, а на 1-м - и сравнить.
 
komposter:
моделируется EUR_USD M15 по ценам открытия. качество? (в отчёте написано)
Качество - n/a

кастум тоже должен рисоваться..
Может и должен, но не рисуется.


А для дальнейшего разбора надо код - так ничего нельзя сказать. ..
И ещё - можно попробовать вызывать кастум не на 0-м баре, а на 1-м - и сравнить.
на 1-м баре тоже не всегда совпадает

ИНДИКАТОР

#property copyright "Copyright © 2006, Aksakal" #property link "http://www.sita.net" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red //---- input parameters extern double cPTICo=73; extern double cStochCo=25; //---- buffers double ExtMapBuffer1[]; int limit = 0; double curExtremum = 0; //+------------------------------------------------------------------+ //| Вспомагательные функции | //+------------------------------------------------------------------+ int loc_Sign(double value) // 1 при Value>0 // -1 при Value<0 // 0 при Value=0 { if (value > 0){return(1);} else{if (value < 0){return(-1);} else{return(0);} } } double loc_calcAdd(double stochVal, double Coef) // return value > 0 if ShochVal > 50 // return value < 0 if ShochVal < 50 { // Print("Stoch Value=", stochVal); return(MathSqrt(MathAbs(2*(0.5 - stochVal/100))) * Coef * loc_Sign(stochVal - 50)); } //+------------------------------------------------------------------+ //| индикатор //| //| prevValue - значение индикатора на предыдущем баре //| curExtremum - максимальное(минимальное) значение цены //+------------------------------------------------------------------+ double konkop_PTI1Stoch1(int CurBar, double prevValue) { double stochAdd; // сумма поправки вносимой по стохастику double value; // промежуточная переменная с результатом stochAdd = loc_calcAdd(iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,CurBar), cStochCo); if (prevValue <= Close[CurBar]) { // UpTrend if (curExtremum < Close[CurBar]) { curExtremum = Close[CurBar]; } value = curExtremum*(1-(cPTICo/100)); if (stochAdd < 0) { value = value + stochAdd; } return (value); }else{ // DownTrend if (curExtremum > Close[CurBar]) { curExtremum = Close[CurBar]; } value = curExtremum*(1+(cPTICo/100)); if (stochAdd > 0) { value = value + stochAdd; } return (value); } } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); //---- IndicatorShortName("PTI1_2e("+cPTICo+","+cStochCo+")"); //---- cPTICo=cPTICo/100; cStochCo=cStochCo/10000; //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- if(counted_bars < 0) return(-1); if(counted_bars >0) counted_bars--; limit = Bars - counted_bars; for(int i=limit; i>=0; i--) { ExtMapBuffer1[i] = konkop_PTI1Stoch1(i, ExtMapBuffer1[i+1]); } //---- return(0); }


ШАБЛОН ЭКСПЕРТА

#property copyright "Copyright © 2006, Aksakal" #property link "http://www.sita.net" //---- input parameters extern double cPTICo=85; extern double cStochCo=25; double Points; datetime prevtime = 0; // время образовагия нового бара int posbuy = -1; // куда была открыта последняя позиция 1 - BUY, 0 - SELL double iValue=0; int linenum=0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Points = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int cnt = 0; int total = 0; //---- проверки --------------------- if(Bars<100) { Print("На графике менее 100 баров"); return(0); // на графике менее 100 баров } // проверяем, что образовался новый бар, если бар старый - выходим if(prevtime == Time[0]) { return(0); } prevtime = Time[0]; //---- iValue = iCustom( NULL, 0, "Test_PTI1_2emp", cPTICo, cStochCo, 0, 1 ); ObjectCreate(StringConcatenate("object", linenum), OBJ_ARROW, 0, Time[1], iValue); linenum++; //---- операции ---------------- return(0); }
 
Качество - n/a
Я бы всё таки сделал бы 1-й бар
Режим моделирования - по ценам открытия. Это значит, что бар с индексом [0] состоит из одной котировки. Соответственно, индикатор в это время показывает не то значение, которое будет показывать на уже сформировавшемся баре.

Код, вроде бы правильный... Единственное, я бы сделал вот что:
ExtMapBuffer1[limit+1]=0; //мало ли, какое там значение до инициализации? а этот индекс используется ([i+1]) for(int i=limit; i>=0; i--) { ExtMapBuffer1[i] = konkop_PTI1Stoch1(i, ExtMapBuffer1[i+1]); }

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


Может и должен, но не рисуется.
в шаблоне tester.tpl точно нет никаких индикаторов?
 
komposter:

Я бы всё таки сделал бы 1-й бар
Режим моделирования - по ценам открытия. Это значит, что бар с индексом [0] состоит из одной котировки. Соответственно, индикатор в это время показывает не то значение, которое будет показывать на уже сформировавшемся баре.
Так последний пример и использует 1-й бар.


Код, вроде бы правильный... Единственное, я бы сделал вот что:
ExtMapBuffer1[limit+1]=0; //мало ли, какое там значение до инициализации? а этот индекс используется ([i+1]) for(int i=limit; i>=0; i--) { ExtMapBuffer1[i] = konkop_PTI1Stoch1(i, ExtMapBuffer1[i+1]); }
Спасибо. Учту. Хотя похоже, что просто ExtMapBuffer1[limit+1]=0; не прокатит. Надо проверку ставить. Подумаю как.


надо пробовать.
Контрольные значения для сравнения можно выводить в журнал.
Вывожу print'ом. Когда печатаю из индикатора - все правильно, с графиком совпадает. Печатаю - из советника значения iCustom - не совпадает.

в шаблоне tester.tpl точно нет никаких индикаторов?
Если это файл, то где он должен лежать?
У меня в каталогах трейдера такого файла вообще нет.
 
Спасибо. Учту. Хотя похоже, что просто ExtMapBuffer1[limit+1]=0; не прокатит. Надо проверку ставить. Подумаю как.
не надо проверок - можно просто ExtMapBuffer1[Bars-1]=0;

Вывожу print'ом. Когда печатаю из индикатора - все правильно, с графиком совпадает. Печатаю - из советника значения iCustom - не совпадает.
странно... вот ещё посмотрел - в индюке cPTICo=73;, а из эксперта вызывается cPTICo=85; - может, в этом дело?

Если это файл, то где он должен лежать?
У меня в каталогах трейдера такого файла вообще нет.
настраиваешь вид графика, как тебе нравиться. Потом нажимаешь на кнгопочку-меню "Шаблоны", "Сохранить", имя вводишь tester.tpl
После теста все графики будут открываться в этом виде

И ещё можно попробовать ф-цию HideTestIndicators() поставить в false. Я, правда, никогда не пользовался - не знаю...
 
не надо проверок - можно просто ExtMapBuffer1[Bars-1]=0;.
Красивое решение. Буду использовать, если с проблемой разберемся :)

странно... вот ещё посмотрел - в индюке cPTICo=73;, а из эксперта вызывается cPTICo=85; - может, в этом дело?
Поставил по 85. Не помогает.

настраиваешь вид графика, как тебе нравиться. Потом нажимаешь на кнгопочку-меню "Шаблоны", "Сохранить", имя вводишь tester.tpl
После теста все графики будут открываться в этом виде.
Полезная штуковина. Но на результаты тестера не влияет.

И ещё можно попробовать ф-цию HideTestIndicators() поставить в false. Я, правда, никогда не пользовался - не знаю.. .
Смысла нет - пусть показывается. Ведь идикатор рисуется правильно.
 
Тест на 186-м билде (евра Ш1, режим все тики)
Файлы:
test1.gif  18 kb
 
режим "По контрольным точкам:
Файлы:
test2.gif  18 kb
Причина обращения: