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

 
pu6ka:

 iBarShift еще не смотрели?

Нет, тут более извращенческий вопрос, это тут не поможет. 

 
001:
Никак не пойму, как мне, сегодня в любое время(в тестере конечно), корректно, узнать номера баров вчерашнего дня с 00:00 по 23:59. Подскажите плз.
                 //+------------------------------------------------------------------+
                 //|                                                       Отскок.mq4 |
                 //|                                              FOReignEXchange2008 |
                 //|                                          forexsignal2008.ucoz.ru |
                 //+------------------------------------------------------------------+
                   #property copyright "FOReignEXchange2008"
                   #property link      "FOReignEXchange@bk.ru"

int День,i,k;

int start()
{

i=0;k=0;

День=TimeDay(iTime(NULL,0,0));

while (i<=1440)
      {
      if (TimeDay(iTime(NULL,0,i))==(День-1) && k==0) 
         {
         k=i;
         Alert("",k);
         }
      i++;
      }
return;
}

//+------------------------------------------------------------------+

Вот так примерно вычисляется номер последнего бара предыдущего дня в тестере. Остальное можете сами додумать и доделать.

 
FOReignEXchange:

Вот так примерно вычисляется номер последнего бара предыдущего дня в тестере. Остальное можете сами додумать и доделать.


Спасибо! Завтра попробую. Сегодня голова не соображает. На самом деле не совсем правильно задал вопрос. Нужно, сегодня, знать номера первого и последнего бара вчерашнего дня. Все не обязательно.
 
001:

Спасибо! Завтра попробую. Сегодня голова не соображает. На самом деле не совсем правильно задал вопрос. Нужно, сегодня, знать номера первого и последнего бара вчерашнего дня. Все не обязательно.

Тестер TimeCurrent хорошо воспринимает. Поэтому можно ещё и что-то с подобным вариантом замутить (попробуйте создать скрипт с нижеприведённым кодом и гляньте на результат):

   datetime LastServerTime=TimeCurrent();
   long tms=LastServerTime%86400;
   int NumberFirstBar=iBarShift(NULL,0,LastServerTime,false);
   datetime TimeNumberFirstBar=iTime(NULL,0,NumberFirstBar);   
   datetime TimeLastBar=TimeNumberFirstBar-(datetime)tms;
   
   int NumberLastBar=iBarShift(NULL,0,TimeLastBar,false);
   
   Comment("NumberLastBar = ",NumberLastBar);

А вообще, вот тут очень хорошая статья. Несмотря на то, что она для МТ5, однако там и к применению в МТ4 полезная инфа.

[Удален]  
001:
Никак не пойму, как мне, сегодня в любое время(в тестере конечно), корректно, узнать номера баров вчерашнего дня с 00:00 по 23:59. Подскажите плз.


Вот так можно найти индекс первого бара в начале любого дня. 

     int n = 1;                                           // индекс дня, в данном случае 1 - вчерашний день
datetime DayTime = iTime(NULL, PERIOD_D1, n);             // Начало дня "n" в секундах
     int cb = iBarShift(NULL,0,DayTime);                  // Получим на текущем ТФ индекс 1-го бара


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

 
pu6ka:


Вот так можно найти индекс первого бара в начале любого дня. 

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


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

P./S.: Поэтому FOReignEXchange и я привели иные варианты.

 
Всем спасибо! Будем работать.
[Удален]  
DiPach:

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

P./S.: Поэтому FOReignEXchange и я привели иные варианты.


 Возможно. Я для индикатора такой код использовал, там он меня не подводил. Пусть пробует разные варианты.

 

Попробовал разные варианты. Результат одни и тот же. Как такое может быть абсолютно не понятно. В какой-то момент конгструкция 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);
  }

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