안녕하세요.
예전에 html코드만으로 거래소 이용하는 예제 올렸는데 많은 분들이 추천을 주셔서
이번에도 간단한 코드 올려드리려 합니다.
html코드만으로 거래소 API처리하기는 많은 제약사항이 있지만,
굳이 html을 사용하시는건...... 예제 자료도 많이 있고 무엇보다 그래픽 환경이라는 점이 클거라고 생각합니다.
하지만 python은 주식 관련 라이브러리나 머신러닝 관련 자료도 많아서 데이터를 훨씬 유연하게 처리할 수 있습니다.
그래서 이번에는 웹 브라우저에서 명령을 내리고 python에서 데이터를 처리하는 방법을 소개하려 합니다.
python이 URL을 통해 명령어를 입력받고 처리 후 데이터를 리턴하는 방식입니다.
동작방식
동작 : 브라우저 요청 -> python 처리 -> python 출력 -> 브라우저 응답
예시 : (http://내아이피/coinone/ticker) (coinone의 ticker받아옴) (ticker결과 출력) (html로 이쁘게 보여줌)
준비물
1. python2.7
2. 웹 브라우저
3. 서버, 데이터베이스, 웹 호스팅, 돈...
4. django, flask
※ python의 기본 모듈만으로 만들어 보겠습니다.
설치하기
1. http://python.org 여기서 2.7.13버전을 받으시면 됩니다.
2. 다운받은 설치프로그램을 더블클릭하여 설치합니다.
실행하기
1. 설치 후, 시작에서 "IDLE (Python GUI)"를 찾아 실행합니다.
2. File > New File을 눌러 새로운 파일을 띄웁니다.
3. 편한 곳에 test.py로 저장합니다.
코드작성
1. 아래 코드를 test.py에 붙여넣습니다.
URL으로 데이터를 입력받고 데이터를 리턴해주는 기본 틀이라고 생각하시면 됩니다.
기본 틀에서 수정해야할 곳은 빨간색으로 해놓았습니다.
( 참고한 사이트 : http://i5on9i.blogspot.kr/2014/05/simplehttpserver.html )
#-*- coding: utf-8 -*-
# python 2.7.x
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import json, re, urllib2, urllib, time
import hmac,hashlib
# This class will handles any incoming request from
# the browser
class MyHandler(BaseHTTPRequestHandler):
def _genParamDic(self, params):
paramDic = {}
for i in params.split('&'):
if i.find('=') is -1:
continue
key, val = i.split('=')
paramDic[key] = val
return paramDic
def _doSend(self, retMessage):
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(retMessage)
def _get(self, url):
req = urllib2.Request(url)
resp = urllib2.urlopen(req, timeout=10)
retMessage = resp.read()
return retMessage
def _post(self, url, post_data, headers={}):
post_data = urllib.urlencode(post_data)
req = urllib2.Request(url, post_data, headers)
resp = urllib2.urlopen(req, timeout=10)
retMessage = resp.read()
return retMessage
# Handler for the POST requests
def do_POST(self):
self.do_GET()
return
# Handler for the GET requests
def do_GET(self):
pathes = self.path.split('/')
retMessage = ''
if len(pathes) < 3:
return
sep = re.split('/|\?', self.path)
reqType = sep[1]
reqTarget = sep[2]
params = ''
paramDic = ''
if len(sep) > 3:
params = sep[3]
paramDic = self._genParamDic(params)
# URL 접근 시 변수 예시
# http://127.0.0.1/coinone/ticker?currency=btc&test=1
# reqType = coinone
# reqTarget = ticker
# params = currency=btc&test=1
# paramDic = {'currency':'btc', 'test'='1'}
#-----------여기에 코드를 넣습니다-----------#
#--------------------------------------------#
return
if __name__=="__main__":
IP_ADDR = '?.?.?.?' # 자신의 아이피
PORT_NUMBER = 80
try:
# Create a web server and define the handler to manage the
# incoming request
server = HTTPServer((IP_ADDR, PORT_NUMBER), MyHandler)
print('Started httpserver on port ', PORT_NUMBER)
# Wait forever for incoming htto requests
server.serve_forever()
except KeyboardInterrupt:
print('^C received, shutting down the web server')
server.socket.close()
2. IP_ADDR에 자신의 아이피를 확인하여 넣습니다.
- 확인법 : 윈도우키+R > cmd 입력 > ipconfig 입력 > 이더넷 어댑터 부분의 IPv4 주소
3. F5를 눌러서 실행하면 자신의 아이피로 웹 서버가 동작을 시작합니다.
"http://자신의아이피/" 으로 동작합니다.
4. URL으로 입력하는 명령어는 다음과 같습니다.
# http://자신의아이피/명령어1/명령어2?변수1=a&변수2=b
reqType : 명령어1
reqTarget : 명령어2
params : 변수1=a&변수2=b
paramDic : {'변수1' : 'a', '변수2' : 'b'}
5. 코드 넣는 부분에는 다음과 같이 처리하면 됩니다.
5-1. coinone ticker 코드 예제
if reqType == 'coinone':
if reqTarget == 'ticker':
retMessage = self._get('https://api.coinone.co.kr/ticker/?'+params)
self._doSend(retMessage)
5-2. coinone ticker 입출력 예제
입력 : http://자신의아이피/coinone/ticker?currency=all
출력 : {"result":"success","volume":"18097.1977","last":"4630000","timestamp":"1502647387",......
※ 전체 예제 코드
#-----------여기에 코드를 넣습니다-----------#
if reqType == 'coinone':
if reqTarget == 'ticker':
retMessage = self._get('https://api.coinone.co.kr/ticker/?'+params)
self._doSend(retMessage)
elif reqTarget == 'orderbook':
retMessage = self._get('https://api.coinone.co.kr/orderbook/?'+params)
self._doSend(retMessage)
elif reqType == 'bithumb':
if reqTarget == 'ticker':
retMessage = self._get('https://api.bithumb.com/public/ticker/'+params)
self._doSend(retMessage)
elif reqTarget == 'orderbook':
retMessage = self._get('https://api.bithumb.com/public/orderbook/'+params)
self._doSend(retMessage)
#--------------------------------------------#
6. 잘 되는지 확인
6. html코드에서 python 명령어 실행
jquery로 데이터 가져오는 URL부분을 작성한 python 코드에 맞게 수정합니다.
[ 참고(거래소api를 html으로 다루기) : https://www.ddengle.com/bitcoindeveloper_voted/2641559 ]
$.get('http://자신의아이피/coinone/ticker?currency=all', function(data) {
var coinone_btc = parseFloat(data['btc']['last']);
...........
이렇게 만들면 크로스도메인 문제 해결할 수 있으며, 데이터는 파이썬에서 처리하게 만들 수 있습니다.
실제로 python에서 데이터를 처리하고 거래소를 통해 매수/매도 하는 방법은 글이 너무 길어져 추후 다루겠습니다.
땡글에서도 트레이딩 알고리즘에 대한 정보공유가 활발해졌으면 하는 마음으로 올립니다.
감사합니다.