본문 바로가기

영웅문Global 핸들링

매수 / 매도 수행하기 - 1 (미니주문 창 호출하기)

728x90

매수 / 매도를 수행하는 방법도 여러 가지가 있을 것 같습니다. 그중에서 저는 미니 주문창을 통해 수행해보려 합니다. 전체적인 수행 결과를 먼저 보시죠.

전체 매수 / 매도 실행 영상입니다.

 

미니주문 창

우리가 사용할 미니주문 창에 대해서 알아보겠습니다. 메뉴툴바 영역을 통해서 창을 호출합니다. 미니 주문창은 2102번입니다. 2102를 입력하면 아래와 같이 미니 주문창이 뜹니다.

미니주문 창인데 매수/매도의 구성항목이 약간 다릅니다. +_+

 

미니 주문창에서 핸들링 할 영역에 대해 알아보겠습니다. (매수와 매도가 약간 다르지만 핸들링하려는 부분은 같다고 생각됩니다.)

(1) 종목 지정

종목 영역에 티커를 타이핑 합니다. 이를 통해 티커의 현재 가격을 알 수 있습니다. 매도 상태에서는 보유한 종목이라면 매도할 수 있는 수량도 같이 알 수 있습니다.

(2) 현재 가격 (USD, KRW)

가격은 해외 주식의 통화 단위의 가격과 원화로 환전 된 가격을 알 수 있습니다. 각각은 구분되어 표기되고 있으며 둘 다 가격을 가져올 수 있습니다. 그러나 원화 환전에 적용되는 환율은 다소 복잡하므로 외화 단위의 가격만 참고하는 것이 좋겠습니다. (원화금액유의사항이 별도로 표기되어 있습니다.)

(3) 종류

매수 / 매도의 방법을 나타냅니다. 지정가, 시장가, AFTER지정, LOC 정도까지는 알고 있지만 MOC 밑으로는 잘 몰라서 선택하지 않았습니다. 저는 현재 본장에서만 매매를 진행하고 있으며 시장가로 지정하고 매매를 진행합니다.

매매할 수 있는 종류가 여러가지

(4) 수량

매수 / 매도 시 수량을 잘 못 입력하면 큰 문제가 생길 수 있습니다. 특히 ‘그리드 매매법’을 사용하고 있는 저로써는 계좌에 보이는 종목의 수량은 한 덩어리지만 각각이 티어로 구분되어 있기 때문에 각 티어의 수량만큼만 매매가 되어야 방법론 대로 로직을 수행할 수 있습니다.

(5) 자동(현재가)

이 항목이 체크되어 있어야 현재 가격을 실시간으로 제공 받아 의사결정 할 수 있습니다.

(6) 매수 / 매도 버튼

원하는 가격과 수량을 입력한 후 매수 / 매도 버튼을 눌러서 최종 의사결정 합니다.

 

유저 시나리오 - 매수, SOXL, 2개

user_meme_gubun = "매수"
user_ticker = 'SOXL'
user_qty = 2

 

미니주문 창 - 호출하기

이제 미니주문 창을 파이썬 소스로 핸들링 해봅시다. 미니주문 창을 호출하고 핸들링할 수 있도록 가져오는 부분입니다.

# 영웅문 process id 찾기
process_id = 0
for process in psutil.process_iter(['pid', 'name']):
    if process.info['name'] == 'nfrunlite.exe':
        process_id = process.info['pid']
        break

# 실행 중인 어플리케이션에 연결
app = Application(backend="uia").connect(process=process_id)

# 메인 윈도우 핸들링
main_window = app.window(title='영웅문Global')
main_window.maximize()
time.sleep(1)

# 각 자식 컨트롤의 정보 출력
screen_area = None
menutoolbar = None
for child in main_window.children():
    if child.window_text() == "메뉴툴바":
        menutoolbar = child

    if child.class_name() == "MDIClient": # 작업 영역
        screen_area = child

# 메뉴툴바로 부터 메뉴를 호출 할 예정
menus = None
if menutoolbar:
    menutoolbar_children = menutoolbar.children()
    for child in menutoolbar_children:
        if len(child.children()) == 4:
            menus = child
            break

input_field = None
if menus:
    input_field = menus.children()[0].children()[0]

많은 부분이 앞서 준비했던 내용과 겹치기도 합니다. 여기까지 실행하면 input_field를 통해서 여러 창들을 호출할 수 있게 됩니다. 바로 미니주문 창을 호출해 볼까요?

# 2012 미니주문
input_field.set_focus()
input_field.type_keys('2102')
time.sleep(2)

만약 다른 창을 호출하고 싶다면 숫자를 변경해 주면 됩니다. (2000 - 주문종합 창)

미니주문 창이 떴다면 이를 핸들링할 수 있도록 찾아서 가져와 줍니다.

mini_order_window = None
for child in screen_area.children():
    if child.window_text().startswith("[2102]"):
        mini_order_window = child
        break

 

여기까지 내용을 직접 실행해 보셨나요? 부족한 점이 있거나 어려운 점이 있다면 언제든지 댓글, 이메일로 문의하세요. 문의를 주시는데 시간을 쏟으신 만큼 최선을 다해 답변드리겠습니다.

다음은 매수 / 매도를 실제로 수행하는 로직에 대해 설명드리겠습니다.

2023.11.28 - [영웅문Global 핸들링] - 매수 / 매도 수행하기 - 2 (미니주문 창 핸들링하기)

관심의 표현은 저에게 큰 힘이 됩니다. 😍 도움을 주셔서 정말 감사합니다.

혹시 이전 내용을 세팅하지 않았다면 아래 내용을 확인해 주세요.

2023.11.23 - [영웅문 Global 핸들링] - 프로그램 실행 전 준비 (실행 중인 영웅문Global 연결하고 "모든 창 닫기")

 

프로그램 실행 전 준비 (실행 중인 영웅문Global 연결하고 "모든창 닫기")

앞으로 영웅문Global을 내 맘처럼 핸들링 하기 위해서 사전에 준비해야 할 내용이 있습니다. 그 것은 바로 실행 중인 영웅문Global을 찾고 핸들링 할 수 있도록 연결하는 작업을 하는 것입니다. 더

kyeyangdak.tistory.com

 

반응형