본문 바로가기
주식/자동 추천 프로그램

차트에 볼린저밴드 추가

by subutie 2021. 2. 16.
728x90

(2021년 2월 1일 글 옮김)

기본 20일 평균 기존 볼린저밴드

 

TrackBar를 이용해 5일 평균 볼린져밴드로 조정

 

30일 볼린저밴드로 조정

 

볼린저 밴드 계산 방법에 대해서는 많은 사람들이 포스팅 해놨지만 간단하게 말하자면

가운데 20일 평균선을 기준으로 표준편차 * 2 한 값을 + , - 해서 얻는다.

표준 편차는 아래 나무 위키를 보시는 것이 제가 설명 하는 것 보다 낫습니다.

https://namu.wiki/w/%ED%91%9C%EC%A4%80%ED%8E%B8%EC%B0%A8

 

표준편차 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

 

혹시 코드를 원하시는 분을 위해 코드도 첨부 합니다.

            int avgCnt = 20; // 가변적으로 평균 날짜를 수정 가능하도록 변수화
            int count = 80; // 모든 날짜에 대해 볼린저밴드 값을 구할 필요가 없어 최근 몇일만 구할 수 있도록 변수화
            double before = 0;
            double total = 0;

            for (int i = 0; i < count; ++i)
            {
                double avg = 0;
                double gap = 0;
                int index = curInfo.list_StockDayInfo.Count - 1 - i; // 역순으로 인덱스를 구해옴 (최근 몇일만 구할 수 있도록 하기 위해)
                double cur = curInfo.list_StockDayInfo[index].close; // 인덱스에 해당하는 날짜의 종가

                /*
                * 20일간의 총 합을 구하는 부분으로 최초 1회만 20일간 루프를 돌려 합을 얻고
                * 이후로는 이전 인덱스에 해당하는 종가를 빼고
                * 이후로는 다음 인덱스 + 19에 해당하는 종가를 더하는 방식으로 성능을 올렸습니다.
                */
                if (i == 0)
                {
                    for (int n = 0; n < avgCnt; ++n)
                    {
                        total += curInfo.list_StockDayInfo[index - n].close;
                    }
                }
                else
                {
                    total -= before;
                    total += curInfo.list_StockDayInfo[index - avgCnt + 1].close;
                }
                // <= 여기까지가 20일 총합 값 구하는 코드

                avg = total / avgCnt; // 20일 평균 값

                // 아래 부분이 표준 편차를 구하는 공입니다.
                // 이 부분도 평균값 처리 하듯 총합을 가지고 하면 성능 개선이 있지만 귀차니즘이...
                for (int n = 0; n < avgCnt; ++n)
                {
                    gap += Math.Pow(curInfo.list_StockDayInfo[index - n].close - avg, 2);
                }
                gap = Math.Sqrt(gap / avgCnt);  // <= 여기까지가 20일간의 표준 편차 값입니다.
                
                gap *= 2.0; // 볼린저에서는 표준편차의 2배 값을 사용하기 때문에 2배 해줍니다.

                // 차트에 추가하는 코드
                int addX = BOL_LINE.Points.AddXY(index, avg);
                addX = BOL_BEND.Points.AddXY(index, new object[] { avg + gap, avg - gap });

                before = cur;
            }

 

누가 보게 될지 몰라 주석을 친절하게 한번 남겨 봅니다.

댓글