Дыры во времени

 
Люди, объясните, пожалуйста почему при наличии в эксперте выражения

dValueBig = iCustom(NULL,cBigTimeFrame,"i_PTI_3_10",cPTICoBig,cStochCoBig,cIndicatorTFBig,0,1);


появляются дыры во времени при тестировании?

2006.03.11 17:06:37 2006.03.08 15:58 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 15:58:00;
2006.03.11 17:06:37 2006.03.08 15:57 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 15:57:00;
2006.03.11 17:06:37 2006.03.08 15:56 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 15:56:00;
2006.03.11 17:06:36 2006.03.08 09:42 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:42:00;
2006.03.11 17:06:36 2006.03.08 09:41 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:41:00;
2006.03.11 17:06:36 2006.03.08 09:40 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:40:00;
2006.03.11 17:06:36 2006.03.08 09:39 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:39:00;
2006.03.11 17:06:36 2006.03.08 09:38 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:38:00;

Если выражение закомментировать, то как и ожидается, выводится информация за каждую минуту.

История на задействованных таймфреймах есть.
Моделирование по ценам открытия или по контрольным точкам.
MetaTrader 4 build 191.
 
Приведите полный код, пожалуйста. Без него очень сложно дать ответ.
 
Оказалось, что на другом компе дыры появляюся даже если закомментировать оба iCustom в эксперте.
Похоже, я что-то недопонимаю о работе с таймфреймами.

Сомневаюсь, что будет намного понятней :)

Индикатор
#property copyright "Copyright © 2006" #property link "https://www.metaquotes.net/" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red //---- input parameters extern double cPTICo=23; extern double cStochCo=17; extern int cTimeFrame=15; //---- buffers double ExtMapBuffer1[]; int limit = 0; int iTrend = 0; // Направление тренда (1 - вверх, -1 - низ, 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 { return(MathSqrt(MathAbs(2*(0.5 - stochVal/100))) * Coef * loc_Sign(stochVal - 50)); } //+------------------------------------------------------------------+ //| Мой индикатор | //| //| prevValue - значение индикатора на предыдущем баре //| curExtremum - максимальное(минимальное) значение цены //+------------------------------------------------------------------+ double konkop_PTI1Stoch1(int CurBar) { double stochAdd = 0; // сумма поправки вносимой по стохастику double value; // промежуточная переменная с результатом double prevValue = 0; stochAdd = loc_calcAdd(iStochastic(NULL,cTimeFrame,5,3,3,MODE_SMA,0,MODE_MAIN,iBarShift( NULL, cTimeFrame, Time[CurBar])+1), cStochCo); prevValue = ExtMapBuffer1[CurBar]; if ((prevValue < Close[CurBar]) || (prevValue == Close[CurBar] && iTrend == 1)) { // UpTrend iTrend = 1; if (curExtremum < Close[CurBar]) { curExtremum = Close[CurBar]; } value = curExtremum*(1-(cPTICo/100)); if (stochAdd < 0) { value = value + stochAdd; } return (value); } if ((prevValue > Close[CurBar]) || (prevValue == Close[CurBar] && iTrend == -1)) { // DownTrend iTrend = -1; 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("i_PTI_3_10("+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); limit = Bars - counted_bars; for(int i=limit; i>0; i--) { ExtMapBuffer1[i] = konkop_PTI1Stoch1(i+1); } //---- return(0); } //+------------------------------------------------------------------+


Эксперт

#property copyright "Copyright © 2006" #property link "https://www.metaquotes.net/" //---- input parameters extern double cBigTimeFrame = 15; // больший таймфрейм extern double cPTICoSmall = 23; extern double cStochCoSmall = 17; extern double cIndicatorTFSmall = 15; // таймфрейм на котором считается поправка cStochCoSmall extern double cPTICoBig = 57; extern double cStochCoBig = 40; extern double cIndicatorTFBig = 240; // таймфрейм на котором считается поправка cStochCoBig extern double cTakeProfit = 500; // начальный TakeProfit extern double cInitStopLoss = 50; // начальный StopLoss extern double cCheckInterval = 30; // кол-во секунд между выполнением алгоритма extern double cLots = 1; // кол-во лотов в одной сделке double dPoints; datetime tPrevtimeSmall = 0; // время образовагия нового бара datetime tPrevtimeBig = 0; // время образовагия нового бара double dValueSmall = 0; double dPrevValueSmall = 0; double dValueBig = 0; double dPrevValueBig = 0; bool bNoLoss = false; int iLastDirection = 0; // куда была открыта последняя позиция 1 - BUY, 0 - SELL int iLastOrderTicket = 0; int iCntTime = 1; // счетчик для цикла повторных проверок внутри бара //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- dPoints = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int iCnt = 0; int iTotal = 0; double dPriceTmp = 0; datetime tDateTmp; //---- проверки --------------------- if(Bars<100) { Print("На графике менее 100 баров"); return(0); // на графике менее 100 баров } // Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig); if(tPrevtimeSmall == Time[0]){ if((tPrevtimeSmall + cCheckInterval * iCntTime) >= CurTime()){ // если не прошло tCheckInterval секунд с прошлой проверки - выходим return(0); }else{ iCntTime++; } }else{ // образовался новый бар на малом таймфрейме tPrevtimeSmall = Time[0]; iCntTime = 1; dPrevValueSmall = dValueSmall; tDateTmp = iTime(NULL, cBigTimeFrame, 0); if(tPrevtimeBig != tDateTmp){ // образовался новый бар на большом таймфрейме tPrevtimeBig = tDateTmp; dPrevValueBig = dValueBig; Print("_: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; tDateTmp = ", TimeToStr(tDateTmp,TIME_DATE|TIME_SECONDS)); dValueBig = iCustom(NULL,cBigTimeFrame,"i_PTI_3_10",cPTICoBig,cStochCoBig,cIndicatorTFBig,0,1); } } Print("2: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig); //---- dValueSmall = iCustom( NULL, 0, "i_PTI_3_10", cPTICoSmall, cStochCoSmall, cIndicatorTFSmall, 0, 1 ); //---- // Дальше пошло управление торгами //---- return(0); }
 
Все дело в куске:
if(tPrevtimeSmall == Time[0]){ if((tPrevtimeSmall + cCheckInterval * iCntTime) >= CurTime()){ // если не прошло tCheckInterval секунд с прошлой проверки - выходим return(0);
Вы же сами не доходите до печати и выходите по return !
Раскомментируйте строку и проверьте еще раз, пожалуйста:
// Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig);

Кстати, отсутствие правильного выравнивания и структурности фигурных скобок Вас часто будет подводить. Если так оформлять код, то даже собственных ошибок видно не будет :)
 
Renat:

Раскомментируйте строку и проверьте еще раз, пожалуйста:
// Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig);
Немного изменил изменил строку вывода и раскомментровал.
На разных данных - результаты разные, но дыры есть везде:

2006.03.14 19:33:30 2006.03.08 10:50 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.08 10:50:00; CurTime() = 2006.03.08 10:50:00
2006.03.14 19:33:30 2006.03.08 10:49 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 10:49:00; dValueSmall = 1.1876; dValueBig = 1.1938
2006.03.14 19:33:30 2006.03.08 10:49 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.08 10:49:00; CurTime() = 2006.03.08 10:49:00
2006.03.14 19:33:04 2006.03.08 07:03 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.08 07:03:00; CurTime() = 2006.03.08 07:03:00
2006.03.14 19:33:04 2006.03.08 07:02 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 07:02:00; dValueSmall = 1.1903; dValueBig = 1.1938
2006.03.14 19:33:04 2006.03.08 07:02 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.08 07:02:00; CurTime() = 2006.03.08 07:02:00

2006.03.14 19:48:38 2006.03.09 09:16 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.09 09:16:00; dValueSmall = 1.1901; dValueBig = 1.1955
2006.03.14 19:48:38 2006.03.09 09:16 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.09 09:16:00; CurTime() = 2006.03.09 09:16:00
2006.03.14 19:48:38 2006.03.09 09:15 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.09 09:15:00; dValueSmall = 1.1901; dValueBig = 1.1955
2006.03.14 19:48:31 2006.03.09 06:22 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.09 06:22:00; CurTime() = 2006.03.09 06:22:00
2006.03.14 19:48:31 2006.03.09 06:21 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.09 06:21:00; dValueSmall = 1.19; dValueBig = 1.1965
2006.03.14 19:48:31 2006.03.09 06:21 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.09 06:21:00; CurTime() = 2006.03.09 06:21:00

И уж совсем непонятное, когда второй вывод есть, а первого НЕТ =-O

2006.03.14 20:44:38 2006.03.10 21:09 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.10 21:09:00; dValueSmall = 1.1908; dValueBig = 1.1952
2006.03.14 20:44:38 2006.03.10 21:09 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.10 21:09:00; CurTime() = 2006.03.10 21:09:00
2006.03.14 20:44:38 2006.03.10 21:08 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.10 21:08:00; dValueSmall = 1.1908; dValueBig = 1.1952
2006.03.14 20:44:38 2006.03.10 19:55 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.10 19:55:00; dValueSmall = 1.1898; dValueBig = 1.195
2006.03.14 20:44:38 2006.03.10 19:55 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.10 19:55:00; CurTime() = 2006.03.10 19:55:00
2006.03.14 20:44:38 2006.03.10 19:54 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.10 19:54:00; dValueSmall = 1.1898; dValueBig = 1.195

А вот еще упростил эксперт

#property copyright "Copyright © 2006" #property link "https://www.metaquotes.net/" //---- input parameters extern double cBigTimeFrame = 15; // больший таймфрейм extern double cPTICoSmall = 23; extern double cStochCoSmall = 17; extern double cIndicatorTFSmall = 15; // таймфрейм на котором считается поправка cStochCoSmall extern double cPTICoBig = 57; extern double cStochCoBig = 40; extern double cIndicatorTFBig = 240; // таймфрейм на котором считается поправка cStochCoBig extern double cTakeProfit = 500; // начальный TakeProfit extern double cInitStopLoss = 50; // начальный StopLoss extern double cCheckInterval = 30; // кол-во секунд между выполнением алгоритма extern double cLots = 1; // кол-во лотов в одной сделке double dPoints; datetime tPrevtimeSmall = 0; // время образовагия нового бара datetime tPrevtimeBig = 0; // время образовагия нового бара double dValueSmall = 0; double dPrevValueSmall = 0; double dValueBig = 0; double dPrevValueBig = 0; bool bNoLoss = false; int iLastDirection = 0; // куда была открыта последняя позиция 1 - BUY, 0 - SELL int iLastOrderTicket = 0; int iCntTime = 1; // счетчик для цикла повторных проверок внутри бара //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- dPoints = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int iCnt = 0; int iTotal = 0; double dPriceTmp = 0; datetime tDateTmp; //---- проверки --------------------- if(Bars<100) { Print("На графике менее 100 баров"); return(0); // на графике менее 100 баров } Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; CurTime() = ", TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS)); if(tPrevtimeSmall == Time[0]){ }else{ // образовался новый бар на малом таймфрейме tPrevtimeSmall = Time[0]; iCntTime = 1; dPrevValueSmall = dValueSmall; tDateTmp = iTime(NULL, cBigTimeFrame, 0); if(tPrevtimeBig != tDateTmp){ // образовался новый бар на большом таймфрейме tPrevtimeBig = tDateTmp; dPrevValueBig = dValueBig; Print("_: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; tDateTmp = ", TimeToStr(tDateTmp,TIME_DATE|TIME_SECONDS)); dValueBig = iCustom(NULL,cBigTimeFrame,"i_PTI_3_10",cPTICoBig,cStochCoBig,cIndicatorTFBig,0,1); } } Print("2: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig); //---- dValueSmall = iCustom( NULL, 0, "i_PTI_3_10", cPTICoSmall, cStochCoSmall, cIndicatorTFSmall, 0, 1 ); //---- // return(0); }


Всеравно есть дыры.

Зато дыры пропадают, если закометить,

dValueBig = iCustom(NULL,cBigTimeFrame,"i_PTI_3_10",cPTICoBig,cStochCoBig, cIndicatorTFBig,0,1);

Похоже, что iCustom очень криво обрабатывает другие таймфреймы.

Renat:

Кстати, отсутствие правильного выравнивания и структурности фигурных скобок Вас часто будет подводить. Если так оформлять код, то даже собственных ошибок видно не будет :)
Где-то есть стандарт по форматированию кода MQL4? :)
Если серьезно, то когда человек работает не в команде он имеет полное право
использовать стиль кодирования, который его больше устраивает.
 
Все таки Вам надо еще поискать - дыр не должно быть.

Где-то есть стандарт по форматированию кода MQL4? :)
Если серьезно, то когда человек работает не в команде он имеет полное право
использовать стиль кодирования, который его больше устраивает.
И тогда другие при прочтении имеют полное право указать на нечитаемость кода?
 
Renat:
Все таки Вам надо еще поискать - дыр не должно быть.
Поискать где?

И тогда другие при прочтении имеют полное право указать на нечитаемость кода?
На нечитаемость - да. На неверность кода - нет.
 
Какая разница, aksakal , есть там ошибка или нет?
Главное, чтобы сам мог прочитать свой код, а остальные пусть идут цветок нюхают .
 
Да простят меня разработчики, что я не поддерживаю их безоговорочную веру в программу, но работает она КРИВО.
Например: элементарный индикатор и эксперт, а дыры всеравно есть.
Причем замена в индикаторе
ExtMapBuffer1[i] = konkop_PTI1Stoch1(1);
на
ExtMapBuffer1[i] = 1;
дыры уберает.


Индикатор
#property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Indigo //---- input parameters extern int Param1=0; //---- buffers double ExtMapBuffer1[]; int limit = 0; double konkop_PTI1Stoch1(int CurBar) { return(1); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- if(counted_bars < 0){ return(-1); } limit = Bars - counted_bars; for(int i=limit; i>0; i--) { ExtMapBuffer1[i] = konkop_PTI1Stoch1(1); } //---- return(0); } //+------------------------------------------------------------------+


Эксперт
extern double cBigTimeFrame = 15; // больший таймфрейм double dPoints; datetime tPrevtimeSmall = 0; // время образовагия нового бара datetime tPrevtimeBig = 0; // время образовагия нового бара double dValueSmall = 0; double dValueBig = 0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- dPoints = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int iCnt = 0; int iTotal = 0; double dPriceTmp = 0; datetime tDateTmp; //---- проверки --------------------- if(Bars<100) { Print("На графике менее 100 баров"); return(0); // на графике менее 100 баров } Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; CurTime() = ", TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS)); if(tPrevtimeSmall != Time[0]){ // образовался новый бар на малом таймфрейме tPrevtimeSmall = Time[0]; tDateTmp = iTime(NULL, cBigTimeFrame, 0); if(tPrevtimeBig != tDateTmp){ // образовался новый бар на большом таймфрейме tPrevtimeBig = tDateTmp; Print("_: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; tDateTmp = ", TimeToStr(tDateTmp,TIME_DATE|TIME_SECONDS)); dValueBig = iCustom(NULL, cBigTimeFrame, "i_empty1", 0, 0, 1); } } Print("2: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig); //---- dValueSmall = iCustom(NULL, 0, "i_empty1", 0, 0, 1); //---- // return(0); }
 
Правильно, не верь никому, сам копай. Могу только сказать где - в коде индикатора.
 
Rosh:
Правильно, не верь никому, сам копай. Могу только сказать где - в коде индикатора.
В индикаторе? Хи-хи. А если и такой код дыры возвращает? Все равно в индикаторе?

#property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Indigo //---- input parameters extern int Param1=0; //---- buffers double ExtMapBuffer1[]; int limit = 0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); //---- return(0); } //+------------------------------------------------------------------+ //| Custom 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] = 1; } //---- return(0); } //+------------------------------------------------------------------+
Причина обращения: