Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 617

 

Попробовал разные варианты. Результат одни и тот же. Как такое может быть абсолютно не понятно. В какой-то момент конгструкция iLowest(NULL,0,MODE_LOW,NumberLastBar_beg,NumberLastBar_end); Вдруг начинает обсчитывать больший диапазон баров. Подскажите кто понимает, всю голову сломал. Спасибо.


4:08:36 Time+iLowest test started

14:08:36 2004.09.29 00:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 24 NumberLastBar_end= 0
14:08:36 2004.09.29 00:00  Time+iLowest EURUSD,H1:  i=18
14:08:36 2004.09.29 00:00  Time+iLowest EURUSD,H1:  time_check_low_day=06:00
14:08:39 2004.09.29 01:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 25 NumberLastBar_end= 1
14:08:39 2004.09.29 01:00  Time+iLowest EURUSD,H1:  i=19
14:08:39 2004.09.29 01:00  Time+iLowest EURUSD,H1:  time_check_low_day=06:00
14:08:39 2004.09.29 02:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 26 NumberLastBar_end= 2
14:08:39 2004.09.29 02:00  Time+iLowest EURUSD,H1:  i=20
14:08:39 2004.09.29 02:00  Time+iLowest EURUSD,H1:  time_check_low_day=06:00
14:08:40 2004.09.29 03:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 27 NumberLastBar_end= 3
14:08:40 2004.09.29 03:00  Time+iLowest EURUSD,H1:  i=21
14:08:40 2004.09.29 03:00  Time+iLowest EURUSD,H1:  time_check_low_day=06:00
14:08:41 2004.09.29 04:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 28 NumberLastBar_end= 4
14:08:41 2004.09.29 04:00  Time+iLowest EURUSD,H1:  i=31

14:08:41 2004.09.29 04:00  Time+iLowest EURUSD,H1:  time_check_low_day=21:00

Код:


static int    PrevTime=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if(Time[0]<=PrevTime) return(0);
   PrevTime=Time[0];
//////////////
 //  CheckForLongetivityClose_Sell();
   double pBid=NormalizeDouble(Bid,Digits),Low_Now=Low[1];
////////////
   int n_beg=1;                                           // индекс дня, в данном случае 1 - вчерашний день
   datetime DayTime_beg=iTime(NULL,PERIOD_D1,n_beg);             // Начало дня "n" в секундах
   int NumberLastBar_beg=iBarShift(NULL,0,DayTime_beg);

   int n_end=0;                                           // индекс дня, в данном случае 1 - вчерашний день
   datetime DayTime_end=iTime(NULL,PERIOD_D1,n_end);             // Начало дня "n" в секундах
   int NumberLastBar_end=iBarShift(NULL,0,DayTime_end);
   Print(" NumberLastBar_beg= ",NumberLastBar_beg," NumberLastBar_end= ",NumberLastBar_end);
//---------------------------------------------------------------------

   datetime Time_Check_Low_Day=Time[iLowest(NULL,0,MODE_LOW,NumberLastBar_beg,NumberLastBar_end)];
   int i=iLowest(NULL,0,MODE_LOW,NumberLastBar_beg,NumberLastBar_end);
   Print(" i=",i);
   string time_check_low_day=TimeToStr(Time_Check_Low_Day,TIME_MINUTES);
/////////////
   Print(" time_check_low_day=",time_check_low_day);

   datetime time_check_verify=StrToTime("H_check_beg:M_check_beg");


   return(0);
  }

 
Самое непонятное, что происходит это именно на этом участке истории, на других нормально.
 
DiPach:

Если код применять только в реале или на демо счёте, то подобный вашему вариант удобнее. Однако в тестере стратегий при его использовании могут возникнуть проблемы. 


Например какие? Почему у меня не вызывает никаких проблем нигде, а у вас "могут возникнуть".
 

Есть кусок непонятный мне

double Delta =  NormalizeDouble(MathAbs(Bid-PriceOld),Digits);

получается в принте вот такая фигня типо   5e-005.0

 значение PriceOld 

PriceOld   = NormalizeDouble(Bid,Digits); 
При сложении все норм, почему так выходит при вычитании?
 
001:
Самое непонятное, что происходит это именно на этом участке истории, на других нормально.
 Справку по iLowest() внимательно прочтите. Число элементов, в которых производиться поиск, чему должну равняться? И чему равно у Вас.
 
 
 
001:

Попробовал разные варианты. Результат одни и тот же. Как такое может быть абсолютно не понятно. В какой-то момент конгструкция iLowest(NULL,0,MODE_LOW,NumberLastBar_beg,NumberLastBar_end); Вдруг начинает обсчитывать больший диапазон баров. Подскажите кто понимает, всю голову сломал. Спасибо.


4:08:36 Time+iLowest test started

14:08:36 2004.09.29 00:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 24 NumberLastBar_end= 0
14:08:36 2004.09.29 00:00  Time+iLowest EURUSD,H1:  i=18
14:08:36 2004.09.29 00:00  Time+iLowest EURUSD,H1:  time_check_low_day=06:00
14:08:39 2004.09.29 01:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 25 NumberLastBar_end= 1
14:08:39 2004.09.29 01:00  Time+iLowest EURUSD,H1:  i=19
14:08:39 2004.09.29 01:00  Time+iLowest EURUSD,H1:  time_check_low_day=06:00
14:08:39 2004.09.29 02:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 26 NumberLastBar_end= 2
14:08:39 2004.09.29 02:00  Time+iLowest EURUSD,H1:  i=20
14:08:39 2004.09.29 02:00  Time+iLowest EURUSD,H1:  time_check_low_day=06:00
14:08:40 2004.09.29 03:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 27 NumberLastBar_end= 3
14:08:40 2004.09.29 03:00  Time+iLowest EURUSD,H1:  i=21
14:08:40 2004.09.29 03:00  Time+iLowest EURUSD,H1:  time_check_low_day=06:00
14:08:41 2004.09.29 04:00  Time+iLowest EURUSD,H1:  NumberLastBar_beg= 28 NumberLastBar_end= 4
14:08:41 2004.09.29 04:00  Time+iLowest EURUSD,H1:  i=31

14:08:41 2004.09.29 04:00  Time+iLowest EURUSD,H1:  time_check_low_day=21:00

Код:

static int    PrevTime=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if(Time[0]<=PrevTime) return(0);
   PrevTime=Time[0];
//////////////
 //  CheckForLongetivityClose_Sell();
   double pBid=NormalizeDouble(Bid,Digits),Low_Now=Low[1];
////////////
   int n_beg=1;                                           // индекс дня, в данном случае 1 - вчерашний день
   datetime DayTime_beg=iTime(NULL,PERIOD_D1,n_beg);             // Начало дня "n" в секундах
   int NumberLastBar_beg=iBarShift(NULL,0,DayTime_beg);

   int n_end=0;                                           // индекс дня, в данном случае 1 - вчерашний день
   datetime DayTime_end=iTime(NULL,PERIOD_D1,n_end);             // Начало дня "n" в секундах
   int NumberLastBar_end=iBarShift(NULL,0,DayTime_end);
   Print(" NumberLastBar_beg= ",NumberLastBar_beg," NumberLastBar_end= ",NumberLastBar_end);
//---------------------------------------------------------------------

   datetime Time_Check_Low_Day=Time[iLowest(NULL,0,MODE_LOW,NumberLastBar_beg,NumberLastBar_end)];
   int i=iLowest(NULL,0,MODE_LOW,NumberLastBar_beg,NumberLastBar_end);
   Print(" i=",i);
   string time_check_low_day=TimeToStr(Time_Check_Low_Day,TIME_MINUTES);
/////////////
   Print(" time_check_low_day=",time_check_low_day);

   datetime time_check_verify=StrToTime("H_check_beg:M_check_beg");


   return(0);
  }


Обрати внимание на эти строки

   datetime Time_Check_Low_Day=Time[iLowest(NULL,0,MODE_LOW,NumberLastBar_beg,NumberLastBar_end)];//iLowest раз
   int i=iLowest(NULL,0,MODE_LOW,NumberLastBar_beg,NumberLastBar_end);                            //iLowest два

1. Лучше эти строки поменять местами.

int i=iLowest(NULL,0,MODE_LOW,NumberLastBar_beg,NumberLastBar_end); // исправлять не стал
datetime Time_Check_Low_Day=Time[i];

2. NumberLastBar_beg - это номер первого вчерашнего бара, а ты это значение ставишь вместо количества баров среди которых должен быть произведен поиск.

3. Когда вставляешь код найди кнопку SRC в панели инструментов окна ввода текста.

 
AlexeyVik:

Например какие? Почему у меня не вызывает никаких проблем нигде, а у вас "могут возникнуть".

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

Однако если будете настаивать - конечно, скорее всего, займусь подумать, чем можно заменить имеющуюся у него сложную "начинку" для прописать там что-то иное.
 
Можно ли в советнике использовать больше 1го таймера? EventSetTimer(5);
 
pu6ka:
 Справку по iLowest() внимательно прочтите. Число элементов, в которых производиться поиск, чему должну равняться? И чему равно у Вас.
 
 
Я почему-то подумал, что там диапазон, а это число элементов, спасибо!
 
AlexeyVik:

Обрати внимание на эти строки

1. Лучше эти строки поменять местами.

2. NumberLastBar_beg - это номер первого вчерашнего бара, а ты это значение ставишь вместо количества баров среди которых должен быть произведен поиск.


1. Тут переменная  i чисто для контроля, для Print. А с подстановкой баров я накосячил. Спасибо за подсказку!