개발자/파이썬

파이썬 자동매매 프로그램 (feat. 조코딩)

june__kim 2020. 12. 28. 23:23

파이썬 자동매매 프로그램 (feat. 조코딩, 크레온)

 

요즘 다들 주식에 관심있는 분들 많을거라고 생각한다.

나도 그 부류중 하나인데 내가 열심히 보고 있는 유튜브의 "조코딩"채널에서

크레온api를 이용한 자동매매 프로그램을 만들길래 재밌어보여서 시작하게 되었다.

 

(조코딩님 채널: youtu.be/5bTxyBeOVkA )

 

그래도 명색이 컴퓨터공학과를 나왔는데 한번 따라서 만들어보고

매수 및 매도 알고리즘은 내가 직접 만들어서 구현해보려고 한다.

 

나만의 알고리즘을 만들기 전에

그전에 일단 조코딩 채널에서 구현한 프로그램이 제대로 돌아가야겠지?

(다들 최소한 조코딩 채널에서 강의를 보고 왔을꺼라고 믿는다.)

 

근데 내가 그대로 따라해보니까 아래 그림처럼 조건에 맞다는 콘솔이 찍히긴 하는데 이상하게 매수체결이 안되더라.

(계속 meets the buy condition! 이라는 문구만 쓰고 bought_qty는 0임)

 

이것처럼

 

유튜브 댓글에서 몇몇분들도 이걸로 헤매시는 것 같아서 블로그로 그 해결방법을 써보려고 한다.

 

 

일단 체결이 되지 않는다면, 그게 왜 안되는지 원인을 알아야한다.

아래의 코드를 통해 뭐가 문제인지 확인해보자.

 

printlog('거래 결과 ->',cpOrder.GetDibStatus(), cpOrder.GetDibMsg1())

이 코드를 매수 주문 요청후에 넣어서 확인하면 된다.

(즉, ret = cpOrder.BlockRequest() 다음 코드에 넣으면 된다. 아래 코드처럼)

 

# 매수 주문 요청
            ret = cpOrder.BlockRequest() 
            printlog('거래 결과 ->',cpOrder.GetDibStatus(), cpOrder.GetDibMsg1())
            printlog('최유리 FoK 매수 ->', stock_name, code, buy_qty, '->', ret)
            if ret == 4:
                remain_time = cpStatus.LimitRequestRemainTime
                printlog('주의: 연속 주문 제한에 걸림. 대기 시간:', remain_time/1000)
                time.sleep(remain_time/1000) 
                return False
            time.sleep(2)

 

이렇게 넣고 코드를 돌려보면 문제의 원인을 알 수 있다!

 

 

나의 경우엔 원인이 2가지였는데,

첫 번째로, 나의 계좌가 ETF를 거래할 수 있도록 등록하지 않았기 때문이다.

그냥 ETF 거래등록이 아니라, ETF중에서 레버리지 ETF or ETN(물론 곱버스도)의 경우 설정을 하고 사전교육도 받아야한다.

(아무래도 예제의 symbol_list에 레버리지와 관련된 ETF가 있었던 것 같다.)

(추가)레버리지 etf 사전교육 필수

(ETF, 레버리지, 곱버스가 뭔지 모른다면... 내가 미안하다... 구글링해봐라)

 

이건 계좌 설정에서 레버리지 ETF를 거래할 수 있도록 설정을 바꿔주고 교육도 들어야한다.

 

예제의 종목 코드

근데 난 이게 "너무" 귀찮더라....ㅎ

그래서 난 그냥 symbol_list에서 레버리지 관련 종목들을 빼고 다른 종목들을 넣었다. (ex. A005930(삼성전자), A008560(메리츠증권) ...etc)

(++추가++ 그냥 평범한 ETF의 경우에는 아무런 문제없이 잘 거래가 된다고 하니, 레버리지 종목들만 빼면 문제가 없을 것 같다.)

(댓글로 알려진 분 감사합니다!)

 

일단 1단계는 Clear

 

 

두 번째 원인으로는, 증거금이 부족하다는 에러였다.

(증거금이 뭐냐고 물어본다면... 이 또한 내가 미안하다.)

처음 설정할 때 아마 대부분(?) 증거금 100%로 설정을 해놓았을꺼라고 생각한다.

 

근데 이게 "지정가"로 매수를 할 때는 별 문제가 없는데,

우리에게 주어진 예제에서는 FOK"최유리가격"으로 매수를 진행한다.

 

내가 크레온 Q&A에서 찾아본 바로는,

"시장가", "최유리", "최우선"의 경우엔 증거금이 조금 다르게 측정된다.

 

출처: https://money2.creontrade.com/e5/mboard/ptype_basic/Basic_018/DW_Basic_Read_Page.aspx?boardseq=60&seq=22079&ismy=0&page=1&searchString=&p=8829&v=8637&m=9505

 

이 문제를 해결하기위해 main에서 buy_percent의 값을 많이 낮췄다. (해결책1)

그러니까 몇 개씩 체결이 되기 시작하더라.

 

근데 뭔가 난 내 잔고의 금액을 꽉꽉 채워서 매수하고 싶었다.

그래서 최유리가격으로 매수하지 않고 "지정가"로 매수할 수 있도록 코드를 약간 수정했다. (해결책2)

(buy_etf함수에서 매수 주문 설정하는 부분을 아래 코드처럼)

# 보통(지정가) FOK 매수 주문 설정
            cpOrder.SetInputValue(0, "2")        # 2: 매수
            cpOrder.SetInputValue(1, acc)        # 계좌번호
            cpOrder.SetInputValue(2, accFlag[0]) # 상품구분 - 주식 상품 중 첫번째
            cpOrder.SetInputValue(3, code)       # 종목코드
            cpOrder.SetInputValue(4, buy_qty)    # 매수할 수량
            cpOrder.SetInputValue(5, current_price) # 주문 단가
            cpOrder.SetInputValue(7, "2")        # 주문조건 0:기본, 1:IOC, 2:FOK
            cpOrder.SetInputValue(8, "01")       # 주문호가 01:보통, 3:시장가
                                                 # 5:조건부, 12:최유리, 13:최우선 

기존 코드와 달라진 점이라곤, 주문 단가를 설정해준 것주문을 보통으로 지정한 것 뿐이다.

 

 

이렇게 하니 아래와 같이 잘 체결되더라.

 

아직까지 어떤 이 바꾼 코드를 통해 어떠한 문제점을 발견하지 못했다.

혹시라도 누군가 문제점이 있다면 댓글로 알려주시면 감사할 것 같습니다.

 

 

이걸 해결하고 조금 더 다채롭게 나만의 코드를 만들기위해

크레온플러스api를 다 뒤져보고 다양한걸 시도해보고 있다.

 

다들 에러없이 잘 완성하시길 바란다.

 

 

※ 저도 많이 부족하지만 혹시라도 궁금하신 점 있으시면 댓글 남겨주세요. 

아는 선에서 최대한 알려드리겠습니다 :)