AUTO TRADE
좌측 카테고리를 눌러서 주제를 선택하시기 바랍니다.
-
지난 게시글에서 self.order_info 변수가 동작하는 로직과 실제로 어떻게 동작하는지(어느 지점에서 데이터가 입력되고 어느 지점에서 데이터가 삭제되는지 등)에 대해 살펴보았다. 이제부터는 이 self.order_info 데이터를 기반으로 하여 동작시킬 수 있는 여러 가지 기능들을 구현해볼 예정이다. tableWidget 구현하기 앞서 실시간으로 등록한 종목들을 대상으로 tableWidget에 데이터를 추가하는 방법을 살펴봤었는데, 여기서 구현할 기능 역시 그 때 당시에 사용했던 방법과 동일한 로직으로 진행할 예정이다. GUI 파일 내에 tableWidget을 생성하고, 그를 self.order_info 변수와 연동시켜 동작하도록 할 것이다. 일단, GUI에 tableWidget부터 생성해보자. t..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (5) - self.order_info 변수 tableWidget과 연동하기지난 게시글에서 self.order_info 변수가 동작하는 로직과 실제로 어떻게 동작하는지(어느 지점에서 데이터가 입력되고 어느 지점에서 데이터가 삭제되는지 등)에 대해 살펴보았다. 이제부터는 이 self.order_info 데이터를 기반으로 하여 동작시킬 수 있는 여러 가지 기능들을 구현해볼 예정이다. tableWidget 구현하기 앞서 실시간으로 등록한 종목들을 대상으로 tableWidget에 데이터를 추가하는 방법을 살펴봤었는데, 여기서 구현할 기능 역시 그 때 당시에 사용했던 방법과 동일한 로직으로 진행할 예정이다. GUI 파일 내에 tableWidget을 생성하고, 그를 self.order_info 변수와 연동시켜 동작하도록 할 것이다. 일단, GUI에 tableWidget부터 생성해보자. t..
2022.09.18 -
지난 게시글에서 설명했듯, 이번 게시글에서는 "접수"가 아닌 "체결" 데이터가 발생했을 때, 관련 데이터를 어떻게 처리해야 하는지에 대해 생각해보고 그를 코드로 구현해볼 예정이다. 접수와 체결의 차이점 궁극적으로, 주문 접수와 체결을 서로 달리하여 self.order_info 변수를 수정하는 이유는 단순하다. 접수 시에 접수된 주문 정보를 입력하고, 체결 시에는 접수된 주문 정보를 삭제해야 하기 때문이다. 만약 접수된 후에 모두 체결된 주문에 대해 삭제가 이루어지는 기능이 구현되어 있지 않다면, self.order_info 변수는 계속해서 의미없는 크기만 커질 것이다. 그럼 우리는 어떤 변수를 기준으로 하여 self.order_info 내에 입력되어 있는 접수 주문 데이터 삭제할 수 있을까? 그 답은 간..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (4) - self.order_info 변수 생성하기 ②지난 게시글에서 설명했듯, 이번 게시글에서는 "접수"가 아닌 "체결" 데이터가 발생했을 때, 관련 데이터를 어떻게 처리해야 하는지에 대해 생각해보고 그를 코드로 구현해볼 예정이다. 접수와 체결의 차이점 궁극적으로, 주문 접수와 체결을 서로 달리하여 self.order_info 변수를 수정하는 이유는 단순하다. 접수 시에 접수된 주문 정보를 입력하고, 체결 시에는 접수된 주문 정보를 삭제해야 하기 때문이다. 만약 접수된 후에 모두 체결된 주문에 대해 삭제가 이루어지는 기능이 구현되어 있지 않다면, self.order_info 변수는 계속해서 의미없는 크기만 커질 것이다. 그럼 우리는 어떤 변수를 기준으로 하여 self.order_info 내에 입력되어 있는 접수 주문 데이터 삭제할 수 있을까? 그 답은 간..
2022.09.16 -
지난 게시글에서는 원주문번호가 발생하는 논리구조에 대해 살펴보았다. 이번 게시글에서는 종목 별로 발생하는 원주문번호를 어떻게 관리해야 할지에 대해 살펴볼 예정이다. 원주문번호를 관리하는 것은 여태 구현하는 모든 기능들이 그러했듯이, 별도의 데이터프레임( DataFrame )을 만들어서 관리할 예정이다. 이 데이터프레임의 이름은 바로 self.order_info 가 되는데, 이 데이터프레임의 칼럼으로는 어떠한 것들을 생성해줘야 추후에 데이터를 정확하게 관리할 수 있을까? order_info 변수에 어떤 구조의 기능을 구현할 것인가? 우리가 구현해야 할 내용에 대해 조금만 생각해보면 이 변수가 가지고 있어야 할 데이터는 의외로 단순하다. 우리가 주문 정보를 관리하는 데에 있어서 필요한 건 말 그대로 주문 정..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (3) - order_info 변수 생성하기 ①지난 게시글에서는 원주문번호가 발생하는 논리구조에 대해 살펴보았다. 이번 게시글에서는 종목 별로 발생하는 원주문번호를 어떻게 관리해야 할지에 대해 살펴볼 예정이다. 원주문번호를 관리하는 것은 여태 구현하는 모든 기능들이 그러했듯이, 별도의 데이터프레임( DataFrame )을 만들어서 관리할 예정이다. 이 데이터프레임의 이름은 바로 self.order_info 가 되는데, 이 데이터프레임의 칼럼으로는 어떠한 것들을 생성해줘야 추후에 데이터를 정확하게 관리할 수 있을까? order_info 변수에 어떤 구조의 기능을 구현할 것인가? 우리가 구현해야 할 내용에 대해 조금만 생각해보면 이 변수가 가지고 있어야 할 데이터는 의외로 단순하다. 우리가 주문 정보를 관리하는 데에 있어서 필요한 건 말 그대로 주문 정..
2022.09.04 -
지난 게시글에서 OnReceiveChejanData 이벤트가 발생했을 때 def receive_chejandata 함수로 연결되도록 하는 기능까지 구현했으며, 이번 게시글에서는 해당 함수 내에서 어떤 로직의 코드를 구현해야 하는지에 대해 살펴보자. Gubun에 따른 데이터 구분하기 def receive_chejandata(self, Gubun, ItemCnt, FidList): """ Gubun(string) - 0:주문체결통보, 1:국내주식잔고통보, 4:파생상품잔고통보 FidList(string) - 데이터 구분은 ;이다. """ pass 위의 코드에서 확인할 수 있듯이, Gubun이라는 것은 0일 경우 주문체결통보를 의미하며 1일 경우 국내주식 잔고통보를 의미한다. 자세한 설명은 넘어가고, 일단 Gu..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (2) - chejandata 이벤트 처리하기지난 게시글에서 OnReceiveChejanData 이벤트가 발생했을 때 def receive_chejandata 함수로 연결되도록 하는 기능까지 구현했으며, 이번 게시글에서는 해당 함수 내에서 어떤 로직의 코드를 구현해야 하는지에 대해 살펴보자. Gubun에 따른 데이터 구분하기 def receive_chejandata(self, Gubun, ItemCnt, FidList): """ Gubun(string) - 0:주문체결통보, 1:국내주식잔고통보, 4:파생상품잔고통보 FidList(string) - 데이터 구분은 ;이다. """ pass 위의 코드에서 확인할 수 있듯이, Gubun이라는 것은 0일 경우 주문체결통보를 의미하며 1일 경우 국내주식 잔고통보를 의미한다. 자세한 설명은 넘어가고, 일단 Gu..
2022.09.04 -
키움증권 Open API를 활용한 자동 매매 시스템을 구현하기 위해서는 주문과 그 결과로 발생하는 데이터, 그리고 그 과정에서 발생하는 데이터를 관리해줘야 할 필요성이 있다. 그렇게 하기 위해 가장 먼저 구현해야 하는 기능은 주문 기능인데, 이 역시 다른 함수와 마찬가지로 캡슐화된 주문 함수를 제작해보도록 하자. 주문 함수 제작하기 여느 함수와 마찬가지로, 주문 함수를 제작하는 것은 크게 어렵지 않다. 개발가이드 내에서는 SendOrder라는 개념을 사용하고 있기 때문에, 다른 함수와 동일한 로직에 따라 주문 함수를 제작하면 된다. """SendOrder 함수 실행""" def __sendorder(self): pass 그렇다면 여기서 함수를 실행하기 위해 함수 내에 전달해줘야 하는 인자로는 어떤 인자들..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (1) - 주문 접수 함수 제작하기키움증권 Open API를 활용한 자동 매매 시스템을 구현하기 위해서는 주문과 그 결과로 발생하는 데이터, 그리고 그 과정에서 발생하는 데이터를 관리해줘야 할 필요성이 있다. 그렇게 하기 위해 가장 먼저 구현해야 하는 기능은 주문 기능인데, 이 역시 다른 함수와 마찬가지로 캡슐화된 주문 함수를 제작해보도록 하자. 주문 함수 제작하기 여느 함수와 마찬가지로, 주문 함수를 제작하는 것은 크게 어렵지 않다. 개발가이드 내에서는 SendOrder라는 개념을 사용하고 있기 때문에, 다른 함수와 동일한 로직에 따라 주문 함수를 제작하면 된다. """SendOrder 함수 실행""" def __sendorder(self): pass 그렇다면 여기서 함수를 실행하기 위해 함수 내에 전달해줘야 하는 인자로는 어떤 인자들..
2022.09.04 -
지난 게시글에 이어 이번 게시글에서는 현재 시각이 15시 30분 이전인가 이후인가에 따라 당일 기준 최신 거래일을 어떻게 반환할 것인가에 대한 이야기를 해볼까 한다. 이 내용이 중요한 이유는 바로 추후에 구현할 기능 때문이다. 사실 이유를 알고 나면 간단한 내용이지만, 막상 구현할 때에는 이번 게시글에서 설명하고자 하는 부분을 놓치기 쉽다. 15시 30분을 기준으로 최신 거래일 데이터를 결정하는 이유 예를 들어, 8월 26일과 8월 25일 모두 정상적인 거래일이며 지금 현재 시각은 8월 26일 오전 9시 01분이라고 가정해보자. 그렇다면 지금 시점에서 가장 최신의 거래일자는 8월 26일이겠지만 예상외로 우리는 8월 25일이라는 값을 최신 거래일로 가져가야 한다. 이제부터 그 이유를 한 번 살펴보자. 기본..
[자동 매매 시스템 구축하기] 일자 데이터 구현하기 ②지난 게시글에 이어 이번 게시글에서는 현재 시각이 15시 30분 이전인가 이후인가에 따라 당일 기준 최신 거래일을 어떻게 반환할 것인가에 대한 이야기를 해볼까 한다. 이 내용이 중요한 이유는 바로 추후에 구현할 기능 때문이다. 사실 이유를 알고 나면 간단한 내용이지만, 막상 구현할 때에는 이번 게시글에서 설명하고자 하는 부분을 놓치기 쉽다. 15시 30분을 기준으로 최신 거래일 데이터를 결정하는 이유 예를 들어, 8월 26일과 8월 25일 모두 정상적인 거래일이며 지금 현재 시각은 8월 26일 오전 9시 01분이라고 가정해보자. 그렇다면 지금 시점에서 가장 최신의 거래일자는 8월 26일이겠지만 예상외로 우리는 8월 25일이라는 값을 최신 거래일로 가져가야 한다. 이제부터 그 이유를 한 번 살펴보자. 기본..
2022.08.28 -
지난 게시글까지가 알고리즘을 이용해서 종목별 매수 예정 가격 데이터를 계산해내는 기능을 구현하는 방법에 대한 설명이었다. 이번 게시글에서는 일자 데이터를 구현할 예정인데, 일자 데이터를 구현하는 것은 생각보다 다양한 요소들을 고려해야 한다. 왜냐하면 주식 시장에는 장이 시작되고 종료되는 일정한 시간이 있기 때문이다. 일자 데이터를 어떻게 구현할까? 일단 방법론만 생각해보자면 상당히 간단한 모듈로 일자 데이터를 얻어올 수 있다. 가장 대표적인 것이 datetime 모듈인데, 예제로 간단하게 살펴보도록 하자. >>> import datetime >>> datetime.datetime.now() >>> datetime.datetime(2022, 8, 28, 15, 17, 27, 453139) 일단 dateti..
[자동 매매 시스템 구축하기] 일자 데이터 구현하기 ①지난 게시글까지가 알고리즘을 이용해서 종목별 매수 예정 가격 데이터를 계산해내는 기능을 구현하는 방법에 대한 설명이었다. 이번 게시글에서는 일자 데이터를 구현할 예정인데, 일자 데이터를 구현하는 것은 생각보다 다양한 요소들을 고려해야 한다. 왜냐하면 주식 시장에는 장이 시작되고 종료되는 일정한 시간이 있기 때문이다. 일자 데이터를 어떻게 구현할까? 일단 방법론만 생각해보자면 상당히 간단한 모듈로 일자 데이터를 얻어올 수 있다. 가장 대표적인 것이 datetime 모듈인데, 예제로 간단하게 살펴보도록 하자. >>> import datetime >>> datetime.datetime.now() >>> datetime.datetime(2022, 8, 28, 15, 17, 27, 453139) 일단 dateti..
2022.08.28 -
지난 게시글에서는 차트 데이터를 알고리즘 파일에 전달한 후 계산 절차를 거쳐 매수 예정 가격 데이터를 얻어오는 기능까지 모두 구현했다. 이번 게시글에서는 종목별로 계산된 매수 예정 가격 데이터 데이터프레임을 모두 합쳐서 하나의 파일로 만든 후에, 그 결과 데이터를 확인하는 것까지 구현할 예정이다. 합칠 대상이 되는 데이터프레임 변수 생성하기 algorithm_1.py 파일 내에서는 _df.py 파일 내에 있는 def algo1_df() 를 호출해서 함수에서 반환되는 데이터프레임에 데이터를 입력했었다. 이와 마찬가지로 main.py 파일 내에서도 동일한 변수를 호출해서 algorithm_1.py 파일로부터 전달받은 데이터를 입력할 변수를 생성한 후에 해당 변수에 매수 예정 가격 데이터가 담긴 result[..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (14) - 매수 예정 종목 데이터프레임 확인하기 ③지난 게시글에서는 차트 데이터를 알고리즘 파일에 전달한 후 계산 절차를 거쳐 매수 예정 가격 데이터를 얻어오는 기능까지 모두 구현했다. 이번 게시글에서는 종목별로 계산된 매수 예정 가격 데이터 데이터프레임을 모두 합쳐서 하나의 파일로 만든 후에, 그 결과 데이터를 확인하는 것까지 구현할 예정이다. 합칠 대상이 되는 데이터프레임 변수 생성하기 algorithm_1.py 파일 내에서는 _df.py 파일 내에 있는 def algo1_df() 를 호출해서 함수에서 반환되는 데이터프레임에 데이터를 입력했었다. 이와 마찬가지로 main.py 파일 내에서도 동일한 변수를 호출해서 algorithm_1.py 파일로부터 전달받은 데이터를 입력할 변수를 생성한 후에 해당 변수에 매수 예정 가격 데이터가 담긴 result[..
2022.08.28 -
이전 게시글까지 알고리즘에 의해 매수 예정 가격 등을 포함한 결과 데이터가 정상적으로 전달되고 있음을 확인했으므로 main.py 파일 내에서 조건검색식에 의해 집계된 종목의 일봉 및 분봉 데이터를 algorithm_1.py 파일로 전달한 후 그 결과값을 반환받아보도록 하자. 근본적으로 삼성전자는 조건검색식에 의해 잘 집계되지 않으므로, 여태까지 살펴봤던 삼성전자는 이제 더 이상 등장하지 않을 것이다. 차트 데이터를 전달해보자. 이제 구현해야 할 기능은 바로 조건검색식에 의해 집계된 종목의 차트 데이터를 조회하는 버튼( pushButton_7 )이 클릭된 순간 해당 종목의 차트 데이터를 조회함과 동시에 조회가 완료된 경우 algorithm_1.py 파일로 해당 차트 데이터를 전달하여 알고리즘에 의해 계산된..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (13) - 매수 예정 종목 데이터프레임 확인하기 ②이전 게시글까지 알고리즘에 의해 매수 예정 가격 등을 포함한 결과 데이터가 정상적으로 전달되고 있음을 확인했으므로 main.py 파일 내에서 조건검색식에 의해 집계된 종목의 일봉 및 분봉 데이터를 algorithm_1.py 파일로 전달한 후 그 결과값을 반환받아보도록 하자. 근본적으로 삼성전자는 조건검색식에 의해 잘 집계되지 않으므로, 여태까지 살펴봤던 삼성전자는 이제 더 이상 등장하지 않을 것이다. 차트 데이터를 전달해보자. 이제 구현해야 할 기능은 바로 조건검색식에 의해 집계된 종목의 차트 데이터를 조회하는 버튼( pushButton_7 )이 클릭된 순간 해당 종목의 차트 데이터를 조회함과 동시에 조회가 완료된 경우 algorithm_1.py 파일로 해당 차트 데이터를 전달하여 알고리즘에 의해 계산된..
2022.08.28 -
지난 게시글에서 매수 예정 가격 데이터를 데이터프레임화 하였다. 따라서 이번 게시글에서는 해당 파일로부터 데이터를 어떻게 반환받을 수 있는지 살펴보고자 한다. 기본적인 방법론 사실 쓸데없는 내용이라 생각할 수도 있겠지만(정말로 쓸데없는 내용일 수도 있겠지만), 클래스(class)와 클래스 내 함수(def)로부터 반환값을 얻어오는 방법은 단순하다. 예를 들어 아래와 같이 calculator 라는 클래스 내에 add, sub, multiple 이라는 세 개의 함수가 있다고 가정해보자. 해당 클래스는 value1 과 value2 라는 두 개의 변수를 요구하고 있으며, 각각 특정 함수가 실행될 경우 해당 함수에서는 사전에 받은 값 두 개에 대한 산식을 처리한 결과값을 반환하도록 하고 있다. class calcu..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (12) - 매수 예정 종목 데이터프레임 확인하기 ①지난 게시글에서 매수 예정 가격 데이터를 데이터프레임화 하였다. 따라서 이번 게시글에서는 해당 파일로부터 데이터를 어떻게 반환받을 수 있는지 살펴보고자 한다. 기본적인 방법론 사실 쓸데없는 내용이라 생각할 수도 있겠지만(정말로 쓸데없는 내용일 수도 있겠지만), 클래스(class)와 클래스 내 함수(def)로부터 반환값을 얻어오는 방법은 단순하다. 예를 들어 아래와 같이 calculator 라는 클래스 내에 add, sub, multiple 이라는 세 개의 함수가 있다고 가정해보자. 해당 클래스는 value1 과 value2 라는 두 개의 변수를 요구하고 있으며, 각각 특정 함수가 실행될 경우 해당 함수에서는 사전에 받은 값 두 개에 대한 산식을 처리한 결과값을 반환하도록 하고 있다. class calcu..
2022.08.27 -
지난 게시글에서 특정 종목의 매수 예정 가격을 계산해두었는데, 아직 수행되지 않은 한 가지 작업이 남아 있다. 바로 매도 예정 가격이다. 사실 첫 게시글에서 5일 이동평균선이 10일 이동평균선을 이탈했을 때 매도하는 전략을 수립해서 그 전략을 기반으로 거래를 진행하도록 하는 자동 매매 시스템을 구현하고자 했으나, 사실 따지고 보면 5일 이동평균선과 10일 이동평균선 간 데드 크로스 역시 특정 봉이 발생해야 판단할 수 있는 개념이기 때문에, 사전에 매도 예정 가격을 계산하기가 어렵다. 따라서 원래는 매도 예정 가격도 함께 계산하여 매수 함수와 매도 함수를 모두 작성하려 했으나, 아쉽게도 매수 함수만 작성하고 그 방법을 응용해서 매도 함수를 직접 작성하는 방법밖에는 없을 것 같다는 생각을 하게 된다. 매도 ..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (11) - 알고리즘 구현하기 ⑥지난 게시글에서 특정 종목의 매수 예정 가격을 계산해두었는데, 아직 수행되지 않은 한 가지 작업이 남아 있다. 바로 매도 예정 가격이다. 사실 첫 게시글에서 5일 이동평균선이 10일 이동평균선을 이탈했을 때 매도하는 전략을 수립해서 그 전략을 기반으로 거래를 진행하도록 하는 자동 매매 시스템을 구현하고자 했으나, 사실 따지고 보면 5일 이동평균선과 10일 이동평균선 간 데드 크로스 역시 특정 봉이 발생해야 판단할 수 있는 개념이기 때문에, 사전에 매도 예정 가격을 계산하기가 어렵다. 따라서 원래는 매도 예정 가격도 함께 계산하여 매수 함수와 매도 함수를 모두 작성하려 했으나, 아쉽게도 매수 함수만 작성하고 그 방법을 응용해서 매도 함수를 직접 작성하는 방법밖에는 없을 것 같다는 생각을 하게 된다. 매도 ..
2022.08.27 -
파이썬에서는 오류를 처리하는 데에 있어 try:와 except: 두 가지를 가장 주로 사용한다. try:와 except:의 사용 방법 주로 try: 하단에는 실행할 코드를 작성하고 except: 하단에는 오류 발생 시에 실행할 코드를 작성한다. 아래의 예시를 살펴보자. a = [0] print(a[1]) a라는 변수는 리스트(list) 형태의 자료형이고, 0이라는 값 하나만 입력돼있다. 따라서 a라는 변수 내에 입력돼 있는 데이터에 접근하기 위한 방법은 a[0]과 a[-1] 두 가지 밖에 없는데, Line 3 에서와 같이 print(a[1])을 사용하게 되면 아래의 Line 5 와 같이 IndexError 가 발생하게 된다. >>> print(a[1]) Traceback (most recent call ..
파이썬, try:와 except:의 동작 구조파이썬에서는 오류를 처리하는 데에 있어 try:와 except: 두 가지를 가장 주로 사용한다. try:와 except:의 사용 방법 주로 try: 하단에는 실행할 코드를 작성하고 except: 하단에는 오류 발생 시에 실행할 코드를 작성한다. 아래의 예시를 살펴보자. a = [0] print(a[1]) a라는 변수는 리스트(list) 형태의 자료형이고, 0이라는 값 하나만 입력돼있다. 따라서 a라는 변수 내에 입력돼 있는 데이터에 접근하기 위한 방법은 a[0]과 a[-1] 두 가지 밖에 없는데, Line 3 에서와 같이 print(a[1])을 사용하게 되면 아래의 Line 5 와 같이 IndexError 가 발생하게 된다. >>> print(a[1]) Traceback (most recent call ..
2022.07.31