├── README.md ├── example.py ├── fcoin.py └── fcoin3.py /README.md: -------------------------------------------------------------------------------- 1 | Fcoin 交易所api 2 | 3 | 文档来源:https://developer.fcoin.com/zh.html#45fa4e00db 4 | 5 | 使用示例参见:example.py 6 | 7 | fcoin.py适用于python2版本 8 | fcoin3.py适用于python3版本 9 | -------------------------------------------------------------------------------- /example.py: -------------------------------------------------------------------------------- 1 | from fcoin import Fcoin 2 | #if python3 use fcoin3 3 | #from fcoin3 import Fcoin 4 | 5 | 6 | fcoin = Fcoin() 7 | 8 | print(fcoin.get_symbols()) 9 | 10 | print(fcoin.get_currencies()) 11 | 12 | fcoin.auth('you-key', 'you-secret') 13 | 14 | print(fcoin.get_balance()) 15 | 16 | print(fcoin.buy('fteth', 0.0001, 10)) 17 | #print(fcoin.sell('fteth', 0.002, 5)) 18 | #print(fcoin.cancel_order('6TfBZ-eORp4_2nO5ar6zhg0gLLvuWzTTmL1OzOy9OYg=')) 19 | #print(fcoin.get_candle('M1','fteth')) 20 | -------------------------------------------------------------------------------- /fcoin.py: -------------------------------------------------------------------------------- 1 | import hmac 2 | import hashlib 3 | import requests 4 | import sys 5 | import time 6 | import base64 7 | import json 8 | from collections import OrderedDict 9 | 10 | class Fcoin(): 11 | def __init__(self,base_url = 'https://api.fcoin.com/v2/'): 12 | self.base_url = base_url 13 | 14 | def auth(self, key, secret): 15 | self.key = key 16 | self.secret = secret 17 | 18 | 19 | def public_request(self, method, api_url, **payload): 20 | """request public url""" 21 | r_url = self.base_url + api_url 22 | try: 23 | r = requests.request(method, r_url, params=payload) 24 | r.raise_for_status() 25 | except requests.exceptions.HTTPError as err: 26 | print(err) 27 | if r.status_code == 200: 28 | return r.json() 29 | 30 | def get_signed(self, sig_str): 31 | """signed params use sha512""" 32 | # sig_str = base64.b64decode(bytes(sig_str)) 33 | sig_str = base64.b64encode(sig_str) 34 | signature = base64.b64encode(hmac.new(self.secret, sig_str, digestmod=hashlib.sha1).digest()) 35 | return signature 36 | 37 | 38 | def signed_request(self, method, api_url, **payload): 39 | """request a signed url""" 40 | 41 | param='' 42 | if payload: 43 | sort_pay = payload.items() 44 | sort_pay.sort() 45 | for k in sort_pay: 46 | param += '&' + str(k[0]) + '=' + str(k[1]) 47 | param = param.lstrip('&') 48 | timestamp = str(int(time.time() * 1000)) 49 | full_url = self.base_url + api_url 50 | 51 | if method == 'GET': 52 | if param: 53 | full_url = full_url + '?' +param 54 | sig_str = method + full_url + timestamp 55 | elif method == 'POST': 56 | sig_str = method + full_url + timestamp + param 57 | 58 | signature = self.get_signed(sig_str) 59 | 60 | headers = { 61 | 'FC-ACCESS-KEY': self.key, 62 | 'FC-ACCESS-SIGNATURE': signature, 63 | 'FC-ACCESS-TIMESTAMP': timestamp 64 | 65 | } 66 | 67 | try: 68 | r = requests.request(method, full_url, headers = headers, json=payload) 69 | 70 | r.raise_for_status() 71 | except requests.exceptions.HTTPError as err: 72 | print(err) 73 | print(r.text) 74 | if r.status_code == 200: 75 | return r.json() 76 | 77 | 78 | def get_server_time(self): 79 | """Get server time""" 80 | return self.public_request('GET','/public/server-time')['data'] 81 | 82 | 83 | def get_currencies(self): 84 | """get all currencies""" 85 | return self.public_request('GET', '/public/currencies')['data'] 86 | 87 | def get_symbols(self): 88 | """get all symbols""" 89 | return self.public_request('GET', '/public/symbols')['data'] 90 | 91 | def get_market_ticker(self, symbol): 92 | """get market ticker""" 93 | return self.public_request('GET', 'market/ticker/{symbol}'.format(symbol=symbol)) 94 | 95 | def get_market_depth(self, level, symbol): 96 | """get market depth""" 97 | return self.public_request('GET', 'market/depth/{level}/{symbol}'.format(level=level, symbol=symbol)) 98 | 99 | def get_trades(self,symbol): 100 | """get detail trade""" 101 | return self.public_request('GET', 'market/trades/{symbol}'.format(symbol=symbol)) 102 | 103 | def get_balance(self): 104 | """get user balance""" 105 | return self.signed_request('GET', 'accounts/balance') 106 | 107 | def list_orders(self, **payload): 108 | """get orders""" 109 | return self.signed_request('GET','orders', **payload) 110 | 111 | def create_order(self, **payload): 112 | """create order""" 113 | return self.signed_request('POST','orders', **payload) 114 | 115 | def buy(self,symbol, price, amount): 116 | """buy someting""" 117 | return self.create_order(symbol=symbol, side='buy', type='limit', price=str(price), amount=amount) 118 | 119 | def sell(self, symbol, price, amount): 120 | """sell someting""" 121 | return self.create_order(symbol=symbol, side='sell', type='limit', price=str(price), amount=amount) 122 | 123 | def get_order(self,order_id): 124 | """get specfic order""" 125 | return self.signed_request('GET', 'orders/{order_id}'.format(order_id=order_id)) 126 | 127 | def cancel_order(self,order_id): 128 | """cancel specfic order""" 129 | return self.signed_request('POST', 'orders/{order_id}/submit-cancel'.format(order_id=order_id)) 130 | 131 | def order_result(self, order_id): 132 | """check order result""" 133 | return self.signed_request('GET', 'orders/{order_id}/match-results'.format(order_id=order_id)) 134 | def get_candle(self,resolution, symbol, **payload): 135 | """get candle data""" 136 | return self.public_request('GET', 'market/candles/{resolution}/{symbol}'.format(resolution=resolution, symbol=symbol), **payload) 137 | 138 | 139 | -------------------------------------------------------------------------------- /fcoin3.py: -------------------------------------------------------------------------------- 1 | import hmac 2 | import hashlib 3 | import requests 4 | import sys 5 | import time 6 | import base64 7 | import json 8 | from collections import OrderedDict 9 | 10 | class Fcoin(): 11 | def __init__(self,base_url = 'https://api.fcoin.com/v2/'): 12 | self.base_url = base_url 13 | 14 | def auth(self, key, secret): 15 | self.key = bytes(key,'utf-8') 16 | self.secret = bytes(secret, 'utf-8') 17 | 18 | 19 | def public_request(self, method, api_url, **payload): 20 | """request public url""" 21 | r_url = self.base_url + api_url 22 | try: 23 | r = requests.request(method, r_url, params=payload) 24 | r.raise_for_status() 25 | except requests.exceptions.HTTPError as err: 26 | print(err) 27 | if r.status_code == 200: 28 | return r.json() 29 | 30 | def get_signed(self, sig_str): 31 | """signed params use sha512""" 32 | sig_str = base64.b64encode(sig_str) 33 | signature = base64.b64encode(hmac.new(self.secret, sig_str, digestmod=hashlib.sha1).digest()) 34 | return signature 35 | 36 | 37 | def signed_request(self, method, api_url, **payload): 38 | """request a signed url""" 39 | 40 | param='' 41 | if payload: 42 | sort_pay = sorted(payload.items()) 43 | #sort_pay.sort() 44 | for k in sort_pay: 45 | param += '&' + str(k[0]) + '=' + str(k[1]) 46 | param = param.lstrip('&') 47 | timestamp = str(int(time.time() * 1000)) 48 | full_url = self.base_url + api_url 49 | 50 | if method == 'GET': 51 | if param: 52 | full_url = full_url + '?' +param 53 | sig_str = method + full_url + timestamp 54 | elif method == 'POST': 55 | sig_str = method + full_url + timestamp + param 56 | 57 | signature = self.get_signed(bytes(sig_str, 'utf-8')) 58 | 59 | headers = { 60 | 'FC-ACCESS-KEY': self.key, 61 | 'FC-ACCESS-SIGNATURE': signature, 62 | 'FC-ACCESS-TIMESTAMP': timestamp 63 | 64 | } 65 | 66 | try: 67 | r = requests.request(method, full_url, headers = headers, json=payload) 68 | 69 | r.raise_for_status() 70 | except requests.exceptions.HTTPError as err: 71 | print(err) 72 | print(r.text) 73 | if r.status_code == 200: 74 | return r.json() 75 | 76 | 77 | def get_server_time(self): 78 | """Get server time""" 79 | return self.public_request('GET','/public/server-time')['data'] 80 | 81 | 82 | def get_currencies(self): 83 | """get all currencies""" 84 | return self.public_request('GET', '/public/currencies')['data'] 85 | 86 | def get_symbols(self): 87 | """get all symbols""" 88 | return self.public_request('GET', '/public/symbols')['data'] 89 | 90 | def get_market_ticker(self, symbol): 91 | """get market ticker""" 92 | return self.public_request('GET', 'market/ticker/{symbol}'.format(symbol=symbol)) 93 | 94 | def get_market_depth(self, level, symbol): 95 | """get market depth""" 96 | return self.public_request('GET', 'market/depth/{level}/{symbol}'.format(level=level, symbol=symbol)) 97 | 98 | def get_trades(self,symbol): 99 | """get detail trade""" 100 | return self.public_request('GET', 'market/trades/{symbol}'.format(symbol=symbol)) 101 | 102 | def get_balance(self): 103 | """get user balance""" 104 | return self.signed_request('GET', 'accounts/balance') 105 | 106 | def list_orders(self, **payload): 107 | """get orders""" 108 | return self.signed_request('GET','orders', **payload) 109 | 110 | def create_order(self, **payload): 111 | """create order""" 112 | return self.signed_request('POST','orders', **payload) 113 | 114 | def buy(self,symbol, price, amount): 115 | """buy someting""" 116 | return self.create_order(symbol=symbol, side='buy', type='limit', price=str(price), amount=amount) 117 | 118 | def sell(self, symbol, price, amount): 119 | """sell someting""" 120 | return self.create_order(symbol=symbol, side='sell', type='limit', price=str(price), amount=amount) 121 | 122 | def get_order(self,order_id): 123 | """get specfic order""" 124 | return self.signed_request('GET', 'orders/{order_id}'.format(order_id=order_id)) 125 | 126 | def cancel_order(self,order_id): 127 | """cancel specfic order""" 128 | return self.signed_request('POST', 'orders/{order_id}/submit-cancel'.format(order_id=order_id)) 129 | 130 | def order_result(self, order_id): 131 | """check order result""" 132 | return self.signed_request('GET', 'orders/{order_id}/match-results'.format(order_id=order_id)) 133 | def get_candle(self,resolution, symbol, **payload): 134 | """get candle data""" 135 | return self.public_request('GET', 'market/candles/{resolution}/{symbol}'.format(resolution=resolution, symbol=symbol), **payload) 136 | 137 | 138 | --------------------------------------------------------------------------------