차트 세팅

[키움증권, 수식관리자] 요일 구하기(월화수목금토일)

TaeYangKim 2020. 6. 15. 00:59

키움증권에서는 요일에 대한 함수를 제공하지 않는다. 대신에 date()라는 함수를 통해서 년, 월, 일을 제공해준다. 년, 월, 일을 알면 당연히 요일도 알 수 있다. 그래서 그 방법에 대해서 찾아보고, 수식으로 작성해보고자 한다.

 

다음 링크를 클릭하면 날짜를 이용해서 요일을 알아내는 방법이 많이 나와있다.

그 중에서 Sakamoto's methods를 사용하려고 한다.

 

함수를 살펴보면 다음과 같다.

dayofweek(y, m, d) /* 1 <= m <= 12,  y > 1752 (in the U.K.) */
{
  static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  y -= m < 3;
  return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}

기본적으로 년, 월, 일을 구해야 위의 식을 사용할 수 있다.

 

수식관리자의 date()의 값을 살펴보면 yyyymmdd의 형태로 날짜를 알려준다.

만약 2020년 6월 15일이면, date() 20200615의 정수값을 반환한다.

 

첫번째로 일(day)을 구해보자. date()값의 마지막 2자리를 가져오면 된다. 이는 100으로 나눈 나머지와 같은 의미이다.

day = date() % 100;

 

다음으로 월(month)을 구해보자. 월은 date()의 뒤에서 3~4번째 값을 가져오면 된다. 

뒤에 두자리를 없애기 위해서 date()100으로 나눠보자. 위의 예제에 적용하면 202006.15가 나오게 되는데, 우리는 소수점아래는 필요 없기 때문에 floor()함수를 이용해서 소수점을 없애준다(이 과정이 싫으면 day를 빼줘도 된다). 그럼 202006이 나오고, 거기에서 마지막 두자리만 필요하기 때문에, 앞에서 했던 방법과 마찬가지로 100으로 나눈 나머지를 구해주면 된다.

month = floor(date/100) % 100;

 

마지막으로 연도(year)를 구해보자. 위에서 했던 내용과 거의 비슷하므로 수식만 적겠다.

year = floor(date/10000);

이제 sakamoto's methods를 적용해보도록 하자.

 

첫 번째 줄에 t[]라는 배열이 등장한다. 키움증권에서 배열이 사용 불가능한 것 같다(만약 가능하다면 댓글로 알려주세요). 하지만 if문을 통해서 복잡하지만 대체할 수는 있다.

if(조건, 참일때 값, 거짓일때 값)

if문의 문법은 위와같이 되어있다. t[]배열에서 보면 month=1일때, 0을 반환해야 한다. 이를 if문으로 표현하면 다음과 같다.

if(month==1, 0, ??)

month1인 경우에 대해서는 0을 반환하고, 아닌경우에 대해서는 일단은 관심이 없으므로 ??라고 적어놨다. 이를 1월부터 12월까지 모두 작성해주면 된다. 총 12개를 적어야 하고, OR(||) 연산자를 사용하면 조금 짧게 구현할 수 있다.

T = if(month==1 || month==5, 0,
    if(month==8, 1,
    if(month==3 || month==11, 2,
    if(month==2 || month == 6, 3,
    if(month==9 || month == 12, 4,
    if(month==4 || month == 7, 5, 6))))));

 

두번째 줄을 보면 이상한 수식이 나온다. 이를 풀어서 쓰면 다음과 같다.

 y -= m < 3;
 if(m < 3) y = y - 1;

수식관리자에 있는 if문을 이용하여 다음과 같이 구현할 수 있다.

year = if(month < 3, year - 1, year)

이제 필요한 모든 정보를 구했다. 이를 이용해서 요일을 구해보자.

(year + floor(year/4) - floor(year/100) + floor(year/400) + T + day) % 7
C언어에서는 정수의 나눗셈 결과는 정수이지만, 키움 수식관리자에서는 소수가 나온다. 따라서 나눗셈을 할 때, floor()함수를 통해서 정수로 바꿔야 한다.

위의 수식의 결과는 0부터 6까지의 정수로 나오게 되는데, 이는 일요일부터 토요일에 대응된다.

(일요일=0, 월요일=1, ... , 토요일=6)