주말을 포함한 막대 계산 - 페이지 3

 
Igor Makanu :

모든 것이 복잡합니다. 날짜 사이에는 초 단위의 시간이 있습니다(datetime) - 이것은 24시간, 매시간 60분, 1분에 60초가 있는 전체 일 수를 계산하기에 충분합니다. .... google to 구조하다

우리가 왜곡 된 계산 방법에 대해 이야기하고 있다면 다음과 같이 할 수 있습니다.

당신이 제안한 것처럼 각 막대를 세고 현재 막대와 이전 막대 사이에 주말이 있는지 알아내는 것이 가능합니다 .... 일반적으로 작업을 복잡하게 만들 가능성은 욕망에 의해서만 제한됩니다 )))

시간 간격이 0:0에서 시작하고 끝나는 것으로 가정하여 시작해야 합니다.

 
Dmitry Fedoseev :

시간 간격이 0:0에서 시작하고 끝나는 것으로 가정하여 시작해야 합니다.

내 예에서는 이 가정이 필요하지 않지만 계산이 1년 이내에 일어난다는 가정이 필요합니다.

첫 번째 메시지에는 옵션으로 솔루션이 있었습니다. KimIV의 유용한 코드만 주제에 다른 솔루션이 있어야 합니다.

 
Igor Makanu :

내 예에서는 이 가정이 필요하지 않지만 계산이 1년 이내에 일어난다는 가정이 필요합니다.

첫 번째 메시지에는 옵션으로 솔루션이 있었습니다. KimIV의 유용한 코드만 주제에 다른 솔루션이 있어야 합니다.

일 수만 계산하는 것이 아니라 근무일이나 주말을 계산해야 합니다.

 
Dmitry Fedoseev :

일 수만 계산하는 것이 아니라 근무일이나 주말을 계산해야 합니다.

말하기 어려운 문제의 모호한 공식:

외환2030 :

예를 들어 D1과 같이 포인트 사이에 주말이 몇 번 있었는지 확인하여 나중에 필요한 막대에 추가할 수 있도록 하는 방법은 무엇입니까?

귀하의 표현에 따르면 CopyTime() 은 일일 막대를 복사하고 루프에서 주말을 분석하지만 주말에는 어떻게 해야 합니까? - 그가 그것들을 추가하고 싶다고 썼습니까?
 
Igor Makanu :

말하기 어려운 문제의 모호한 공식:

...

모호성은 어디에 있습니까? " D1과 같이 포인트 사이의 휴무일을 찾는 방법 은 나중에 필요한 막대에 추가할 수 있도록 하기 위함입니다. "

이것이 필요한 이유는 또 다른 질문입니다.

 
int WorkingDays( datetime startDate, datetime endDate){

   int d= int ((endDate-startDate)/ 86400 );
   
   int m[ 7 , 7 ]={
   { 0 , 0 , 1 , 2 , 3 , 4 , 5 }, // воскр
   { 0 , 1 , 2 , 3 , 4 , 5 , 5 }, // понед
   { 0 , 1 , 2 , 3 , 4 , 4 , 4 }, // вторн
   { 0 , 1 , 2 , 3 , 3 , 3 , 4 }, // среда
   { 0 , 1 , 2 , 2 , 2 , 3 , 4 }, // четв
   { 0 , 1 , 1 , 1 , 2 , 3 , 4 }, // пятн
   { 0 , 0 , 0 , 1 , 2 , 3 , 4 }   // субб
   };

   return (d/ 7 )* 5 +m[( int )TimeDayOfWeek(startDate)][d% 7 ];
}

확인해보니 괜찮은 것 같습니다. 게으르지 않은 사람을 확인하십시오.

 
Dmitry Fedoseev :

모호성은 어디에 있습니까? " D1과 같이 포인트 사이의 휴무일을 찾는 방법 은 나중에 필요한 막대에 추가할 수 있도록 하기 위함입니다. "

이것이 필요한 이유는 또 다른 질문입니다.

나는 우리가 몇 시간 더 이야기하면 작업을 평가하기 시작할 것이라고 생각합니다. 두 막대 사이에 몇 일을 쉴 수 있습니까? .... 그러나 월요일 전에 일요일이 있다는 서신이 항상 있습니까?

)))))))

여기에서 조정, datetime 빼기를 통한 일 계산, 이 코드가 모든 경우에 작동한다고 생각합니다.

 input datetime d_start = D'2020.01.01 12:30:27' ;
input datetime d_stop  = D'2020.02.01' ;

//+------------------------------------------------------------------+
void OnStart ()
{
   const int day_in_sec = 24 * 60 * 60 ;
   datetime d_corect1 = d_start - d_start % day_in_sec;
   datetime d_corect2 = d_stop - d_stop % day_in_sec;
   int result = ( int )((d_corect2 - d_corect1) / day_in_sec);
   printf ( "всего %i дней " , result);
}
//+------------------------------------------------------------------+
 
forex2030 :

날짜별

첫 번째 점에 막대를 추가합니다.

그런 다음 이 날짜 사이 의 막대 수를 계산합니다.

 int    Bars ( 
   string            symbol_name,     // имя символа 
   ENUM_TIMEFRAMES   timeframe,       // период 
   datetime          start_time,       // с какой даты 
   datetime          stop_time         // по какую дату 
   );
당신은 당신이 주어진 것보다 적게 얻습니다. 주어진 바 수와 받은 바 수의 차이가 휴무일 수입니다. 따라서 우리는 모든 기간, 심지어 1분의 막대 수를 얻습니다. 함수가 얼마나 반환하는지 주의 깊게 파악하십시오. 극단적인 막대 또는 하나가 모두 고려됩니다. 정확히 기억은 안나지만 둘 다 있었던 것 같다.
 
Alexey Viktorov :

그런 다음 이 날짜 사이 의 막대 수를 계산합니다.

당신은 당신이 주어진 것보다 적게 얻습니다. 주어진 바 수와 받은 바 수의 차이가 휴무일 수입니다. 따라서 우리는 모든 기간, 심지어 1분의 막대 수를 얻습니다. 함수가 얼마나 반환하는지 주의 깊게 파악하십시오. 극단적인 막대 또는 하나가 모두 고려됩니다. 정확히 기억은 안나지만 둘 다 있었던 것 같다.

아직 막대가 없는 날짜에 대해 이야기하십시오.

 

만일을 대비하여 예를 추가하겠습니다. 누락된 막대의 수를 계산합니다.

 input datetime d_start = D'2020.01.01 12:30:27' ;
input datetime d_stop  = D'2020.02.01' ;

//+------------------------------------------------------------------+
void OnStart ()
{
   const int day_in_sec = 24 * 60 * 60 ;
   datetime d_corect1 = d_start - d_start % day_in_sec;
   datetime d_corect2 = d_stop - d_stop % day_in_sec;
   int result = ( int )((d_corect2 - d_corect1) / day_in_sec);
   printf ( "всего %i дней " , result);
   datetime t_arr[];
   int allbarD1 = CopyTime ( _Symbol , PERIOD_D1 , d_start, d_stop, t_arr);
   if (allbarD1 < 0 )
   {
       printf ( "Error CopyTime() func № %i" , GetLastError ());
       return ;
   }
   printf ( "Всего выходных % i дней" , result - allbarD1);
}
//+------------------------------------------------------------------+