AUTO TRADE/자동 매매 프로그램
-
지난 게시글에서는 SendOrder 메서드를 통해 주문을 접수하는 함수를 제작했고, 이번 게시글에서는 해당 함수를 활용해서 매수 매도 함수가 정상적으로 동작하도록 하기 위한 함수를 구현할 예정이다. def algo1_buy_1():을 제작해보자. 지난 게시글에서 작성했던 부분에 이어, def algo1_buy_1() 함수 내에 self._send_order() 함수를 추가해주도록 하자. """알고리즘 매수함수1""" def algo1_buy_1(): print("알고리즘1의 첫 번째 매수함수를 실행합니다.") self._send_order(): 우리는 지난 게시글에서 def _send_order() 함수를 제작하면서 SendOrder 메서드는 상당히 많은 파라미터를 요구한다는 점을 확인할 수 있었는데, ..
[자동 매매 시스템 구축하기] 매수 매도 함수 구현하기 (3) - 매수 매도 함수 발생 시 디테일한 데이터 처리 구현하기 ②지난 게시글에서는 SendOrder 메서드를 통해 주문을 접수하는 함수를 제작했고, 이번 게시글에서는 해당 함수를 활용해서 매수 매도 함수가 정상적으로 동작하도록 하기 위한 함수를 구현할 예정이다. def algo1_buy_1():을 제작해보자. 지난 게시글에서 작성했던 부분에 이어, def algo1_buy_1() 함수 내에 self._send_order() 함수를 추가해주도록 하자. """알고리즘 매수함수1""" def algo1_buy_1(): print("알고리즘1의 첫 번째 매수함수를 실행합니다.") self._send_order(): 우리는 지난 게시글에서 def _send_order() 함수를 제작하면서 SendOrder 메서드는 상당히 많은 파라미터를 요구한다는 점을 확인할 수 있었는데, ..
2022.12.29 -
지난 게시글에서는 매수 함수와 매도 함수가 동작하는 그 로직에 대해 살펴봤고, 이번 게시글에서는 직접 매수 함수와 매도 함수를 만들어볼 예정이다. 물론 알고리즘은 어떻게 동작하는지 알고리즘은 어떤 로직으로 동작해야 하는지 등에 대해 모두 살펴봤었지만 아직은 그 내용이 익숙하지 않을 수 있다. 그래도 일단은 한 번 만들어 보고 그 후에 오류가 발생한다면 그 내용을 수정하는 방향으로 진행해보고자 한다. (물론 제작 과정에서 본인이 직접 겪은 오류들은 발생하지 않도록 할 것이다.) 제목에서 일단 매수와 매도를 따로 구분해놓긴 했지만, 실질적으로 두 함수는 모두 SendOrder 라는 하나의 메서드를 통해 동작한다. 차이점이 있다면 단순하게 매수를 실행할 함수에서 사용되는가 아니면 매도를 실행할 함수에서 사용되..
[자동 매매 시스템 구축하기] 매수 매도 함수 구현하기 (2) - 매수 매도 함수 발생 시 디테일한 데이터 처리 구현하기 ①지난 게시글에서는 매수 함수와 매도 함수가 동작하는 그 로직에 대해 살펴봤고, 이번 게시글에서는 직접 매수 함수와 매도 함수를 만들어볼 예정이다. 물론 알고리즘은 어떻게 동작하는지 알고리즘은 어떤 로직으로 동작해야 하는지 등에 대해 모두 살펴봤었지만 아직은 그 내용이 익숙하지 않을 수 있다. 그래도 일단은 한 번 만들어 보고 그 후에 오류가 발생한다면 그 내용을 수정하는 방향으로 진행해보고자 한다. (물론 제작 과정에서 본인이 직접 겪은 오류들은 발생하지 않도록 할 것이다.) 제목에서 일단 매수와 매도를 따로 구분해놓긴 했지만, 실질적으로 두 함수는 모두 SendOrder 라는 하나의 메서드를 통해 동작한다. 차이점이 있다면 단순하게 매수를 실행할 함수에서 사용되는가 아니면 매도를 실행할 함수에서 사용되..
2022.12.29 -
이번 게시글에서부터는 실시간으로 등록되어 있는 데이터를 기반으로 매수와 매도 함수가 동작하도록 하는 로직을 구현하는 방법에 대해 살펴볼 예정이다. 특정 종목을 실시간으로 등록하는 방법은 실시간 데이터 얻기 (1) 게시글부터 다루고 있으니, 아직 구현하지 않았다면 해당 게시글을 바탕으로 기능을 구현하고 나서 넘어 오도록 하자. 실시간 데이터를 기반으로 한 거래의 방법 실시간 데이터를 기반으로 거래를 진행하는 방법은 의외로 단순하다. 현재가 데이터가 발생했을 때, 해당 가격이 기존에 설정한 매수 가격의 범위 내에 들어가 있다면 매수 함수가 동작하도록 하면 된다. 매수 함수는 기본적으로 SendOrder 함수를 통해 동작하게 되는데, 아직은 함수를 구현하지 않은 상태일 것이다. 그렇다면 기존에 설정한 매수 가..
[자동 매매 시스템 구축하기] 매수 매도 함수 구현하기 (1) - 실시간 등록을 기반으로 한 매수 매도 함수의 동작 방법이번 게시글에서부터는 실시간으로 등록되어 있는 데이터를 기반으로 매수와 매도 함수가 동작하도록 하는 로직을 구현하는 방법에 대해 살펴볼 예정이다. 특정 종목을 실시간으로 등록하는 방법은 실시간 데이터 얻기 (1) 게시글부터 다루고 있으니, 아직 구현하지 않았다면 해당 게시글을 바탕으로 기능을 구현하고 나서 넘어 오도록 하자. 실시간 데이터를 기반으로 한 거래의 방법 실시간 데이터를 기반으로 거래를 진행하는 방법은 의외로 단순하다. 현재가 데이터가 발생했을 때, 해당 가격이 기존에 설정한 매수 가격의 범위 내에 들어가 있다면 매수 함수가 동작하도록 하면 된다. 매수 함수는 기본적으로 SendOrder 함수를 통해 동작하게 되는데, 아직은 함수를 구현하지 않은 상태일 것이다. 그렇다면 기존에 설정한 매수 가..
2022.12.08 -
지난 게시글에서 종목코드와 전일 종가 데이터를 인자로 전달받아 상한가와 하한가를 계산해내는 함수를 구현했다. 그렇다면 이제 실제 데이터를 입력해봄으로써 상하한가 데이터를 올바르게 계산하고 있는지를 확인해보도록 하자. 여태까지 제작했던 게시글을 새로운 파일에서 새로운 클래스 내에 입력해서 테스트해볼 것인데, 그 코드는 아래와 같다. def __init__(self): 부분에서는 해당 클래스가 실행되었을 때 실행되는 부분을 의미한다. 즉, test라는 클래스가 호출됐을 때 self.kospi_code_list 와 self.kosdaq_code_list 변수 내에 각각 ['005930', '066580'], ['000020', '000040']이라는 데이터를 입력하도록 하는 것이다. 다만 우리는..
[자동 매매 시스템 구축하기] 상하한가 데이터 계산하기 (4) - 실제 데이터 확인해보기지난 게시글에서 종목코드와 전일 종가 데이터를 인자로 전달받아 상한가와 하한가를 계산해내는 함수를 구현했다. 그렇다면 이제 실제 데이터를 입력해봄으로써 상하한가 데이터를 올바르게 계산하고 있는지를 확인해보도록 하자. 여태까지 제작했던 게시글을 새로운 파일에서 새로운 클래스 내에 입력해서 테스트해볼 것인데, 그 코드는 아래와 같다. def __init__(self): 부분에서는 해당 클래스가 실행되었을 때 실행되는 부분을 의미한다. 즉, test라는 클래스가 호출됐을 때 self.kospi_code_list 와 self.kosdaq_code_list 변수 내에 각각 ['005930', '066580'], ['000020', '000040']이라는 데이터를 입력하도록 하는 것이다. 다만 우리는..
2022.12.03 -
지난 게시글에서 호가가격단위 미만 절사를 적용하는 함수를 구현했으니, 이번에는 전달받은 종목코드를 기반으로 시장을 구분하고 그 시장 구분에 따라 각기 달리 적용되는 가격 범위 내에서 각기 다른 measure 값을 전달하도록 하는 함수를 구현해보도록 하자. 상하한가 계산 함수 생성하기 이번에 생성할 함수는 종목코드와 전일 종가(이하 기준 가격) 데이터를 받아온 후에 그 데이터를 기반으로 코스피와 코스닥 등의 시장 구분을 하고, 시장 구분에 따라 각기 다른 함수를 적용하여 상하한가를 계산하는 함수이다. def cal_limit(self, item_code, yclose): yclose = int(yclose) price_range = float(yclose * 0.3) 가장 먼저 cal_limit 이라는 이..
[자동 매매 시스템 구축하기] 상하한가 데이터 계산하기 (3) - 상하한가 계산 함수 생성하기지난 게시글에서 호가가격단위 미만 절사를 적용하는 함수를 구현했으니, 이번에는 전달받은 종목코드를 기반으로 시장을 구분하고 그 시장 구분에 따라 각기 달리 적용되는 가격 범위 내에서 각기 다른 measure 값을 전달하도록 하는 함수를 구현해보도록 하자. 상하한가 계산 함수 생성하기 이번에 생성할 함수는 종목코드와 전일 종가(이하 기준 가격) 데이터를 받아온 후에 그 데이터를 기반으로 코스피와 코스닥 등의 시장 구분을 하고, 시장 구분에 따라 각기 다른 함수를 적용하여 상하한가를 계산하는 함수이다. def cal_limit(self, item_code, yclose): yclose = int(yclose) price_range = float(yclose * 0.3) 가장 먼저 cal_limit 이라는 이..
2022.11.27 -
지난 게시글에서는 주식시장에서 상하한가 데이터가 어떠한 절차로 계산되는지에 대해 살펴보았다. 이번 게시글에서는 그 개념을 함수를 생성하고 함수 내에 계산 로직을 추가하는 등의 기능을 구현함으로써 상하한가 데이터를 자동적으로 계산하도록 할 것이다. 코스피와 코스닥을 먼저 구분해주자. 코스피와 코스닥을 구분하여 종목코드 리스트를 얻어오는 이유는 단순하다. 해당 종목이 상장된 시장이 코스피인가 코스닥인가에 따라 호가가격단위 미만 절사 기준 금액이 달라지기 때문이다. 실제로 대한민국 증권시장에는 약 2,000개가 넘는 종목이 상장되어 있는데, 다행히도 그 데이터를 매일매일 저장해줄 필요는 없다. 왜나하면 키움증권 Open API 내에서는 코스피 시장에 상장된 종목 리스트와 코스닥 시장에 상장된 종목 리스트를 반..
[자동 매매 시스템 구축하기] 상하한가 데이터 계산하기 (2) - 호가가격단위 절사 함수 생성하기지난 게시글에서는 주식시장에서 상하한가 데이터가 어떠한 절차로 계산되는지에 대해 살펴보았다. 이번 게시글에서는 그 개념을 함수를 생성하고 함수 내에 계산 로직을 추가하는 등의 기능을 구현함으로써 상하한가 데이터를 자동적으로 계산하도록 할 것이다. 코스피와 코스닥을 먼저 구분해주자. 코스피와 코스닥을 구분하여 종목코드 리스트를 얻어오는 이유는 단순하다. 해당 종목이 상장된 시장이 코스피인가 코스닥인가에 따라 호가가격단위 미만 절사 기준 금액이 달라지기 때문이다. 실제로 대한민국 증권시장에는 약 2,000개가 넘는 종목이 상장되어 있는데, 다행히도 그 데이터를 매일매일 저장해줄 필요는 없다. 왜나하면 키움증권 Open API 내에서는 코스피 시장에 상장된 종목 리스트와 코스닥 시장에 상장된 종목 리스트를 반..
2022.11.27 -
키움증권 Open API는 상하한가 데이터를 조회할 수 있는 트랜잭션으로 OPT10001 기능을 제공하고 있긴 하지만, 사실상 실시간 데이터를 수신하는 도중에 별도로 서버와의 통신을 시도해야 한다는 점을 고려하면 이 기능이 그렇게 달갑지 않게 다가올 수도 있다. 그렇다면 우리가 직접 상하한가를 계산하는 기능을 만들어주면 될 일이다. 그렇다면 우리는 상하한가 데이터가 언제 필요할까? 얼핏 생각해보면 굳이 필요할 것 같진 않다. 하지만 키움증권 Open API의 경우 정정 주문을 접수할 때, 시장가 주문과 지정가 주문 간에는 정정 주문이 접수되지 않는다는 점을 고려하면 반드시 필요한 기능이다. 결론부터 얘기하자면 시장가 주문을 접수했는데 체결되지 않고 지정가 주문으로 접수할 일은 없다. 다만 반대의 경우, ..
[자동 매매 시스템 구축하기] 상하한가 데이터 계산하기 (1) - 계산 방법 이해하기키움증권 Open API는 상하한가 데이터를 조회할 수 있는 트랜잭션으로 OPT10001 기능을 제공하고 있긴 하지만, 사실상 실시간 데이터를 수신하는 도중에 별도로 서버와의 통신을 시도해야 한다는 점을 고려하면 이 기능이 그렇게 달갑지 않게 다가올 수도 있다. 그렇다면 우리가 직접 상하한가를 계산하는 기능을 만들어주면 될 일이다. 그렇다면 우리는 상하한가 데이터가 언제 필요할까? 얼핏 생각해보면 굳이 필요할 것 같진 않다. 하지만 키움증권 Open API의 경우 정정 주문을 접수할 때, 시장가 주문과 지정가 주문 간에는 정정 주문이 접수되지 않는다는 점을 고려하면 반드시 필요한 기능이다. 결론부터 얘기하자면 시장가 주문을 접수했는데 체결되지 않고 지정가 주문으로 접수할 일은 없다. 다만 반대의 경우, ..
2022.11.27 -
이번 게시글에서는 키움증권 Open API를 활용한 주문 데이터 관리 기능을 구현하기 위해 꼭 알고 있어야 하는 필요한 요소에 대해 살펴보고자 한다. 첫째, 원주문번호 데이터를 관리해야 한다. 앞서 주문 데이터를 관리하기 위한 기능을 구현하는 과정에서 살펴봤듯이, 신규 주문과 정정 주문 등 주문의 유형 별로 발생하는 데이터의 형태가 다르고 해당 데이터를 처리해야 하는 방법도 상이하다. 따라서 어떤 주문이 되었든 간에 주문이 접수되었다면 해당 주문의 원주문번호를 반드시 기록해야 하고, 해당 원주문번호는 다른 곳에서 쉽게 찾아서 사용할 수 있도록 종목코드 및 주문 수량 등과 같은 데이터와 함께 하나의 몸처럼 움직이도록 관리해줘야 한다. 둘째, 주문은 1초에 5회까지만 가능하다. 이 내용은 특히 장이 시작되면..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (8) - 주문 관련 기능 구현 시 주의할 점이번 게시글에서는 키움증권 Open API를 활용한 주문 데이터 관리 기능을 구현하기 위해 꼭 알고 있어야 하는 필요한 요소에 대해 살펴보고자 한다. 첫째, 원주문번호 데이터를 관리해야 한다. 앞서 주문 데이터를 관리하기 위한 기능을 구현하는 과정에서 살펴봤듯이, 신규 주문과 정정 주문 등 주문의 유형 별로 발생하는 데이터의 형태가 다르고 해당 데이터를 처리해야 하는 방법도 상이하다. 따라서 어떤 주문이 되었든 간에 주문이 접수되었다면 해당 주문의 원주문번호를 반드시 기록해야 하고, 해당 원주문번호는 다른 곳에서 쉽게 찾아서 사용할 수 있도록 종목코드 및 주문 수량 등과 같은 데이터와 함께 하나의 몸처럼 움직이도록 관리해줘야 한다. 둘째, 주문은 1초에 5회까지만 가능하다. 이 내용은 특히 장이 시작되면..
2022.09.25 -
지난 게시글에서는 정정 주문이 발생했을 때 어떠한 절차에 따라 데이터가 발생하는지에 대해 살펴보고 프로그램이 그 순서에 따라 오류 없이 동작하도록 구현하기 위해 고려해야 하는 부분에 대해 살펴보았다. 그러면서 원주문 번호가 0000000일 때 해당 종목 코드 데이터가 self.order_info 변수 내에 입력되어 있는지 아닌지를 기준으로 신규 주문인가 정정 주문인가를 구분하여 각각 데이터를 다르게 입력하도록 구현하였다. 이번 게시글에서는 지난 번에 다루지 않은 원주문 번호가 000000이 아닌 경우에는 어떻게 데이터를 입력할 것인지에 대해 살펴보고, 마찬가지로 오류 없이 데이터를 입력하도록 하기 위한 코드를 구현할 계획이다. 원주문번호가 0000000이 아닌 경우 앞서 설명했듯이, 원주문번호가 0000..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (7) - 정정 주문 데이터 로직 확인하기 ②지난 게시글에서는 정정 주문이 발생했을 때 어떠한 절차에 따라 데이터가 발생하는지에 대해 살펴보고 프로그램이 그 순서에 따라 오류 없이 동작하도록 구현하기 위해 고려해야 하는 부분에 대해 살펴보았다. 그러면서 원주문 번호가 0000000일 때 해당 종목 코드 데이터가 self.order_info 변수 내에 입력되어 있는지 아닌지를 기준으로 신규 주문인가 정정 주문인가를 구분하여 각각 데이터를 다르게 입력하도록 구현하였다. 이번 게시글에서는 지난 번에 다루지 않은 원주문 번호가 000000이 아닌 경우에는 어떻게 데이터를 입력할 것인지에 대해 살펴보고, 마찬가지로 오류 없이 데이터를 입력하도록 하기 위한 코드를 구현할 계획이다. 원주문번호가 0000000이 아닌 경우 앞서 설명했듯이, 원주문번호가 0000..
2022.09.25 -
지난 게시글에서는 사전에 생성했던 tableWidget 객체이며 주문 정보 데이터를 입력할 객체인 tableWidget_2 에 주문과 관련된 정보를 입력하는 기능을 구현했다. 사실 주문의 접수와 체결로 인해 발생하는 여러 데이터를 처리하고 GUI를 통해 나타내도록 하는 기능은 지금까지 모두 구현했다고 봐도 무방하지만, 이번 게시글에서는 더 나아가 단순한 주문 접수 외에 정정 주문과 취소 주문이 이루어졌을 때 데이터가 어떤 절차를 거쳐 발생하게 되며 우리는 그 데이터를 어떻게 처리해야 하는지에 대해 살펴볼 예정이다. 정정 주문과 취소 주문의 동작 로직 def recieve_chejandata 함수 내에서, 1차적으로 sGubun 에 의해 국내주식 잔고통보인가 아니면 주식체결통보인가를 구분해낸다. 이후 sG..
[자동 매매 시스템 구축하기] 주문 정보 관리하기 (6) - 정정 주문 데이터 로직 확인하기 ①지난 게시글에서는 사전에 생성했던 tableWidget 객체이며 주문 정보 데이터를 입력할 객체인 tableWidget_2 에 주문과 관련된 정보를 입력하는 기능을 구현했다. 사실 주문의 접수와 체결로 인해 발생하는 여러 데이터를 처리하고 GUI를 통해 나타내도록 하는 기능은 지금까지 모두 구현했다고 봐도 무방하지만, 이번 게시글에서는 더 나아가 단순한 주문 접수 외에 정정 주문과 취소 주문이 이루어졌을 때 데이터가 어떤 절차를 거쳐 발생하게 되며 우리는 그 데이터를 어떻게 처리해야 하는지에 대해 살펴볼 예정이다. 정정 주문과 취소 주문의 동작 로직 def recieve_chejandata 함수 내에서, 1차적으로 sGubun 에 의해 국내주식 잔고통보인가 아니면 주식체결통보인가를 구분해낸다. 이후 sG..
2022.09.19 -
지난 게시글에서 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