해외 선물 자동 매매 프로그램 만들기

해외 선물 자동 매매 프로그램 만들기

해외 선물 자동 매매 프로그램을 만들어보자는 것이 이번 포스팅의 주제입니다.

해외 선물은 거래 플랫폼, 물리적 배송, 통관 등 여러 상황에 따라 국내 주식과는 달리 복잡하고 어려운 부분도 있습니다. 따라서, 그만큼 수익률이 높은 매매가 가능하지만, 초보자는 어려움을 느끼기도 합니다. 이런 상황에서 해외 선물 자동 매매 프로그램을 구현한다면 편리하고 효율적인 매매를 할 수 있습니다.

1. 개발환경 설정

먼저, Pycharm과 Anaconda를 설치해주세요. 다음으로 Anaconda Prompt를 열고 conda update conda를 입력합니다. 그리고 conda create -n trading python=3.7을 입력해 가상환경을 생성합니다. 아래와 같은 모듈을 설치해 줍니다.

pip install pywinauto
pip install PyQt5
pip install requests
pip install pandas

2. 데이터 수집

앞서 이야기했던 것처럼, 선물시장에는 거래소 존재하지 않으므로, 실시간 데이터를 얻기 위해서는 거래소가 아닌 무역소에서 데이터를 얻어야 합니다. 실제 거래소와 무역소의 가격에는 일정한 차이가 있으므로, 프로그램 실행 전 무역소와 거래소의 가격 차이를 계산하여 이를 고려하여 매매할 수 있어야 합니다. 이 부분을 고려하여 Kraken 거래소 API를 호출하여 실시간가격을 받아오는 모듈을 작성해보겠습니다.

“`python
import requests
import pandas as pd

class Kraken:
def init(self):
self.exchange = ‘kraken’

def get_price(self, symbol):
    url = 'https://api.kraken.com/0/public/Ticker'
    payload = {'pair': symbol}

    try:
        response = requests.get(url, params=payload)
        data = response.json()['result'][symbol]
        ask_price = float(data['a'][0])
        bid_price = float(data['b'][0])
        return ask_price, bid_price
    except:
        return 0, 0

“`

3. 주문

실제 주문을 처리하는 모듈을 작성해보겠습니다. 먼저, 모듈 시작부분에서 XM의 거래소 코드를 코드에서 설정해줍니다. 이를 통해서 나중에 XM만 다른 계약과 가격에 맞게 변경하여 거래할 수 있습니다. Pywinauto 모듈을 통해 Xm Trading Desktop Platform을 실행하고, 자동 로그인 후, 거래 입력창에 거래가 입력됩니다.

“`python
import pywinauto
import win32clipboard
import time

def order(order_type, symbol, lots, stop_loss, take_profit):
xm_contract = ‘CFD_BTCEUR’
xm_symbol = {‘btceur’: ‘BTCEUR’}
contract = xm_contract
symbol = xm_symbol[symbol]

app = pywinauto.Application().connect(title='The Ultimate Trading Experience')
main_win = app.window(title='The Ultimate Trading Experience')
if main_win.child_window(title_re='Ok ', control_type='Button').exists():
    button = main_win.child_window(title_re='Ok ', control_type='Button').click()

menu_bar = main_win.child_window(class_name='TSpTBXDock').child_window(class_name='TMDIChild').child_window(class_name='TSpTBXDock')

sell_buy_button = menu_bar.child_window(control_type='ComboBox')

sell_buy_button.click_input()
time.sleep(1)

if(order_type == 0):
    sell_buy_button.type_keys('{UP 2}')
else:
    sell_buy_button.type_keys('{DOWN 2}')

symbol_input = menu_bar.child_window(control_type='Edit', auto_id='4213')

symbol_input.click_input()
time.sleep(1)

win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText(symbol)
win32clipboard.CloseClipboard()

main_win.type_keys('^v')
time.sleep(1)

lots_input = menu_bar.child_window(control_type='Edit', auto_id='4214')
lots_input.click_input()
time.sleep(1)

lots_input.type_keys(str(lots))
time.sleep(1)

stop_loss_input = menu_bar.child_window(control_type='Edit', auto_id='4220')
stop_loss_input.click_input()

stop_loss_input.type_keys(str(stop_loss))

take_profit_input = menu_bar.child_window(control_type='Edit', auto_id='4219')
take_profit_input.click_input()

take_profit_input.type_keys(str(take_profit))

ok_button = menu_bar.child_window(title_re='OK', control_type='Button')
ok_button.click_input()

return True

“`

4. 매매 전략

이제 수익을 얻기 위해서 중요한 것은 매매 전략입니다. 이번 포스팅에서는 비교적 간단한 거래 전략으로, 이동평균선을 이용하여 매매시기를 판단해보겠습니다. 이동평균선을 계산해주는 함수, 매매 시기를 결정하는 함수를 각각 작성합니다.

“`python
def ma(price_df, window):
price_df[‘ma’] = price_df[‘close’].rolling(window=window).mean()
return price_df

def enter_long(price_df, window):
if price_df[‘close’][-2] < price_df[‘ma’][-2] and price_df[‘close’][-1] > price_df[‘ma’][-1]:
return True, price_df[‘close’][-1], price_df[‘ma’][-1]
return False, 0, 0

def exit_long(price_df, window):
if price_df[‘close’][-2] > price_df[‘ma’][-2] and price_df[‘close’][-1] < price_df[‘ma’][-1]:
return True, price_df[‘close’][-1]
return False, 0
“`

5. 전체 코드

이제 모든 모듈을 합쳐서 전체 코드를 작성해보겠습니다.

“`python
import requests
import pandas as pd
import time

from order import *

class Kraken:
def init(self):
self.exchange = ‘kraken’

def get_price(self, symbol):
    url = 'https://api.kraken.com/0/public/Ticker'
    payload = {'pair': symbol}

    try:
        response = requests.get(url, params=payload)
        data = response.json()['result'][symbol]
        ask_price = float(data['a'][0])
        bid_price = float(data['b'][0])
        return ask_price, bid_price
    except:
        return 0, 0

def main():
kraken = Kraken()

order_type = 0 # 매수
symbol = 'btceur'
lots = 0.01
stop_loss = 0.1
take_profit = 0.1

ma_window = 5
while True:
    ask_price, bid_price = kraken.get_price(symbol)

    price_df = pd.DataFrame({'close':[bid_price]})
    price_df = ma(price_df, ma_window)

    open_trade = False
    profit_trade = False
    loss_trade = False

    if not open_trade:
        enter, enter_price, enter_ma = enter_long(price_df, ma_window)
        if enter:
            if order(order_type, symbol, lots, enter_price - stop_loss, enter_price + take_profit):
                open_trade = True
                print('[{}] buy: {}'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), enter_price))

    if open_trade and not profit_trade and not loss_trade:
        exit, exit_price = exit_long(price_df, ma_window)
        current_price = ask_price
        if exit:
            if order(order_type + 1, symbol, lots, 0, 0):
                profit_trade = True
                open_trade = False
                print('[{}] sell: {}'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), exit_price))
        elif current_price < enter_ma - (stop_loss/2):
            if order(order_type + 1, symbol, lots, 0, 0):
                loss_trade = True
                open_trade = False
                print('[{}] stop loss: {}'.format(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), current_price))

    time.sleep(5)

if name == ‘main‘:
main()
“`

6. 마무리

이번 포스팅에서는 해외 선물 자동 매매 프로그램을 만드는 방법에 대해 알아보았습니다. 여러분이 원하는 전략을 적용하여 더욱 성공적인 매매를 할 수 있도록 해보세요!