분류 전체보기
-
지난 게시글에서 조건검색식을 생성하고, 해당 조건검색식에 의해 집계된 종목의 리스트를 얻어오는 기능까지 구현했다. 이번 게시글에서는 조회된 종목 코드 변수를 가지고 차트 데이터를 조회하고, 해당 차트 데이터를 기반으로 매수가와 매도가를 계산할 알고리즘을 어떻게 구현해야 하는지에 대해 살펴볼 예정이다. 버튼부터 만들어주자 아직 조건검색식을 사용할 수 있도록 하는 버튼이 존재하지 않는다. GUI 상에서 여러 기능들을 사용할 예정인데, 콤보 박스와 같은 전에는 사용하지 않았던 기능들이 추가될 예정이니 잘 따라오도록 하자. 가장 먼저 구현할 버튼은 서버로부터 조건검색식과 관련된 데이터를 시스템 내에 저장하는 def __getconditionload(self) 를 실행할 버튼이다. 조건검색식 조회 버튼은 push..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (3) - 조건검색식 사용하기 ③지난 게시글에서 조건검색식을 생성하고, 해당 조건검색식에 의해 집계된 종목의 리스트를 얻어오는 기능까지 구현했다. 이번 게시글에서는 조회된 종목 코드 변수를 가지고 차트 데이터를 조회하고, 해당 차트 데이터를 기반으로 매수가와 매도가를 계산할 알고리즘을 어떻게 구현해야 하는지에 대해 살펴볼 예정이다. 버튼부터 만들어주자 아직 조건검색식을 사용할 수 있도록 하는 버튼이 존재하지 않는다. GUI 상에서 여러 기능들을 사용할 예정인데, 콤보 박스와 같은 전에는 사용하지 않았던 기능들이 추가될 예정이니 잘 따라오도록 하자. 가장 먼저 구현할 버튼은 서버로부터 조건검색식과 관련된 데이터를 시스템 내에 저장하는 def __getconditionload(self) 를 실행할 버튼이다. 조건검색식 조회 버튼은 push..
2022.07.20 -
이번 게시글에서는 영웅문 상에서 제작한 조건검색식을 기반으로, 조건검색식에 의해 집계된 종목 데이터를 조회하는 기능을 구현할 계획이다. 조건검색식 설정하기 키움증권 사에서 제공하는 홈 트레이딩 시스템(HTS, Home Trading System) 내에서 화면번호 [0151]로 분류되는 조건검색식 내에서는 여러 가지 조건들을 설정해서 당일당일 해당 조건에 부합하는 종목을 선별해낼 수 있다. 거래량부터 거래대금, 이동평균선의 배열, 전일 대비 거래량 증가율 등등 키움증권에서 제공하는 조건 안에서는 어떤 조건이든 사용할 수 있다. 다만 이 게시글 내에서 확인하고자 하는 바는 조건검색식 상에서 집계된 종목의 데이터를 얻어오는 것이니 자세한 조건식 설정 방법은 차치하고, 아래와 같이 간단한 조건 검색식만 만들어서..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (2) - 조건검색식 사용하기 ②이번 게시글에서는 영웅문 상에서 제작한 조건검색식을 기반으로, 조건검색식에 의해 집계된 종목 데이터를 조회하는 기능을 구현할 계획이다. 조건검색식 설정하기 키움증권 사에서 제공하는 홈 트레이딩 시스템(HTS, Home Trading System) 내에서 화면번호 [0151]로 분류되는 조건검색식 내에서는 여러 가지 조건들을 설정해서 당일당일 해당 조건에 부합하는 종목을 선별해낼 수 있다. 거래량부터 거래대금, 이동평균선의 배열, 전일 대비 거래량 증가율 등등 키움증권에서 제공하는 조건 안에서는 어떤 조건이든 사용할 수 있다. 다만 이 게시글 내에서 확인하고자 하는 바는 조건검색식 상에서 집계된 종목의 데이터를 얻어오는 것이니 자세한 조건식 설정 방법은 차치하고, 아래와 같이 간단한 조건 검색식만 만들어서..
2022.07.19 -
이제 차트 데이터를 요청하고 그 데이터를 수신받아 사용할 수 있는 수준의 기능까지 구현한 시점에서, 자동 매매 시스템이 동작하도록 하기 위해서는 우리가 설정한 조건에 알맞은 종목의 데이터를 얻어다가 매수 가격과 매도 가격을 구현하고, 해당 가격을 기준으로 거래를 진행하도록 해야 한다. 이러한 일련의 절차를 알고리즘(Algorithm)이라고 할 수 있는데, 알고리즘의 정확한 사전적 의미는 아래와 같다. 알고리즘, (정보·통신) 어떤 문제의 해결을 위하여, 입력된 자료를 토대로 하여 원하는 출력을 유도하여 내는 규칙의 집합. 여러 단계의 유한 집합으로 구성되는데, 각 단계는 하나 또는 그 이상의 연산을 필요로 한다. 사전적 의미만 봐도 알겠지만, "입력된 자료를 토대로 하여 원하는 출력을 유도해 내는 규칙의..
[자동 매매 시스템 구축하기] 알고리즘 구축하기 (1) - 조건검색식 사용하기 ①이제 차트 데이터를 요청하고 그 데이터를 수신받아 사용할 수 있는 수준의 기능까지 구현한 시점에서, 자동 매매 시스템이 동작하도록 하기 위해서는 우리가 설정한 조건에 알맞은 종목의 데이터를 얻어다가 매수 가격과 매도 가격을 구현하고, 해당 가격을 기준으로 거래를 진행하도록 해야 한다. 이러한 일련의 절차를 알고리즘(Algorithm)이라고 할 수 있는데, 알고리즘의 정확한 사전적 의미는 아래와 같다. 알고리즘, (정보·통신) 어떤 문제의 해결을 위하여, 입력된 자료를 토대로 하여 원하는 출력을 유도하여 내는 규칙의 집합. 여러 단계의 유한 집합으로 구성되는데, 각 단계는 하나 또는 그 이상의 연산을 필요로 한다. 사전적 의미만 봐도 알겠지만, "입력된 자료를 토대로 하여 원하는 출력을 유도해 내는 규칙의..
2022.07.19 -
지난 게시글까지의 내용은 실시간을 등록하고 해제하는 기능을 구현하는 것이었다. 하지만 아직 발생할 수 있는 오류가 남아 있는데, 바로 동일한 종목을 실시간으로 등록하거나 실시간으로 등록되어 있지 않은 종목을 대상으로 실시간 해제를 했을 경우에 발생할 수 있는 오류이다. 이러한 문제를 해결하는 것은 의외로 단순하게 처리할 수 있다. 실시간 등록 시 오류 처리 : def add_to_setrealreg(self, item_code) 일단 어떤 오류가 발생하는지에 대해 먼저 살펴보자면, 아래와 같은 ValueError 가 발생한다. 이는 .item() 메서드를 원인으로 발생하는 것인데, 애당초 그 앞 부분의 코드에서 얻어온 값이 없기 때문에 빈 데이터에 대고 .item() 메서드를 적용했을 때 발생하는 오류이..
[자동 매매 시스템 구축하기] 실시간 해제하기 (3) - 오류 처리지난 게시글까지의 내용은 실시간을 등록하고 해제하는 기능을 구현하는 것이었다. 하지만 아직 발생할 수 있는 오류가 남아 있는데, 바로 동일한 종목을 실시간으로 등록하거나 실시간으로 등록되어 있지 않은 종목을 대상으로 실시간 해제를 했을 경우에 발생할 수 있는 오류이다. 이러한 문제를 해결하는 것은 의외로 단순하게 처리할 수 있다. 실시간 등록 시 오류 처리 : def add_to_setrealreg(self, item_code) 일단 어떤 오류가 발생하는지에 대해 먼저 살펴보자면, 아래와 같은 ValueError 가 발생한다. 이는 .item() 메서드를 원인으로 발생하는 것인데, 애당초 그 앞 부분의 코드에서 얻어온 값이 없기 때문에 빈 데이터에 대고 .item() 메서드를 적용했을 때 발생하는 오류이..
2022.07.19 -
지난 게시글에서는 실시간 해제와 함께 self.setrealreg 변수를 업데이트하는 기능을 구현했으니, 이번 게시글에서는 tableWidget 내에서 데이터를 삭제하는 방법에 대해 살펴볼 예정이다. tableWidget은 어떻게 삭제하나? Method : removeRow() 사실 self.setrealreg 변수 내에서 데이터를 삭제하는 건 간단했지만, tableWidget을 수정하는 것은 별도의 게시글로 분리한 이유가 있다. 바로 데이터프레임 내에서 데이터를 삭제하는 것처럼 간단하지가 않기 때문이다. 아니, 간단하지 않다기 보다는 코드는 간단하지만, 그 개념을 이해하는 것이 조금 어려울 수도 있다. (쉽게 느껴진다면 다행이다.) 일단 tableWidget 객체에서 특정 데이터를 삭제하는 메서드는 ...
[자동 매매 시스템 구축하기] 실시간 해제하기 (2) - tableWidget 업데이트지난 게시글에서는 실시간 해제와 함께 self.setrealreg 변수를 업데이트하는 기능을 구현했으니, 이번 게시글에서는 tableWidget 내에서 데이터를 삭제하는 방법에 대해 살펴볼 예정이다. tableWidget은 어떻게 삭제하나? Method : removeRow() 사실 self.setrealreg 변수 내에서 데이터를 삭제하는 건 간단했지만, tableWidget을 수정하는 것은 별도의 게시글로 분리한 이유가 있다. 바로 데이터프레임 내에서 데이터를 삭제하는 것처럼 간단하지가 않기 때문이다. 아니, 간단하지 않다기 보다는 코드는 간단하지만, 그 개념을 이해하는 것이 조금 어려울 수도 있다. (쉽게 느껴진다면 다행이다.) 일단 tableWidget 객체에서 특정 데이터를 삭제하는 메서드는 ...
2022.07.19 -
지난 게시글까지 특정 종목을 실시간으로 등록하고 tableWidget 내에 데이터를 추가하고 self.setrealreg 변수에 종목코드를 입력하는 기능을 구현했다. 하지만 실시간 등록의 경우 실사간으로 등록할 수 있는 종목의 개수를 100개로 제한하고 있다. 따라서 등록한 종목의 개수가 100개가 되기 전에 매수 조건에 이탈하여 필요가 없어진 종목을 실시간 해제를 하거나 또는 100개가 될 경우 가장 이전에 등록된 종목은 제거하는 등의 기능을 구현하는 게 필요하다. 실시간 해제 함수 구현하기 이전에 다른 함수들도 모두 캡슐화를 이용해서 제작해주었던 것처럼, 실시간 해제 함수도 하나의 캡슐로 생성해줘야 사용하고자 하는 지점에서 적절하게 호출해서 사용할 수 있게 된다. 사실 이쯤 되면 함수 하나 만들어내는..
[자동 매매 시스템 구축하기] 실시간 해제하기 (1) - self.setrealreg 업데이트지난 게시글까지 특정 종목을 실시간으로 등록하고 tableWidget 내에 데이터를 추가하고 self.setrealreg 변수에 종목코드를 입력하는 기능을 구현했다. 하지만 실시간 등록의 경우 실사간으로 등록할 수 있는 종목의 개수를 100개로 제한하고 있다. 따라서 등록한 종목의 개수가 100개가 되기 전에 매수 조건에 이탈하여 필요가 없어진 종목을 실시간 해제를 하거나 또는 100개가 될 경우 가장 이전에 등록된 종목은 제거하는 등의 기능을 구현하는 게 필요하다. 실시간 해제 함수 구현하기 이전에 다른 함수들도 모두 캡슐화를 이용해서 제작해주었던 것처럼, 실시간 해제 함수도 하나의 캡슐로 생성해줘야 사용하고자 하는 지점에서 적절하게 호출해서 사용할 수 있게 된다. 사실 이쯤 되면 함수 하나 만들어내는..
2022.07.19 -
지난 게시글에서는 실시간 등록이 이루어지는 동시에 해당 종목코드의 데이터가 tableWidget에 등록되도록 설정했다. 이번 게시글에서는 실시간 데이터가 발생하는 경우에 곧바로 tableWidget 내에 해당 실시간 데이터를 입력하도록 하는 코드를 구축할 예정이다. 소름끼치게 간단하다. 이전에 실시간 등록을 하는 시점에서 tableWidget에 종목코드(item_code)를 입력하도록 하는 코드를 작성했는데, 그 과정에서 self.tableWidget.setItem(row_num, column_num, DATA) 와 같은 구조로 데이터를 입력할 수 있다는 걸 확인했다. 실시간 데이터를 등록하는 것 역시 위와 같은 구조의 코드를 구축하여 기능을 구현할 수 있다. ※ Line : 17~23 """실시간 데이..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (7) - tableWidget 사용하기 ③지난 게시글에서는 실시간 등록이 이루어지는 동시에 해당 종목코드의 데이터가 tableWidget에 등록되도록 설정했다. 이번 게시글에서는 실시간 데이터가 발생하는 경우에 곧바로 tableWidget 내에 해당 실시간 데이터를 입력하도록 하는 코드를 구축할 예정이다. 소름끼치게 간단하다. 이전에 실시간 등록을 하는 시점에서 tableWidget에 종목코드(item_code)를 입력하도록 하는 코드를 작성했는데, 그 과정에서 self.tableWidget.setItem(row_num, column_num, DATA) 와 같은 구조로 데이터를 입력할 수 있다는 걸 확인했다. 실시간 데이터를 등록하는 것 역시 위와 같은 구조의 코드를 구축하여 기능을 구현할 수 있다. ※ Line : 17~23 """실시간 데이..
2022.07.17 -
지난 게시글에서 tableWidget의 행 이름에 해당하는 행의 번호를 dummy_variable.py라는 파일 내에 하나하나 수작업으로 생성해주었다. 따라서 이번 게시글에서는 실시간 데이터를 수신하는 시점에서 발생하는 실시간 데이터들을 모두 tableWidget에 입력하도록 하는 코드를 구축할 계획이다. 코드를 작성할 함수는 당연히 실시간 데이터가 발생하는 함수인 def receive_realdata 함수 하단이다. 잠깐! 지난 게시글에서 tableWidget을 사용하기 위해서는 self.tableWidget.setItem(row_num, column_num, DATA) 과 같은 형태로 사용해야 된다고 했는데, row_num 데이터를 얻어오는 과정이 먼저 우선시되어야 한다. 여기서 이야기하는 row_n..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (6) - tableWidget 사용하기 ②지난 게시글에서 tableWidget의 행 이름에 해당하는 행의 번호를 dummy_variable.py라는 파일 내에 하나하나 수작업으로 생성해주었다. 따라서 이번 게시글에서는 실시간 데이터를 수신하는 시점에서 발생하는 실시간 데이터들을 모두 tableWidget에 입력하도록 하는 코드를 구축할 계획이다. 코드를 작성할 함수는 당연히 실시간 데이터가 발생하는 함수인 def receive_realdata 함수 하단이다. 잠깐! 지난 게시글에서 tableWidget을 사용하기 위해서는 self.tableWidget.setItem(row_num, column_num, DATA) 과 같은 형태로 사용해야 된다고 했는데, row_num 데이터를 얻어오는 과정이 먼저 우선시되어야 한다. 여기서 이야기하는 row_n..
2022.07.16 -
지난 게시글에서 실시간 데이터를 얻어오는 방법과 def __getcommrealdata()를 사용해서 종목코드와 FID 번호를 전달하여 특정 FID 번호에 해당하는 데이터를 조회하는 방법까지 살펴봤다. 하지만 실질적으로 실제 거래에 사용하기 위해서는 해당 데이터를 확인하고 사용할 줄 알아야 하는데, 본인은 이 방법을 tableWidget을 사용해서 활용하고 있다. tableWidget이 뭔데? tableWidget은 단순하게 우리가 앞서 차트 데이터를 조회하고 저장하기 전에 앞서 사용했던 데이터프레임(DataFrame)과 동일한 형태의 데이터라고 보면 된다. 데이터프레임(DataFrame)은 특정 열과 특정 행에 해당하는 데이터를 정확하게 확인할 수 있는데, tableWidget 역시 마찬가지이다. 특정..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (5) - tableWidget 사용하기 ①지난 게시글에서 실시간 데이터를 얻어오는 방법과 def __getcommrealdata()를 사용해서 종목코드와 FID 번호를 전달하여 특정 FID 번호에 해당하는 데이터를 조회하는 방법까지 살펴봤다. 하지만 실질적으로 실제 거래에 사용하기 위해서는 해당 데이터를 확인하고 사용할 줄 알아야 하는데, 본인은 이 방법을 tableWidget을 사용해서 활용하고 있다. tableWidget이 뭔데? tableWidget은 단순하게 우리가 앞서 차트 데이터를 조회하고 저장하기 전에 앞서 사용했던 데이터프레임(DataFrame)과 동일한 형태의 데이터라고 보면 된다. 데이터프레임(DataFrame)은 특정 열과 특정 행에 해당하는 데이터를 정확하게 확인할 수 있는데, tableWidget 역시 마찬가지이다. 특정..
2022.07.16 -
지난 게시글에서 실시간 데이터를 추가하고 self.setrealreg 변수를 활용해서 실시간 등록 종목을 관리하는 방법까지 모두 구현했다. 하지만 아직은 실시간으로 등록한 종목들의 실시간 데이터를 얻어올 수 없다. 그 이유는 단순하게도, 실시간 데이터를 얻어오는 OnReceiveRealData 이벤트를 처리해주지 않았기 때문이다. 예전에 차트 데이터를 조회할 때 데이터를 입력하고 요청한 후 서버로부터 데이터를 얻기 위해 OnReceiveTrData 라는 이벤트를 처리해줬는데, 기억할지 모르겠지만 아무튼 했었다. 그리고 키움증권 Open API는 총 8개의 이벤트를 제공하고 있으며, 모든 이벤트를 처리해줘야 하는 것은 아니고 필요한 이벤트만 적재적소에 구현해서 사용하면 된다. OnReceiveRealDat..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (4) - OnReceiveRealData지난 게시글에서 실시간 데이터를 추가하고 self.setrealreg 변수를 활용해서 실시간 등록 종목을 관리하는 방법까지 모두 구현했다. 하지만 아직은 실시간으로 등록한 종목들의 실시간 데이터를 얻어올 수 없다. 그 이유는 단순하게도, 실시간 데이터를 얻어오는 OnReceiveRealData 이벤트를 처리해주지 않았기 때문이다. 예전에 차트 데이터를 조회할 때 데이터를 입력하고 요청한 후 서버로부터 데이터를 얻기 위해 OnReceiveTrData 라는 이벤트를 처리해줬는데, 기억할지 모르겠지만 아무튼 했었다. 그리고 키움증권 Open API는 총 8개의 이벤트를 제공하고 있으며, 모든 이벤트를 처리해줘야 하는 것은 아니고 필요한 이벤트만 적재적소에 구현해서 사용하면 된다. OnReceiveRealDat..
2022.07.16 -
지난 게시글에서 GUI 내에서 종목코드를 입력하고, 해당 종목코드 정보를 얻어서 실시간으로 등록하는 버튼을 생성한 후 넘어왔다. 이번 게시글에서는 특정 버튼을 눌렀을 때 lineEdit() 객체에 입력되어 있는 종목코드 데이터를 얻어서 종목 코드를 바탕으로 실시간으로 등록하는 함수인 def __setrealreg(self, item_code) 함수를 실행하는 코드를 구현할 예정이다. GUI 상 종목코드를 입력하는 lineEdit의 객체 이름은 lineEdit이고, 실시간 등록을 요청하는 버튼(pushButton)의 객체 이름은 pushButton_3이다. 버튼의 기능부터 구현해보자. 이전에 GUI 버튼과 함수를 연결하는 코드가 def __init__(self): 내에서 구현해두었던 것을 기억하는가? 앞으..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (3) - 실시간 등록하기지난 게시글에서 GUI 내에서 종목코드를 입력하고, 해당 종목코드 정보를 얻어서 실시간으로 등록하는 버튼을 생성한 후 넘어왔다. 이번 게시글에서는 특정 버튼을 눌렀을 때 lineEdit() 객체에 입력되어 있는 종목코드 데이터를 얻어서 종목 코드를 바탕으로 실시간으로 등록하는 함수인 def __setrealreg(self, item_code) 함수를 실행하는 코드를 구현할 예정이다. GUI 상 종목코드를 입력하는 lineEdit의 객체 이름은 lineEdit이고, 실시간 등록을 요청하는 버튼(pushButton)의 객체 이름은 pushButton_3이다. 버튼의 기능부터 구현해보자. 이전에 GUI 버튼과 함수를 연결하는 코드가 def __init__(self): 내에서 구현해두었던 것을 기억하는가? 앞으..
2022.07.16 -
지난 게시글에서 이야기했듯이, def __setrealreg() 함수를 사용하기 위해서는 현재 실시간으로 등록되어 있는 종목들이 입력되어 있는 self.setrealreg 변수 내에 입력되어 있는 종목 데이터가 가장 정확해야 한다. 다시 말해, RealType의 인자로 0을 전달할지 1을 전달할지는 실시간으로 등록되어 있는 종목의 개수에 따라 좌우되니 실시간으로 등록되어 있는 종목들의 리스트가 담겨 있는 self.setrealreg 변수는 항상 데이터를 정확하게 유지해야 한다는 것이다. 데이터를 정확하게 유지해야 한다? 실제로 거래를 진행하다보면 실시간 등록을 해야 할 때도 있겠지만, 사전에 설정해두었던 로직대로 거래가 모두 이루어진 후에는 실시간을 해지해야 하는 경우가 있을 수 있고 이외에도 거래 조건..
[자동 매매 시스템 구축하기] 실시간 데이터 얻기 (2) - self.setrealreg 업데이트하기지난 게시글에서 이야기했듯이, def __setrealreg() 함수를 사용하기 위해서는 현재 실시간으로 등록되어 있는 종목들이 입력되어 있는 self.setrealreg 변수 내에 입력되어 있는 종목 데이터가 가장 정확해야 한다. 다시 말해, RealType의 인자로 0을 전달할지 1을 전달할지는 실시간으로 등록되어 있는 종목의 개수에 따라 좌우되니 실시간으로 등록되어 있는 종목들의 리스트가 담겨 있는 self.setrealreg 변수는 항상 데이터를 정확하게 유지해야 한다는 것이다. 데이터를 정확하게 유지해야 한다? 실제로 거래를 진행하다보면 실시간 등록을 해야 할 때도 있겠지만, 사전에 설정해두었던 로직대로 거래가 모두 이루어진 후에는 실시간을 해지해야 하는 경우가 있을 수 있고 이외에도 거래 조건..
2022.07.16