2. 해외선물/2-4. 해외선물 API (사용)

(키움증권 해외선물 OpenAPI-W) 스토캐스틱(Stochastic) 값 구하기 (2) 스토캐스틱 패스트 %K, %D 구하기

봄이오네 2023. 10. 2. 00:09
반응형
목 차
1. 들어가며
2. 사전설명
   1) for문
   2) 리스트에 요소 추가 및 초기화
   3) 리스트 내 최대값/최소값/합계 구하기
   4) 리스트 내 항목 갯수 구하기
   5) 키움증권에서 자료 받아오는 형태
3. 스토캐스틱 Fast %K, %D 구하는 방법(엑셀)
   ① 스토캐스틱 Fast %K 구하기
   ② 스토캐스틱 Fast %D 구하기
4. 코드 설명
5. 전체 코드
6. 마치며

 

1. 들어가며

지난 글에서는 스토캐스틱의 개념 및 산출식, 타 증권사와 스토캐스틱 Slow %K가 다른 이유 등을 알아보았다. 필자가 사용하지 않는 보조지표이다보니 내용을 익히고, 엑셀로 계산해보고, 작성하는데 상당한 시간을 할애하였다. 그래도 해선을 하다가 한가지라도 더 아는게 좋을 듯 싶다. 이번 기회에 필자도 스토캐스틱에 대해 공부해 보고자 한다.
 
이번 글에서는 스토캐스틱 패스트 %K, %D를 구하는 방법에 대해 알아보자.
필자는 키움증권을 사용하고 있다. 키움증권 기준으로 설명할 것이다.
 * < 그림1 >에서 확인가능하지만, 1분 차트의 키움증권의 Stochastic fast의 기간 설정은 5(분)과 3(분)이다.
 

그림1. Stochastic fast %K, %D의 기간 설정값은 각각 5와 3이다.

 
아래 엑셀 파일은 필자가 키움증권에서 다운받은 1분봉(230929, 금) 데이터이다. 엑셀에 걸린 함수를 살펴보면서 코드를 보는 것도 도움이 된다. 이유는? 엑셀에서 스토캐스틱 패스트 %K, %D를 구하다보면 코드 작성하는게 훨씬 수월하기 때문이다.
 
※ 해외선물(미니나스닥, 230929, 금) 1분데이터 파일

해외선물(미니 나스닥) (230929, 금) (NQZ23).xlsx
0.19MB

 
5번(전체코드)에서 전체코드를 확인할 수 있다.


2. 사전설명

본론으로 들어가기 전 먼저 for문, list 추가/초기화, 리스트 최대값/최소값 구하기 등에 대해 알아보자.
 

1) for문

① 단일 for문
반복적인 작업을 할 때 for문은 사용자를 정말 편하게 한다. 1부터 9까지 출력하라는 요청에 print문을 써서 일일히 1~9까지 출력할 수도 있겠지만, for문을 사용하면 2줄에 끝낼 수 있다.

for i in range(1,10):
    print(i)
    
# (expected result)
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9

 
굳이 for문을 먼저 이야기한 이유는? for 문에 대해 확실히 알고 갈 필요가 있다.

  • 1줄(for i in range(1,10)): 의미에 대해 생각해보자.
  • i는 2줄의 print 안에 들어가는 변수로 작용한다.
  • in : 한도 내에서
  • range : 한도를 설정한다. range 안의 괄호()에는 정수만 들어갈 수 있다. 또한 range 안에 끝수(여기서는 10)를 적어주어도 작동한다. 예를 들어 for i in range(10):으로 입력해 주면, 0~9까지 10개 숫자가 출력된다.
  • 1,10 : for문의 시작(1이상)이며, 10은 끝수(10미만)이며 여기서는 9를 말한다.

② 이중 for문
이중 for문을 말하고자 단일 for문을 언급하였다. 아래 코드를 실행하면 어떻게 될까?
코드를 실행하면 1줄의 i=0부터 시작될 것이다.

  • 첫번째, 1줄의 i= 0이 되고, 2줄의 i=0이 들어가고, 2줄은 for j in range(0,5) → i=0일 때, 0~4 출력
  • 두번째, 1줄의 i=1이 되고, 2줄의 i=1이 들어가고, 2줄은 for j in range(1,6) → i=1일 때, 1~5 출력
  • 세번째, 1줄의 i=2이 되고, 2줄의 i=2이 들어가고, 2줄은 for j in range(2,7) → i=2일 때, 2~6 출력

규칙성이 보일 것으로 생각된다. i가 1씩 증가할 때마다 결과값(j)의 시작/끝 값이 1씩 증가한다.

for i in range(0,5):
    for j in range(i,i+5):
        print(j)

결과값은 < 접은 글 >에서 확인할 수 있다.

더보기

0
1
2
3
4
1
2
3
4
5
2
3
4
5
6
3
4
5
6
7
4
5
6
7
8

 
이렇게 보면 이중 for문이 간단한데, 우리가 활용할 코드는 아래와 같다. 이중 for문에 대한 확실한 이해가 필요해 보인다.

for i in range(0, 30):  # 현재 분의 STC_패스트 K, D 구하기
    for j in range(i, i + 5):
        self.close_price_row_data = abs(float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opc_10002", "opc10002", i, "현재가").strip()))
        max_price_row_data = abs(float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opc_10002", "opc10002", j, "고가").strip()))
        min_price_row_data = abs(float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opc_10002", "opc10002", j, "저가").strip()))

 

2) 리스트에 요소 추가 및 초기화

리스트에 요소(항목)을 추가하는 것은 append라는 명령어를 사용하고, 리스트 초기화는 리스트=대괄호([ ])를 사용한다. 또한 리스트 역순으로 뒤집는 것은 리스트[::-1] 형태(콜론 콜론 -1)로 사용한다.

  • 리스트 항목 추가 : 리스트명.append(변수)
  • 리스트 초기화    : 리스트 = []
  • 리스트 순서 바꾸기 : 리스트1 = 리스트원본[::-1]

우리가 활용할 리스트 형태는 아래와 같다.

self.nq_max_price_list.append(max_price_row_data)           # 리스트에 요소(항목) 추가
self.nq_max_price_list = []                                 # 리스트 초기화
self.stc_fast_d_list_final = self.stc_fast_d_list[::-1]     # 리스트 역순 정렬

 
예를 들어보자.
① 리스트에 항목을 추가한 경우
1분봉 데이터를 리스트에 넣어서 최고값/최저값을 구할 필요가 있다.

aaa = [1,2,3]
print(aaa)

aaa.append(4)
print(aaa)

# (expected result)
# [1, 2, 3]
# [1, 2, 3, 4]

 
② 리스트를 초기화하는 방법
이중 for문이 계속 동작중이고, 다음 값을 계산하기 위해 초기화 시킨다.
예를 들어 0~4까지 계산값을 위해 리스트를 한번 활용했는데, 초기화를 시켜주지 않는다면, 1~5까지의 값이 추가(append)되어 결과값의 왜곡이 생긴다.
 ※ (중요) 리스트의 append 명령어를 써주었다면, 결과값을 받았다면 그 리스트를 반드시 초기화하는 습관을 들이자.

aaa = [1,2,3]
print(aaa)

aaa = []
print(aaa)

# (expected result)
# [1, 2, 3]
# []

 
③ 리스트 역순으로 정렬
키움에서는 데이터를 최신→과거의 순서로 제공한다. 즉 키움에서 데이터를 받을 때는 역순으로 받은 데이터를 순차적으로 계산하기 위해 정배렬(과거 → 최신)로 만들어서 데이터를 계산하기 위함이다.

aaa = [1,2,3]
print(aaa)

aaa = aaa[::-1]
print(aaa)

# (expected result)
# [1, 2, 3]
# [3, 2, 1]

 

3) 리스트 내 최대값/최소값/합계 구하기

스토캐스틱 패스트 %K를 구하기 위해서는 일정 기간 동안의 최대값/최소값을 구해야 한다.

  • 스토캐스틱 패스트 %K : (현재가격 - n분(일) 중 최저가) / ( n분(일) 중 최고가 - n분(일) 중 최저가) * 100

여기서 일정 기간은 어떻게 처리하고, 최대값/최소값은 어떻게 구할 것인가?

  • 일정 기간 동안의 데이터 : 키움증권에서 받아온 데이터를 순차적으로 리스트에 추가(append)한다
  • 최대값/최소값 구하기     : 리스트 앞에 max, min을 붙여서, 리스트 내 최대/최소값을 찾는다.
aaa = [1,2,3]

aaa_max_number = max(aaa)
aaa_min_number = min(aaa)
aaa_sum_number = sum(aaa)

print(aaa_max_number)
print(aaa_min_number)
print(aaa_sum_number)


# (expected result)
# 3
# 1
# 6

 
앞으로 우리가 알게될 리스트 내 최대/최소값을 구하는 형태는 아래와 같다.

self.max_price_first = max(self.nq_max_price_list)
self.min_price_first = min(self.nq_min_price_list)

 

4) 리스트 내 항목 갯수 구하기

리스트 내 항목 숫자를 세는 명령어는 len이다. 아래 코드의 aaa 리스트에 4개 항목이 있다. len(aaa)의 형태는 "정수형"이다. 위의 for문에서 설명하였지만, for i in range(정수형) 즉, range 괄호 안에 정수형을 단독으로 써도 for문은 작동한다.

aaa = [1,2,3,7]
aaa_counting_number = len(aaa)

print(aaa_counting_number)
print(type(aaa_counting_number))


# (expected result)
# 4
# <class 'int'>

 
우리는 len 명령어를 Stochastic fast %D를 구할 때 사용할 것이다.

for i in range(len(self.stc_fast_d_list_final)):
    if i == 0:
        self.stc_fast_d_first = self.stc_fast_d_list_final[i]
    elif i >= 1:
        self.stc_fast_d_second = (self.stc_fast_d_list_final[i] * self.stc_fast_k_weighting) + (self.stc_fast_d_first * (1 - self.stc_fast_k_weighting))
        self.stc_fast_d_first = self.stc_fast_d_second

 

5) 키움증권에서 자료 받아오는 형태

키움증권의 OpenAPI-W에서 자료를 받아올 때는 GetCommData를 통해 받아온다. 받아오는 데이터는 아래와 같다.

그림2-1. 키움서버에서 1분봉 데이터를 받아오는 코드
self.close_price_row_data = abs(float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opc_10002", "opc10002", j, "현재가").strip()))

 

  • 받아올 변수(self.close_price_row_data)를 먼저 선언한다.
  • self.kiwoom은 QAxWidget("KFOPENAPI.KFOpenAPICtrl.1")을 뜻하며, 사용자 pc에 깔린 키움OpenAPI-W의 레지스터리를 이용하여 키움서버에 접속
  • dynamicCall() : 괄호() 안에 있는 내용을 키움서버에서 받아(GetCommData)오라는 의미이다.
  • GetCommData : < 그림2-2 >에서 자료를 받아올 때 4가지 변수가 필요하며, 변수 형태는 문자(str), 문자, 정수(long), 문자(str)의 형태이다. 문자는 QString, 정수는 int로 표기한다.
  • j : for 문이 돌아가면서 1분봉 현재가(종가) 자료를 받아온다. j=0이면 현재가, j=1이면 1분전 종가를 말한다.
  • 현재가 : 종가를 말한다.
그림2-2. WKOA Studio에서 확인한 GetCommData 함수의 자료 수신시 필요한 4가지 변수 형태(문자, 문자, 정수형, 문자)

 
스토캐스틱 데이터를 만들기 위해 알아야 할 내용이 상당히 많다. 이 다음 글부터는 위의 2번(사전준비)는 구체적으로 기재하지 않을 예정이다. 여기서 잘 숙지하도록 하자. ^^


3. 스토캐스틱 Fast %K, %D 구하는 방법(엑셀)

우리가 알고싶은 내용은 스토캐스틱 Fast %K, %D이다. < 그림3 >은 2023년 9월 30일(토)의 1분봉 차트이다.
이때 STC_Fast %K는 3.13이고, STC_Fast %D는 14.27을 확인하였다. 
 ※ 라이브러리 설명 및 로그인 내용은 여기에서 생략한다.

그림3. 스토캐스틱 패스트 %F, %D는 각각 3.13 및 14.27이다.

 
다시 한번 스토캐스틱 구하는 산출식을 기억하자.

  • 스토캐스틱 패스트 %K : (현재가격 - n분(일) 중 최저가) / ( n분(일) 중 최고가 - n분(일) 중 최저가) * 100
  • 스토캐스틱 패스트 %D : 패스트 %K를 m분(일) 로 지수이동평균한 값

 < 그림3 >의 왼쪽에는 %F 및 %D의 기간(5분, 3분)이 각각 나와있다. %K는 5분 중 최고/최저값만 구하면 되고, %D는 %K로 구해진 값을 3번 지수이동평균하면 된다. → 이중 for문 사용 예정
 
 
① 스토캐스틱 Fast %K 구하기
< 그림4 >에서 현재(2023-09-30, 05:59) 가격은 14891.5이며, 5분간의 최고가는 14899.25, 5분간의 최저가는 14891.25이다.
 

  • Stochastic fast %K 산출식 = (현재가격 - n분 중 최저가) / (n분 중 최고가 - n분 중 최저가) * 100
  • Stochastic fast %K 산출식 = (14891.5 - 14891.25) / (14899.25 - 14891.25) * 100 = 3.125 ≒ 3.13
그림4. 첨부한 엑셀파일에서 계산한 패스트 %K, %D 내역

 
 
② 스토캐스틱 Fast %D 구하기
여기서부터 어떻게 계산해야 할지 약간 막막했다. 어.떻.게 접근을 해야 할까? 생각이 나지 않을 때, 패스트 %D를 계속 읽어볼 수 밖에 없었다. 패스트 %K를 3분으로 지수이동평균한 값이라....  어쩔 수 없이 엑셀을 돌려볼 수 밖에 없었고, 그 결과가 < 그림4 >의 K열을 말한다.

  • 스토캐스틱 패스트 %D : 패스트 %K를 m분(일) 로 지수이동평균한 값

 
필자의 접근법은 < 그림4 >와 같이 키움증권에서 데이터를 역순(최신→과거)으로 주니, 일단 각 종가별로 %K를 계산(①)하여 %K값 결과물을 리스트에 넣은 다음, 리스트를 정배열(과거→현재)로 바꾸어서 차근차근 계산(②)하자는 것이다.
 
즉, for문의 1번째 작업으로 종가 F601, 최고가 D597~601, 최저가 E597~601이라면,
     for문의 2번째 작업으로 종가 F600, 최고가 D596~600, 최저가 E596~600으로 계산할 것이고,
     for문의 3번째 작업으로 종가 F599, 최고가 D595~599, 최저가 E595~599으로 계산할 예정이다.


4. 코드 설명

※ 라이브러리 및 로그인 관련 내용은 생략한다. (로그인 내용 : https://springcoming.tistory.com/203)
아래 < 그림5 >에서 짤린 부분은 5번(전체 코드)에서 확인할 수 있다.

그림5-1. Stochastic fast %F 및 %D를 구하기 위한 내역

 
1줄~18줄 : 라이브러리 및 로그인 관련 내용으로 설명을 생략한다.
20줄~29줄 : 최고값, 최대값 등을 구하기 위해 리스트를 미리 선언해 준다.
33줄~36줄 : 지수이동평균을 구하기 위해 가중치를 미리 선언해 준다.
 

그림5-2. 1분봉 데이터 조회 및 수신받는 코드

 
38줄~41줄 : 최대값, 최소값 및 오실레이터를 구하기 위한 리스트를 미리 선언한다.
43줄~48줄 : 로그인 관련 함수이며, 여기서는 설명을 생략한다.
51줄~59줄 : 1분봉 데이터 조회를 위해 데이터를 OpenAPI-W에 요청(SetInputValue), 데이터 입력(CommRqData), 수신(GetCommData)한다. 1분봉 조회는 링크 참조 (https://springcoming.tistory.com/207)
64줄 : 66줄~107줄까지 Stochastic fast %F, %D를 구하는 함수를 실행한다.
 

그림5-3. 스토캐스틱 패스트의 %F, %D를 구하는 함수

 
68줄~92줄 : %F를 구하는 함수이다. %F는 현재가, 5일간의 최대/최소값에 의해 결정된다.
68줄~69줄 : i=0,1,2,..., 29일때 각각의 %F가 계산된다. 
70줄~73줄 : 화면에서 짤렸지만, 현재가를 구하고, 최대값을 구하기 위해 0~4에 해당하는 각각의 최대값을 74줄에서 self.nq_max_price_list 리스트(20줄에서 선언)에 넣는다. 최소값을 75줄에서 self.nq_min_price_list 리스트(21줄에서 선언)에 넣는다.
78줄~79줄 : 78줄에서는 각각의 최대값에서 가장 큰 값(max)을 self.max_price_first에 넣고, 각각의 최소값 중 가장 작은 값(min)을 self.min_price_first의 변수에 넣는다.
 
81줄~82줄 : 78줄~79줄에서 리스트 내 최대/최소값을 찾아주었고, 더 이상 쓸 일이 없으므로 각각 초기화 한다.
84줄 : 화면에서 짤렸지만, "(최대값-5분 최대값) / (5분 최대값-5분 최소값) * 100" 내용이다.
85줄 : 소수 셋째자리에서 반올림한다.
 
89줄 : 68줄~87줄까지 계산된 각각의 %F는 역순(최신→과거)로 들어가 있다. 이 것을 정배열로 바꾼다. 이유는? < 그림4 >의 ②에서 설명하였듯이 위에서부터 지수이동평균하여 스토캐스틱 패스트 %D를 구하기 위함이다.
90줄 : 정배열된 self.stc_fast_d_list_final 리스트의 맨 마지막 값(29)이 "현재시간의 %F"이다.
92줄 : self.stc_fast_d_list 리스트는 활용하지 않으므로 초기화 해준다.
 ※ 생각날 때마다 초기화해야 한다. 그렇지 않으면, 결과값들이 누적되어, 왜곡된 값이 나온다
 
94줄~99줄 : 이 글의 핵심이다. %D를 구하기 위해 지수이동평균을 해준다. 지수이동평균은 첫번째 값(if == 0)인 경우, 가중치 등을 곱하지 않고, 그대로 그 값을 취한다. 예를 들어 2, 3에서 "2"의 지수이동평균은 "2"이다. 이와 대조적으로 2, 3에서 3의 지수이동평균은 3*2/3 + 2*(1-2/3) = 2.67이다.
94줄 : 89줄에서 정의한 리스트로서 30개 항목이 들어 있으므로, len(self.stc_fast_d_list_final)은 30이다. 즉 94줄은 for i in range(30):을 뜻한다.
 
95줄~96줄 : 첫번째 항목이 0일 때 그대로 두번째 값에 쓴다.
97줄~99줄 : 이곳이 지수이동평균을 계산하는 곳이다. < 그림5-3 >에서는 98줄이 짤렸다.
98줄 : i==1이면, self.stc_fast_d_list_final[1] * 가중치 + self.stc_fast_d_first * (1-가중치)
99줄 : 지수이동평균은 앞의 값이 뒤에 값에 영향을 주므로, 이 전에 계산된 값을 써주기 위해 self.stc_fast_d_first에 앞에서 계산된 값을 넣는다.
 

그림5-4. 지수이동평균 계산이 끝나면 리스트를 초기화 해준다.

 
101줄 : 94줄~99줄에서 지수이동평균 계산이 끝나면, 101줄에서 self.stc_fast_d_list_final을 초기화 해준다.
 
103줄~104줄 : 스토캐스틱 %F, %D를 소수 2번째 자리에서 반올림해준다. 엑셀에서는 3.13, 14,27이 나왔는데, 코드로 계산된 결과는 3.12, 14.26으로 계산된다. 부동소수점 문제 등이 발생해서 나타난 문제로 생각된다. 대세에 지장없는 것 같다. 코드로 계산된 값을 사용해도 무난해 보이긴 한다.
113줄 : 51줄 rq_data_opc10002를 실행하는 함수이다. 1분봉 조회를 시작하는 함수이다.


5. 전체 코드

전체코드는 아래와 같다. 아래 코드를 실행하려면 키움증권에 시세 이용료(월 $185)를 지불하여야 한다.
 

더보기
import sys
from PyQt5.QAxContainer import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

class btl_system():
    def __init__(self):
        self.kiwoom = QAxWidget("KFOPENAPI.KFOpenAPICtrl.1")
        print("로그인 시작!")

        self.kiwoom.dynamicCall("CommConnect(1)")  # CommConnect() : 괄호 안에 자동(1)을 넣는다.
        self.kiwoom.OnEventConnect.connect(self.login_Connect)
        self.kiwoom.OnReceiveTrData.connect(self.trdata_get)

        self.login_event_loop = QEventLoop()
        self.login_event_loop.exec_()

        self.kiwoom.dynamicCall("GetCommonFunc(QString, QString)", "ShowAccountWindow", "")  # 계좌번호 입력창을 띄우는 내부함수

        self.nq_max_price_list = []
        self.nq_min_price_list = []

        self.stc_fast_d_list = []

        self.stc_slow_k_list_close_min = []
        self.stc_slow_k_list_max_min = []

        self.stc_slow_d_list_row = []
        self.stc_slow_d_list = []

        self.stc_slow_k_forth_list = []

        self.stc_fast_k_weighting = 2 / (3 + 1)
        self.stc_slow_d_weighting = 2 / (5 + 1)
        self.stc_oscillator_d_weighting = 2 / (26+1)
        self.stc_oscillator_d_9_weighting = 2 / (9+1)

        self.stc_slow_oscillator_k_26_close_min_list = []
        self.stc_slow_oscillator_k_26_max_min_list = []

        self.stc_slow_oscillator_final = []

    def login_Connect(self, err_code):
        if err_code == 0:
            print('로그인 성공했습니다!')
        else:
            print('로그인 실패했습니다!')
        self.login_event_loop.exit()

    ########## 키움서버에 TR 요청하는 함수 모음 ##########
    def rq_data_opc10002(self, stock_code_num, time_unit):  # 1분봉 데이터 조회
        self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "종목코드", stock_code_num)
        self.kiwoom.dynamicCall("SetInputValue(QString,QString)", "시간단위", time_unit)
        self.kiwoom.dynamicCall("CommRqData(QString, QString, QString, QString)", "opc_10002", "opc10002", "", "1002")
        self.tr_event_loop = QEventLoop()
        self.tr_event_loop.exec_()

    ########## OnReceiveTrData을 통해 수신받은 데이터 함수  ##########
    def trdata_get(self, scrno, rqname, trcode, recordname, prenext):
        if rqname == "opc_10002":

            self.tr_event_loop.exit()

            btl.stochastic_searching()

    def stochastic_searching(self):
        ########## 스토캐스틱 패스트 %K, %D ##########
        for i in range(0, 30):  # 현재 분의 STC_패스트 K, D 구하기
            for j in range(i, i + 5):
                self.close_price_row_data = abs(float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opc_10002", "opc10002", i, "현재가").strip()))
                max_price_row_data = abs(float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opc_10002", "opc10002", j, "고가").strip()))
                min_price_row_data = abs(float(self.kiwoom.dynamicCall("GetCommData(QString,QString,int,QString)", "opc_10002", "opc10002", j, "저가").strip()))

                self.nq_max_price_list.append(max_price_row_data)
                self.nq_min_price_list.append(min_price_row_data)

            self.close_price_first = self.close_price_row_data
            self.max_price_first = max(self.nq_max_price_list)
            self.min_price_first = min(self.nq_min_price_list)

            self.nq_max_price_list = []
            self.nq_min_price_list = []

            self.stc_fast_k_first = (self.close_price_first - self.min_price_first) / (self.max_price_first - self.min_price_first) * 100
            self.stc_fast_k_first = round(self.stc_fast_k_first, 2)  # 소수 셋째자리에서 반올림

            self.stc_fast_d_list.append(self.stc_fast_k_first)

        self.stc_fast_d_list_final = self.stc_fast_d_list[::-1]
        self.stc_fast_k = self.stc_fast_d_list_final[29]

        self.stc_fast_d_list = []

        for i in range(len(self.stc_fast_d_list_final)):
            if i == 0:
                self.stc_fast_d_first = self.stc_fast_d_list_final[i]
            elif i >= 1:
                self.stc_fast_d_second = (self.stc_fast_d_list_final[i] * self.stc_fast_k_weighting) + (self.stc_fast_d_first * (1 - self.stc_fast_k_weighting))
                self.stc_fast_d_first = self.stc_fast_d_second

        self.stc_fast_d_list_final = []

        self.stc_fast_k = round(self.stc_fast_k, 2)
        self.stc_fast_d = round(self.stc_fast_d_second, 2)

        print(self.stc_fast_k)
        print(self.stc_fast_d)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    btl = btl_system()

    btl.rq_data_opc10002("NQZ23", "1")

    app.exec_()

6. 마치며

1분봉 조회를 통해 Stochastic Fast %F, %D를 구해보았다. 원래 이렇게 글을 길게 쓰지 않는다. 글을 2번 쪼개서 쓸까 생각하다가 그래도 하나로 합쳐서 써야 "글을 이해"하는데 도움이 될 거라 생각되어, 내용을 길게 쓴 것이니 양해해 주시리라 믿는다.
 
다음 글에서는 Stochastic Slow %F, %D 구하는 방법을 알아보자.
 

반응형