From be3f2c90eb94ed183da3f2a9bb2e667199e1c52f Mon Sep 17 00:00:00 2001 From: citroen Date: Fri, 17 Nov 2017 18:25:46 +0100 Subject: [PATCH 01/11] modified: cexapi/cexapi.py --- cexapi/cexapi.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py index 8b86b88..30a0560 100644 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -74,6 +74,10 @@ def cancel_order(self, order_id): def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) + def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): + return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type" : "market"}, 1, couple) + + def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): return self.api_call( 'price_stats', From 67421ab1ac7222db48780892d70a900ad8b3cb3b Mon Sep 17 00:00:00 2001 From: citroen Date: Fri, 17 Nov 2017 18:29:30 +0100 Subject: [PATCH 02/11] modified: cexapi/cexapi.py --- cexapi/cexapi.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py index 30a0560..13173dd 100644 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -74,10 +74,9 @@ def cancel_order(self, order_id): def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) - def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): + def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type" : "market"}, 1, couple) - def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): return self.api_call( 'price_stats', From 0a9bc505b3a831df61988db1e1b6717d77fe01b2 Mon Sep 17 00:00:00 2001 From: shamanou Date: Sat, 18 Nov 2017 18:17:28 +0100 Subject: [PATCH 03/11] updates - Removed requirment of api key and secret for default call - added markets call --- cexapi/cexapi.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py index 13173dd..054b118 100644 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -19,7 +19,7 @@ class API(object): __nonce_v = '' # Init class - def __init__(self, username, api_key, api_secret): + def __init__(self, username="", api_key="", api_secret=""): self.__username = username self.__api_key = api_key self.__api_secret = api_secret @@ -76,6 +76,10 @@ def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type" : "market"}, 1, couple) + + def markets(self): + response = self.api_call("currency_limits", ) + return [ pair['symbol1'] + "/" + pair['symbol2'] for pair in response['data']['pairs'] ] def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): return self.api_call( From 74ea5d23405f01df35eaf77044a0b0d092f047a2 Mon Sep 17 00:00:00 2001 From: shamanou Date: Sat, 25 Nov 2017 11:41:40 +0100 Subject: [PATCH 04/11] migrated to python 3 --- cexapi/__init__.py | 2 +- cexapi/cexapi.py | 10 +++++----- cexapi/test.py | 50 +++++++++++++++++++++++----------------------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/cexapi/__init__.py b/cexapi/__init__.py index 010ce9b..41b2cea 100644 --- a/cexapi/__init__.py +++ b/cexapi/__init__.py @@ -1 +1 @@ -from cexapi import * +from .cexapi import * diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py index 054b118..bf47f0b 100644 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -7,8 +7,8 @@ import hmac import hashlib import time -import urllib -import urllib2 +import urllib.request, urllib.parse, urllib.error +import urllib.request, urllib.error, urllib.parse import json @@ -35,9 +35,9 @@ def __signature(self): return signature def __post(self, url, param): # Post Request (Low Level API call) - params = urllib.urlencode(param) - req = urllib2.Request(url, params, {'User-agent': 'bot-cex.io-' + self.__username}) - page = urllib2.urlopen(req).read() + params = urllib.parse.urlencode(param) + req = urllib.request.Request(url, params, {'User-agent': 'bot-cex.io-' + self.__username}) + page = urllib.request.urlopen(req).read() return page def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) diff --git a/cexapi/test.py b/cexapi/test.py index 60886a7..17da241 100644 --- a/cexapi/test.py +++ b/cexapi/test.py @@ -1,28 +1,28 @@ # -*- coding: utf-8 -*- -import cexapi +from . import cexapi demo = cexapi.api(username, api_key, api_secret) -print "Ticker (GHS/BTC)" -print demo.ticker() ## or demo.ticker('GHS/BTC') -print "Ticker (BF1/BTC)" -print demo.ticker('BF1/BTC') -print "Order book (GHS/BTC)" -print demo.order_book() ## or demo.order_book('GHS/BTC') -print "Order book (BF1/BTC)" -print demo.order_book('BF1/BTC') -print "Trade history since=100 (GHS/BTC)" -print demo.trade_history(100) ## or (100,'GHS/BTC') -print "Trade history since=100 (BF1/BTC)" -print demo.trade_history(100,'BF1/BTC') -print "Balance" -print demo.balance() -print "Open orders (GHS/BTC)" -print demo.current_orders() ## or ('GHS/BTC') -print "Open orders (BF1/BTC)" -print demo.current_orders('BF1/BTC') -print "Cancel order (order_id=100)" -print demo.cancel_order(100) -print "Plaсe order buy 4GHS/0.1BTC)" -print demo.place_order('buy',1,0.1) ## or ('buy',1,0.1,'GHS/BTC') -print "Open orders sell 1BF1/1.5BTC" -print demo.place_order('sell',1,1.5,'BF1/BTC') +print("Ticker (GHS/BTC)") +print(demo.ticker()) ## or demo.ticker('GHS/BTC') +print("Ticker (BF1/BTC)") +print(demo.ticker('BF1/BTC')) +print("Order book (GHS/BTC)") +print(demo.order_book()) ## or demo.order_book('GHS/BTC') +print("Order book (BF1/BTC)") +print(demo.order_book('BF1/BTC')) +print("Trade history since=100 (GHS/BTC)") +print(demo.trade_history(100)) ## or (100,'GHS/BTC') +print("Trade history since=100 (BF1/BTC)") +print(demo.trade_history(100,'BF1/BTC')) +print("Balance") +print(demo.balance()) +print("Open orders (GHS/BTC)") +print(demo.current_orders()) ## or ('GHS/BTC') +print("Open orders (BF1/BTC)") +print(demo.current_orders('BF1/BTC')) +print("Cancel order (order_id=100)") +print(demo.cancel_order(100)) +print("Plaсe order buy 4GHS/0.1BTC)") +print(demo.place_order('buy',1,0.1)) ## or ('buy',1,0.1,'GHS/BTC') +print("Open orders sell 1BF1/1.5BTC") +print(demo.place_order('sell',1,1.5,'BF1/BTC')) From a3ad31f829c656ea42b7be908c79c4cb9dfa2d16 Mon Sep 17 00:00:00 2001 From: shamanou Date: Sat, 25 Nov 2017 16:31:51 +0100 Subject: [PATCH 05/11] eclipse project files included --- .project | 17 +++ .pydevproject | 5 + .settings/org.eclipse.core.resources.prefs | 2 + build/lib.linux-x86_64-2.7/cexapi/__init__.py | 1 + build/lib.linux-x86_64-2.7/cexapi/cexapi.py | 88 ++++++++++++ build/lib.linux-x86_64-2.7/cexapi/test.py | 28 ++++ cexapi.egg-info/PKG-INFO | 133 ++++++++++++++++++ cexapi.egg-info/SOURCES.txt | 11 ++ cexapi.egg-info/dependency_links.txt | 1 + cexapi.egg-info/not-zip-safe | 1 + cexapi.egg-info/top_level.txt | 1 + dist/cexapi-0.1-py2.7.egg | Bin 0 -> 6726 bytes 12 files changed, 288 insertions(+) create mode 100644 .project create mode 100644 .pydevproject create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 build/lib.linux-x86_64-2.7/cexapi/__init__.py create mode 100644 build/lib.linux-x86_64-2.7/cexapi/cexapi.py create mode 100644 build/lib.linux-x86_64-2.7/cexapi/test.py create mode 100644 cexapi.egg-info/PKG-INFO create mode 100644 cexapi.egg-info/SOURCES.txt create mode 100644 cexapi.egg-info/dependency_links.txt create mode 100644 cexapi.egg-info/not-zip-safe create mode 100644 cexapi.egg-info/top_level.txt create mode 100644 dist/cexapi-0.1-py2.7.egg diff --git a/.project b/.project new file mode 100644 index 0000000..4e21efe --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + cex.io-api-python + + + + + + org.python.pydev.PyDevBuilder + + + + + + org.python.pydev.pythonNature + + diff --git a/.pydevproject b/.pydevproject new file mode 100644 index 0000000..d001f0a --- /dev/null +++ b/.pydevproject @@ -0,0 +1,5 @@ + + +Default +python interpreter + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..69defe9 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding//cexapi/cexapi.py=utf-8 diff --git a/build/lib.linux-x86_64-2.7/cexapi/__init__.py b/build/lib.linux-x86_64-2.7/cexapi/__init__.py new file mode 100644 index 0000000..41b2cea --- /dev/null +++ b/build/lib.linux-x86_64-2.7/cexapi/__init__.py @@ -0,0 +1 @@ +from .cexapi import * diff --git a/build/lib.linux-x86_64-2.7/cexapi/cexapi.py b/build/lib.linux-x86_64-2.7/cexapi/cexapi.py new file mode 100644 index 0000000..bf47f0b --- /dev/null +++ b/build/lib.linux-x86_64-2.7/cexapi/cexapi.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# Author: t0pep0 +# e-mail: t0pep0.gentoo@gmail.com +# Jabber: t0pep0@jabber.ru +# BTC : 1ipEA2fcVyjiUnBqUx7PVy5efktz2hucb +# donate free =) +import hmac +import hashlib +import time +import urllib.request, urllib.parse, urllib.error +import urllib.request, urllib.error, urllib.parse +import json + + +class API(object): + __username = '' + __api_key = '' + __api_secret = '' + __nonce_v = '' + + # Init class + def __init__(self, username="", api_key="", api_secret=""): + self.__username = username + self.__api_key = api_key + self.__api_secret = api_secret + + # get timestamp as nonce + def __nonce(self): + self.__nonce_v = '{:.10f}'.format(time.time() * 1000).split('.')[0] + + # generate segnature + def __signature(self): + string = self.__nonce_v + self.__username + self.__api_key # create string + signature = hmac.new(self.__api_secret, string, digestmod=hashlib.sha256).hexdigest().upper() # create signature + return signature + + def __post(self, url, param): # Post Request (Low Level API call) + params = urllib.parse.urlencode(param) + req = urllib.request.Request(url, params, {'User-agent': 'bot-cex.io-' + self.__username}) + page = urllib.request.urlopen(req).read() + return page + + def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) + url = 'https://cex.io/api/' + method + '/' # generate url + if couple != '': + url = url + couple + '/' # set couple if needed + if private == 1: # add auth-data if needed + self.__nonce() + param.update({ + 'key': self.__api_key, + 'signature': self.__signature(), + 'nonce': self.__nonce_v}) + answer = self.__post(url, param) # Post Request + return json.loads(answer) # generate dict and return + + def ticker(self, couple='GHS/BTC'): + return self.api_call('ticker', {}, 0, couple) + + def order_book(self, couple='GHS/BTC'): + return self.api_call('order_book', {}, 0, couple) + + def trade_history(self, since=1, couple='GHS/BTC'): + return self.api_call('trade_history', {"since": str(since)}, 0, couple) + + def balance(self): + return self.api_call('balance', {}, 1) + + def current_orders(self, couple='GHS/BTC'): + return self.api_call('open_orders', {}, 1, couple) + + def cancel_order(self, order_id): + return self.api_call('cancel_order', {"id": order_id}, 1) + + def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): + return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) + + def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): + return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type" : "market"}, 1, couple) + + def markets(self): + response = self.api_call("currency_limits", ) + return [ pair['symbol1'] + "/" + pair['symbol2'] for pair in response['data']['pairs'] ] + + def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): + return self.api_call( + 'price_stats', + {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, + 0, couple) diff --git a/build/lib.linux-x86_64-2.7/cexapi/test.py b/build/lib.linux-x86_64-2.7/cexapi/test.py new file mode 100644 index 0000000..17da241 --- /dev/null +++ b/build/lib.linux-x86_64-2.7/cexapi/test.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from . import cexapi + +demo = cexapi.api(username, api_key, api_secret) +print("Ticker (GHS/BTC)") +print(demo.ticker()) ## or demo.ticker('GHS/BTC') +print("Ticker (BF1/BTC)") +print(demo.ticker('BF1/BTC')) +print("Order book (GHS/BTC)") +print(demo.order_book()) ## or demo.order_book('GHS/BTC') +print("Order book (BF1/BTC)") +print(demo.order_book('BF1/BTC')) +print("Trade history since=100 (GHS/BTC)") +print(demo.trade_history(100)) ## or (100,'GHS/BTC') +print("Trade history since=100 (BF1/BTC)") +print(demo.trade_history(100,'BF1/BTC')) +print("Balance") +print(demo.balance()) +print("Open orders (GHS/BTC)") +print(demo.current_orders()) ## or ('GHS/BTC') +print("Open orders (BF1/BTC)") +print(demo.current_orders('BF1/BTC')) +print("Cancel order (order_id=100)") +print(demo.cancel_order(100)) +print("Plaсe order buy 4GHS/0.1BTC)") +print(demo.place_order('buy',1,0.1)) ## or ('buy',1,0.1,'GHS/BTC') +print("Open orders sell 1BF1/1.5BTC") +print(demo.place_order('sell',1,1.5,'BF1/BTC')) diff --git a/cexapi.egg-info/PKG-INFO b/cexapi.egg-info/PKG-INFO new file mode 100644 index 0000000..0c188e8 --- /dev/null +++ b/cexapi.egg-info/PKG-INFO @@ -0,0 +1,133 @@ +Metadata-Version: 1.1 +Name: cexapi +Version: 0.1 +Summary: CEX.IO API integration. +Home-page: UNKNOWN +Author: t0pep0 +Author-email: t0pep0.gentoo@gmail.com +License: UNKNOWN +Description-Content-Type: UNKNOWN +Description: cex.io-api-python + ================= + + CEX.IO API integration. Python sources. + + ##Intro + + 1. Download lib + 2. Get API key and API secret on https://cex.io/trade/profile + + ##How to use? + + ###1. Create your python project + + ###2. Add "import cexapi" + + ###3. Create class + ```python + api = cexapi.api(username,api_key,api_secret) + ``` + username - your username on cex.io + api_key - your API key + api_secret - your API secret code + + ###4. Methods and parameters: + + ####a) API method parametrs + ``` + 1. couple = ("GHS\BTC" | "BF1\BTC") currency pair + 2. since = integer return trades with tid >= since + 3. order_id = integer + 4. ptype = ("sell" | "buy") type of order + 5. amount = float + 6. price = float + ``` + + ####b) API methods + ``` + 1. ticker(couple = 'GHS/BTC') - get ticker + 2. order_book(couple = 'GHS/BTC') - get order + 3. trade_history(since = 1, couple = 'GHS/BTC') - get all order + 4. balance() - get your balance + 5. current_orders(couple = 'GHS/BTC') - get open order + 6. cancel_order(order_id) - cancel order №order_id + 7. place_order(ptype = 'buy', amount = 1, price = 1, couple = 'GHS/BTC') - create order + ``` + + ####c) Full API documentation: https://cex.io/api + + ###5. Examples + + ####Connect and get balance: + ```python + import cexapi + api = cexapi.api(username, api_key, api_secret) + print api.balance() + ``` + ```json + {'timestamp': '1383378763', 'BTC': {'available': '0.04722110', 'orders': '0.00170000'}, 'GHS': {'available': '0.01000000'} } + ``` + + ####Get balance: + ```python + print api.balance() + ``` + ```json + {'timestamp': '1383379054', 'BTC': {'available': '0.04614310', 'orders': '0.00170000'}, 'GHS': {'available': '0.02000000'}} + ``` + + ####Get API ticker: + ```python + print api.ticker('GHS/BTC') + ``` + ```json + {'volume': '7154.78339022', 'last': '0.1078', 'timestamp': '1383379041', 'bid': '0.10778', 'high': '0.10799999', 'low': '0.10670076', 'ask': '0.10780000000000001'} + ``` + + ####Get order book: + ```python + print api.order_book('BF1/BTC') + ``` + ```json + {'timestamp': '1383378967', 'bids': [['1.7', '0.30100000'], ['1.67', '0.00011000'], ['0.8', '0.02070000'], ['0.1002', '0.27748002'], ['0.1', '0.10000000'], ['0.011', '0.30500000'], ['0.009', '1.00000000'], ['0.00171', '0.00100000'], ['0.0012', '1.00000000'], ['0.00116819', '0.50000000'], ['0.001002', '33.00000000'], ['0.001001', '53.00000000'], ['0.001', '3.00000000'], ['0.00097626', '36.00000000'], ['0.0006', '85.00000000'], ['0.00058409', '0.50000000'], ['0.0004889', '0.06823960'], ['0.0003', '1.00000000'], ['0.00029204', '0.90000000'], ['0.0001', '101.00000000']], 'asks': []} + ``` + + ####Get your current active orders: + ```python + print api.current_orders('BF1/BTC') + ``` + ```json + [{'price': '1.7', 'amount': '0.00100000', 'time': '1383378514737', 'type': 'buy', 'id': '6219104', 'pending': '0.00100000'}] + ``` + + ####Place new order: + ```python + print api.place_order('buy', 0.001, 1.7, 'BF1/BTC') + ``` + ```json + {'price': '1.7', 'amount': '0.00100000', 'time': 1383378987622, 'type': 'buy', 'id': '6219145', 'pending': '0.00100000'} + ``` + + ####Place another order (GHS/BTC): + ```python + print api.place_order('buy', 0.01, 0.10789, 'GHS/BTC') + ``` + ```json + {'price': '0.10789', 'amount': '0.01000000', 'time': 1383379024072, 'type': 'buy', 'id': '6219150', 'pending': '0.00000000'} + ``` + + ####Cancel order: + ```python + print api.cancel_order(6219145) + ``` + ```json + True + ``` + + + + +Keywords: cex api bitcoin +Platform: UNKNOWN +Classifier: Programming Language :: Python +Classifier: Topic :: Office/Business :: Financial diff --git a/cexapi.egg-info/SOURCES.txt b/cexapi.egg-info/SOURCES.txt new file mode 100644 index 0000000..2c5c66f --- /dev/null +++ b/cexapi.egg-info/SOURCES.txt @@ -0,0 +1,11 @@ +README.md +setup.cfg +setup.py +cexapi/__init__.py +cexapi/cexapi.py +cexapi/test.py +cexapi.egg-info/PKG-INFO +cexapi.egg-info/SOURCES.txt +cexapi.egg-info/dependency_links.txt +cexapi.egg-info/not-zip-safe +cexapi.egg-info/top_level.txt \ No newline at end of file diff --git a/cexapi.egg-info/dependency_links.txt b/cexapi.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/cexapi.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/cexapi.egg-info/not-zip-safe b/cexapi.egg-info/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/cexapi.egg-info/not-zip-safe @@ -0,0 +1 @@ + diff --git a/cexapi.egg-info/top_level.txt b/cexapi.egg-info/top_level.txt new file mode 100644 index 0000000..f19c946 --- /dev/null +++ b/cexapi.egg-info/top_level.txt @@ -0,0 +1 @@ +cexapi diff --git a/dist/cexapi-0.1-py2.7.egg b/dist/cexapi-0.1-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..fa7658e769a09028295c4824c8c3d1cb753e3808 GIT binary patch literal 6726 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 Date: Sat, 25 Nov 2017 16:44:48 +0100 Subject: [PATCH 06/11] replaced urllib with requests --- build/lib/cexapi/__init__.py | 1 + build/lib/cexapi/cexapi.py | 88 +++++++++++++++++++++++++++++++++++ build/lib/cexapi/test.py | 28 +++++++++++ cexapi.egg-info/PKG-INFO | 3 +- cexapi/cexapi.py | 29 ++++++------ dist/cexapi-0.1-py3.6.egg | Bin 0 -> 7017 bytes 6 files changed, 133 insertions(+), 16 deletions(-) create mode 100644 build/lib/cexapi/__init__.py create mode 100644 build/lib/cexapi/cexapi.py create mode 100644 build/lib/cexapi/test.py create mode 100644 dist/cexapi-0.1-py3.6.egg diff --git a/build/lib/cexapi/__init__.py b/build/lib/cexapi/__init__.py new file mode 100644 index 0000000..41b2cea --- /dev/null +++ b/build/lib/cexapi/__init__.py @@ -0,0 +1 @@ +from .cexapi import * diff --git a/build/lib/cexapi/cexapi.py b/build/lib/cexapi/cexapi.py new file mode 100644 index 0000000..bf47f0b --- /dev/null +++ b/build/lib/cexapi/cexapi.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# Author: t0pep0 +# e-mail: t0pep0.gentoo@gmail.com +# Jabber: t0pep0@jabber.ru +# BTC : 1ipEA2fcVyjiUnBqUx7PVy5efktz2hucb +# donate free =) +import hmac +import hashlib +import time +import urllib.request, urllib.parse, urllib.error +import urllib.request, urllib.error, urllib.parse +import json + + +class API(object): + __username = '' + __api_key = '' + __api_secret = '' + __nonce_v = '' + + # Init class + def __init__(self, username="", api_key="", api_secret=""): + self.__username = username + self.__api_key = api_key + self.__api_secret = api_secret + + # get timestamp as nonce + def __nonce(self): + self.__nonce_v = '{:.10f}'.format(time.time() * 1000).split('.')[0] + + # generate segnature + def __signature(self): + string = self.__nonce_v + self.__username + self.__api_key # create string + signature = hmac.new(self.__api_secret, string, digestmod=hashlib.sha256).hexdigest().upper() # create signature + return signature + + def __post(self, url, param): # Post Request (Low Level API call) + params = urllib.parse.urlencode(param) + req = urllib.request.Request(url, params, {'User-agent': 'bot-cex.io-' + self.__username}) + page = urllib.request.urlopen(req).read() + return page + + def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) + url = 'https://cex.io/api/' + method + '/' # generate url + if couple != '': + url = url + couple + '/' # set couple if needed + if private == 1: # add auth-data if needed + self.__nonce() + param.update({ + 'key': self.__api_key, + 'signature': self.__signature(), + 'nonce': self.__nonce_v}) + answer = self.__post(url, param) # Post Request + return json.loads(answer) # generate dict and return + + def ticker(self, couple='GHS/BTC'): + return self.api_call('ticker', {}, 0, couple) + + def order_book(self, couple='GHS/BTC'): + return self.api_call('order_book', {}, 0, couple) + + def trade_history(self, since=1, couple='GHS/BTC'): + return self.api_call('trade_history', {"since": str(since)}, 0, couple) + + def balance(self): + return self.api_call('balance', {}, 1) + + def current_orders(self, couple='GHS/BTC'): + return self.api_call('open_orders', {}, 1, couple) + + def cancel_order(self, order_id): + return self.api_call('cancel_order', {"id": order_id}, 1) + + def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): + return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) + + def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): + return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type" : "market"}, 1, couple) + + def markets(self): + response = self.api_call("currency_limits", ) + return [ pair['symbol1'] + "/" + pair['symbol2'] for pair in response['data']['pairs'] ] + + def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): + return self.api_call( + 'price_stats', + {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, + 0, couple) diff --git a/build/lib/cexapi/test.py b/build/lib/cexapi/test.py new file mode 100644 index 0000000..17da241 --- /dev/null +++ b/build/lib/cexapi/test.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from . import cexapi + +demo = cexapi.api(username, api_key, api_secret) +print("Ticker (GHS/BTC)") +print(demo.ticker()) ## or demo.ticker('GHS/BTC') +print("Ticker (BF1/BTC)") +print(demo.ticker('BF1/BTC')) +print("Order book (GHS/BTC)") +print(demo.order_book()) ## or demo.order_book('GHS/BTC') +print("Order book (BF1/BTC)") +print(demo.order_book('BF1/BTC')) +print("Trade history since=100 (GHS/BTC)") +print(demo.trade_history(100)) ## or (100,'GHS/BTC') +print("Trade history since=100 (BF1/BTC)") +print(demo.trade_history(100,'BF1/BTC')) +print("Balance") +print(demo.balance()) +print("Open orders (GHS/BTC)") +print(demo.current_orders()) ## or ('GHS/BTC') +print("Open orders (BF1/BTC)") +print(demo.current_orders('BF1/BTC')) +print("Cancel order (order_id=100)") +print(demo.cancel_order(100)) +print("Plaсe order buy 4GHS/0.1BTC)") +print(demo.place_order('buy',1,0.1)) ## or ('buy',1,0.1,'GHS/BTC') +print("Open orders sell 1BF1/1.5BTC") +print(demo.place_order('sell',1,1.5,'BF1/BTC')) diff --git a/cexapi.egg-info/PKG-INFO b/cexapi.egg-info/PKG-INFO index 0c188e8..d95f277 100644 --- a/cexapi.egg-info/PKG-INFO +++ b/cexapi.egg-info/PKG-INFO @@ -6,7 +6,6 @@ Home-page: UNKNOWN Author: t0pep0 Author-email: t0pep0.gentoo@gmail.com License: UNKNOWN -Description-Content-Type: UNKNOWN Description: cex.io-api-python ================= @@ -50,7 +49,7 @@ Description: cex.io-api-python 3. trade_history(since = 1, couple = 'GHS/BTC') - get all order 4. balance() - get your balance 5. current_orders(couple = 'GHS/BTC') - get open order - 6. cancel_order(order_id) - cancel order №order_id + 6. cancel_order(order_id) - cancel order â„–order_id 7. place_order(ptype = 'buy', amount = 1, price = 1, couple = 'GHS/BTC') - create order ``` diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py index bf47f0b..5495357 100644 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -4,12 +4,11 @@ # Jabber: t0pep0@jabber.ru # BTC : 1ipEA2fcVyjiUnBqUx7PVy5efktz2hucb # donate free =) -import hmac import hashlib +import hmac import time -import urllib.request, urllib.parse, urllib.error -import urllib.request, urllib.error, urllib.parse -import json +import urllib.parse +import requests class API(object): @@ -31,13 +30,15 @@ def __nonce(self): # generate segnature def __signature(self): string = self.__nonce_v + self.__username + self.__api_key # create string - signature = hmac.new(self.__api_secret, string, digestmod=hashlib.sha256).hexdigest().upper() # create signature + signature = hmac.new(self.__api_secret, string, digestmod=hashlib.sha256).hexdigest( + ).upper() # create signature return signature def __post(self, url, param): # Post Request (Low Level API call) params = urllib.parse.urlencode(param) - req = urllib.request.Request(url, params, {'User-agent': 'bot-cex.io-' + self.__username}) - page = urllib.request.urlopen(req).read() + req = requests.post( + url, data=params, headers={'User-agent': 'bot-cex.io-' + self.__username}) + page = req.json() return page def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) @@ -51,7 +52,7 @@ def api_call(self, method, param={}, private=0, couple=''): # api call (Middle 'signature': self.__signature(), 'nonce': self.__nonce_v}) answer = self.__post(url, param) # Post Request - return json.loads(answer) # generate dict and return + return answer # generate dict and return def ticker(self, couple='GHS/BTC'): return self.api_call('ticker', {}, 0, couple) @@ -75,14 +76,14 @@ def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): - return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type" : "market"}, 1, couple) - + return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type": "market"}, 1, couple) + def markets(self): response = self.api_call("currency_limits", ) - return [ pair['symbol1'] + "/" + pair['symbol2'] for pair in response['data']['pairs'] ] + return [pair['symbol1'] + "/" + pair['symbol2'] for pair in response['data']['pairs']] def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): return self.api_call( - 'price_stats', - {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, - 0, couple) + 'price_stats', + {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, + 0, couple) diff --git a/dist/cexapi-0.1-py3.6.egg b/dist/cexapi-0.1-py3.6.egg new file mode 100644 index 0000000000000000000000000000000000000000..5f694e1f491ba10ea334b6c6232bdbc94e16fa3d GIT binary patch literal 7017 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 literal 0 HcmV?d00001 From 90cfa579ad057140ae493180c152287a1cf5a0a6 Mon Sep 17 00:00:00 2001 From: shamanou Date: Sat, 25 Nov 2017 16:54:47 +0100 Subject: [PATCH 07/11] removed clutter --- CHANGES.txt | 0 build/lib.linux-x86_64-2.7/cexapi/__init__.py | 1 - build/lib.linux-x86_64-2.7/cexapi/cexapi.py | 88 ------------ build/lib.linux-x86_64-2.7/cexapi/test.py | 28 ---- build/lib/cexapi/__init__.py | 1 - build/lib/cexapi/cexapi.py | 88 ------------ build/lib/cexapi/test.py | 28 ---- cexapi.egg-info/PKG-INFO | 132 ------------------ cexapi.egg-info/SOURCES.txt | 11 -- cexapi.egg-info/dependency_links.txt | 1 - cexapi.egg-info/not-zip-safe | 1 - cexapi.egg-info/top_level.txt | 1 - dist/cexapi-0.1-py2.7.egg | Bin 6726 -> 0 bytes dist/cexapi-0.1-py3.6.egg | Bin 7017 -> 0 bytes 14 files changed, 380 deletions(-) delete mode 100644 CHANGES.txt delete mode 100644 build/lib.linux-x86_64-2.7/cexapi/__init__.py delete mode 100644 build/lib.linux-x86_64-2.7/cexapi/cexapi.py delete mode 100644 build/lib.linux-x86_64-2.7/cexapi/test.py delete mode 100644 build/lib/cexapi/__init__.py delete mode 100644 build/lib/cexapi/cexapi.py delete mode 100644 build/lib/cexapi/test.py delete mode 100644 cexapi.egg-info/PKG-INFO delete mode 100644 cexapi.egg-info/SOURCES.txt delete mode 100644 cexapi.egg-info/dependency_links.txt delete mode 100644 cexapi.egg-info/not-zip-safe delete mode 100644 cexapi.egg-info/top_level.txt delete mode 100644 dist/cexapi-0.1-py2.7.egg delete mode 100644 dist/cexapi-0.1-py3.6.egg diff --git a/CHANGES.txt b/CHANGES.txt deleted file mode 100644 index e69de29..0000000 diff --git a/build/lib.linux-x86_64-2.7/cexapi/__init__.py b/build/lib.linux-x86_64-2.7/cexapi/__init__.py deleted file mode 100644 index 41b2cea..0000000 --- a/build/lib.linux-x86_64-2.7/cexapi/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .cexapi import * diff --git a/build/lib.linux-x86_64-2.7/cexapi/cexapi.py b/build/lib.linux-x86_64-2.7/cexapi/cexapi.py deleted file mode 100644 index bf47f0b..0000000 --- a/build/lib.linux-x86_64-2.7/cexapi/cexapi.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -# Author: t0pep0 -# e-mail: t0pep0.gentoo@gmail.com -# Jabber: t0pep0@jabber.ru -# BTC : 1ipEA2fcVyjiUnBqUx7PVy5efktz2hucb -# donate free =) -import hmac -import hashlib -import time -import urllib.request, urllib.parse, urllib.error -import urllib.request, urllib.error, urllib.parse -import json - - -class API(object): - __username = '' - __api_key = '' - __api_secret = '' - __nonce_v = '' - - # Init class - def __init__(self, username="", api_key="", api_secret=""): - self.__username = username - self.__api_key = api_key - self.__api_secret = api_secret - - # get timestamp as nonce - def __nonce(self): - self.__nonce_v = '{:.10f}'.format(time.time() * 1000).split('.')[0] - - # generate segnature - def __signature(self): - string = self.__nonce_v + self.__username + self.__api_key # create string - signature = hmac.new(self.__api_secret, string, digestmod=hashlib.sha256).hexdigest().upper() # create signature - return signature - - def __post(self, url, param): # Post Request (Low Level API call) - params = urllib.parse.urlencode(param) - req = urllib.request.Request(url, params, {'User-agent': 'bot-cex.io-' + self.__username}) - page = urllib.request.urlopen(req).read() - return page - - def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) - url = 'https://cex.io/api/' + method + '/' # generate url - if couple != '': - url = url + couple + '/' # set couple if needed - if private == 1: # add auth-data if needed - self.__nonce() - param.update({ - 'key': self.__api_key, - 'signature': self.__signature(), - 'nonce': self.__nonce_v}) - answer = self.__post(url, param) # Post Request - return json.loads(answer) # generate dict and return - - def ticker(self, couple='GHS/BTC'): - return self.api_call('ticker', {}, 0, couple) - - def order_book(self, couple='GHS/BTC'): - return self.api_call('order_book', {}, 0, couple) - - def trade_history(self, since=1, couple='GHS/BTC'): - return self.api_call('trade_history', {"since": str(since)}, 0, couple) - - def balance(self): - return self.api_call('balance', {}, 1) - - def current_orders(self, couple='GHS/BTC'): - return self.api_call('open_orders', {}, 1, couple) - - def cancel_order(self, order_id): - return self.api_call('cancel_order', {"id": order_id}, 1) - - def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): - return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) - - def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): - return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type" : "market"}, 1, couple) - - def markets(self): - response = self.api_call("currency_limits", ) - return [ pair['symbol1'] + "/" + pair['symbol2'] for pair in response['data']['pairs'] ] - - def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): - return self.api_call( - 'price_stats', - {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, - 0, couple) diff --git a/build/lib.linux-x86_64-2.7/cexapi/test.py b/build/lib.linux-x86_64-2.7/cexapi/test.py deleted file mode 100644 index 17da241..0000000 --- a/build/lib.linux-x86_64-2.7/cexapi/test.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -from . import cexapi - -demo = cexapi.api(username, api_key, api_secret) -print("Ticker (GHS/BTC)") -print(demo.ticker()) ## or demo.ticker('GHS/BTC') -print("Ticker (BF1/BTC)") -print(demo.ticker('BF1/BTC')) -print("Order book (GHS/BTC)") -print(demo.order_book()) ## or demo.order_book('GHS/BTC') -print("Order book (BF1/BTC)") -print(demo.order_book('BF1/BTC')) -print("Trade history since=100 (GHS/BTC)") -print(demo.trade_history(100)) ## or (100,'GHS/BTC') -print("Trade history since=100 (BF1/BTC)") -print(demo.trade_history(100,'BF1/BTC')) -print("Balance") -print(demo.balance()) -print("Open orders (GHS/BTC)") -print(demo.current_orders()) ## or ('GHS/BTC') -print("Open orders (BF1/BTC)") -print(demo.current_orders('BF1/BTC')) -print("Cancel order (order_id=100)") -print(demo.cancel_order(100)) -print("Plaсe order buy 4GHS/0.1BTC)") -print(demo.place_order('buy',1,0.1)) ## or ('buy',1,0.1,'GHS/BTC') -print("Open orders sell 1BF1/1.5BTC") -print(demo.place_order('sell',1,1.5,'BF1/BTC')) diff --git a/build/lib/cexapi/__init__.py b/build/lib/cexapi/__init__.py deleted file mode 100644 index 41b2cea..0000000 --- a/build/lib/cexapi/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .cexapi import * diff --git a/build/lib/cexapi/cexapi.py b/build/lib/cexapi/cexapi.py deleted file mode 100644 index bf47f0b..0000000 --- a/build/lib/cexapi/cexapi.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -# Author: t0pep0 -# e-mail: t0pep0.gentoo@gmail.com -# Jabber: t0pep0@jabber.ru -# BTC : 1ipEA2fcVyjiUnBqUx7PVy5efktz2hucb -# donate free =) -import hmac -import hashlib -import time -import urllib.request, urllib.parse, urllib.error -import urllib.request, urllib.error, urllib.parse -import json - - -class API(object): - __username = '' - __api_key = '' - __api_secret = '' - __nonce_v = '' - - # Init class - def __init__(self, username="", api_key="", api_secret=""): - self.__username = username - self.__api_key = api_key - self.__api_secret = api_secret - - # get timestamp as nonce - def __nonce(self): - self.__nonce_v = '{:.10f}'.format(time.time() * 1000).split('.')[0] - - # generate segnature - def __signature(self): - string = self.__nonce_v + self.__username + self.__api_key # create string - signature = hmac.new(self.__api_secret, string, digestmod=hashlib.sha256).hexdigest().upper() # create signature - return signature - - def __post(self, url, param): # Post Request (Low Level API call) - params = urllib.parse.urlencode(param) - req = urllib.request.Request(url, params, {'User-agent': 'bot-cex.io-' + self.__username}) - page = urllib.request.urlopen(req).read() - return page - - def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) - url = 'https://cex.io/api/' + method + '/' # generate url - if couple != '': - url = url + couple + '/' # set couple if needed - if private == 1: # add auth-data if needed - self.__nonce() - param.update({ - 'key': self.__api_key, - 'signature': self.__signature(), - 'nonce': self.__nonce_v}) - answer = self.__post(url, param) # Post Request - return json.loads(answer) # generate dict and return - - def ticker(self, couple='GHS/BTC'): - return self.api_call('ticker', {}, 0, couple) - - def order_book(self, couple='GHS/BTC'): - return self.api_call('order_book', {}, 0, couple) - - def trade_history(self, since=1, couple='GHS/BTC'): - return self.api_call('trade_history', {"since": str(since)}, 0, couple) - - def balance(self): - return self.api_call('balance', {}, 1) - - def current_orders(self, couple='GHS/BTC'): - return self.api_call('open_orders', {}, 1, couple) - - def cancel_order(self, order_id): - return self.api_call('cancel_order', {"id": order_id}, 1) - - def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): - return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) - - def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): - return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type" : "market"}, 1, couple) - - def markets(self): - response = self.api_call("currency_limits", ) - return [ pair['symbol1'] + "/" + pair['symbol2'] for pair in response['data']['pairs'] ] - - def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): - return self.api_call( - 'price_stats', - {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, - 0, couple) diff --git a/build/lib/cexapi/test.py b/build/lib/cexapi/test.py deleted file mode 100644 index 17da241..0000000 --- a/build/lib/cexapi/test.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -from . import cexapi - -demo = cexapi.api(username, api_key, api_secret) -print("Ticker (GHS/BTC)") -print(demo.ticker()) ## or demo.ticker('GHS/BTC') -print("Ticker (BF1/BTC)") -print(demo.ticker('BF1/BTC')) -print("Order book (GHS/BTC)") -print(demo.order_book()) ## or demo.order_book('GHS/BTC') -print("Order book (BF1/BTC)") -print(demo.order_book('BF1/BTC')) -print("Trade history since=100 (GHS/BTC)") -print(demo.trade_history(100)) ## or (100,'GHS/BTC') -print("Trade history since=100 (BF1/BTC)") -print(demo.trade_history(100,'BF1/BTC')) -print("Balance") -print(demo.balance()) -print("Open orders (GHS/BTC)") -print(demo.current_orders()) ## or ('GHS/BTC') -print("Open orders (BF1/BTC)") -print(demo.current_orders('BF1/BTC')) -print("Cancel order (order_id=100)") -print(demo.cancel_order(100)) -print("Plaсe order buy 4GHS/0.1BTC)") -print(demo.place_order('buy',1,0.1)) ## or ('buy',1,0.1,'GHS/BTC') -print("Open orders sell 1BF1/1.5BTC") -print(demo.place_order('sell',1,1.5,'BF1/BTC')) diff --git a/cexapi.egg-info/PKG-INFO b/cexapi.egg-info/PKG-INFO deleted file mode 100644 index d95f277..0000000 --- a/cexapi.egg-info/PKG-INFO +++ /dev/null @@ -1,132 +0,0 @@ -Metadata-Version: 1.1 -Name: cexapi -Version: 0.1 -Summary: CEX.IO API integration. -Home-page: UNKNOWN -Author: t0pep0 -Author-email: t0pep0.gentoo@gmail.com -License: UNKNOWN -Description: cex.io-api-python - ================= - - CEX.IO API integration. Python sources. - - ##Intro - - 1. Download lib - 2. Get API key and API secret on https://cex.io/trade/profile - - ##How to use? - - ###1. Create your python project - - ###2. Add "import cexapi" - - ###3. Create class - ```python - api = cexapi.api(username,api_key,api_secret) - ``` - username - your username on cex.io - api_key - your API key - api_secret - your API secret code - - ###4. Methods and parameters: - - ####a) API method parametrs - ``` - 1. couple = ("GHS\BTC" | "BF1\BTC") currency pair - 2. since = integer return trades with tid >= since - 3. order_id = integer - 4. ptype = ("sell" | "buy") type of order - 5. amount = float - 6. price = float - ``` - - ####b) API methods - ``` - 1. ticker(couple = 'GHS/BTC') - get ticker - 2. order_book(couple = 'GHS/BTC') - get order - 3. trade_history(since = 1, couple = 'GHS/BTC') - get all order - 4. balance() - get your balance - 5. current_orders(couple = 'GHS/BTC') - get open order - 6. cancel_order(order_id) - cancel order â„–order_id - 7. place_order(ptype = 'buy', amount = 1, price = 1, couple = 'GHS/BTC') - create order - ``` - - ####c) Full API documentation: https://cex.io/api - - ###5. Examples - - ####Connect and get balance: - ```python - import cexapi - api = cexapi.api(username, api_key, api_secret) - print api.balance() - ``` - ```json - {'timestamp': '1383378763', 'BTC': {'available': '0.04722110', 'orders': '0.00170000'}, 'GHS': {'available': '0.01000000'} } - ``` - - ####Get balance: - ```python - print api.balance() - ``` - ```json - {'timestamp': '1383379054', 'BTC': {'available': '0.04614310', 'orders': '0.00170000'}, 'GHS': {'available': '0.02000000'}} - ``` - - ####Get API ticker: - ```python - print api.ticker('GHS/BTC') - ``` - ```json - {'volume': '7154.78339022', 'last': '0.1078', 'timestamp': '1383379041', 'bid': '0.10778', 'high': '0.10799999', 'low': '0.10670076', 'ask': '0.10780000000000001'} - ``` - - ####Get order book: - ```python - print api.order_book('BF1/BTC') - ``` - ```json - {'timestamp': '1383378967', 'bids': [['1.7', '0.30100000'], ['1.67', '0.00011000'], ['0.8', '0.02070000'], ['0.1002', '0.27748002'], ['0.1', '0.10000000'], ['0.011', '0.30500000'], ['0.009', '1.00000000'], ['0.00171', '0.00100000'], ['0.0012', '1.00000000'], ['0.00116819', '0.50000000'], ['0.001002', '33.00000000'], ['0.001001', '53.00000000'], ['0.001', '3.00000000'], ['0.00097626', '36.00000000'], ['0.0006', '85.00000000'], ['0.00058409', '0.50000000'], ['0.0004889', '0.06823960'], ['0.0003', '1.00000000'], ['0.00029204', '0.90000000'], ['0.0001', '101.00000000']], 'asks': []} - ``` - - ####Get your current active orders: - ```python - print api.current_orders('BF1/BTC') - ``` - ```json - [{'price': '1.7', 'amount': '0.00100000', 'time': '1383378514737', 'type': 'buy', 'id': '6219104', 'pending': '0.00100000'}] - ``` - - ####Place new order: - ```python - print api.place_order('buy', 0.001, 1.7, 'BF1/BTC') - ``` - ```json - {'price': '1.7', 'amount': '0.00100000', 'time': 1383378987622, 'type': 'buy', 'id': '6219145', 'pending': '0.00100000'} - ``` - - ####Place another order (GHS/BTC): - ```python - print api.place_order('buy', 0.01, 0.10789, 'GHS/BTC') - ``` - ```json - {'price': '0.10789', 'amount': '0.01000000', 'time': 1383379024072, 'type': 'buy', 'id': '6219150', 'pending': '0.00000000'} - ``` - - ####Cancel order: - ```python - print api.cancel_order(6219145) - ``` - ```json - True - ``` - - - - -Keywords: cex api bitcoin -Platform: UNKNOWN -Classifier: Programming Language :: Python -Classifier: Topic :: Office/Business :: Financial diff --git a/cexapi.egg-info/SOURCES.txt b/cexapi.egg-info/SOURCES.txt deleted file mode 100644 index 2c5c66f..0000000 --- a/cexapi.egg-info/SOURCES.txt +++ /dev/null @@ -1,11 +0,0 @@ -README.md -setup.cfg -setup.py -cexapi/__init__.py -cexapi/cexapi.py -cexapi/test.py -cexapi.egg-info/PKG-INFO -cexapi.egg-info/SOURCES.txt -cexapi.egg-info/dependency_links.txt -cexapi.egg-info/not-zip-safe -cexapi.egg-info/top_level.txt \ No newline at end of file diff --git a/cexapi.egg-info/dependency_links.txt b/cexapi.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/cexapi.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cexapi.egg-info/not-zip-safe b/cexapi.egg-info/not-zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/cexapi.egg-info/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/cexapi.egg-info/top_level.txt b/cexapi.egg-info/top_level.txt deleted file mode 100644 index f19c946..0000000 --- a/cexapi.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -cexapi diff --git a/dist/cexapi-0.1-py2.7.egg b/dist/cexapi-0.1-py2.7.egg deleted file mode 100644 index fa7658e769a09028295c4824c8c3d1cb753e3808..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6726 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 From 6d8ce0ebf57fa67cc5b5f3db3df2eb268449bffc Mon Sep 17 00:00:00 2001 From: shamanou Date: Sat, 25 Nov 2017 16:56:21 +0100 Subject: [PATCH 08/11] ... --- CHANGES.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 CHANGES.txt diff --git a/CHANGES.txt b/CHANGES.txt new file mode 100644 index 0000000..e69de29 From 44a242e6cf9bde33ebf9b45012c7188a55c9efb9 Mon Sep 17 00:00:00 2001 From: shamanou Date: Sat, 9 Dec 2017 20:41:34 +0100 Subject: [PATCH 09/11] moved from urllib to requests --- .project | 0 .pydevproject | 0 .settings/org.eclipse.core.resources.prefs | 0 CHANGES.txt | 0 LICENSE | 0 README.md | 0 cexapi/__init__.py | 2 +- cexapi/cexapi.py | 178 ++++++++++----------- cexapi/test.py | 56 +++---- setup.cfg | 0 setup.py | 0 11 files changed, 118 insertions(+), 118 deletions(-) mode change 100644 => 100755 .project mode change 100644 => 100755 .pydevproject mode change 100644 => 100755 .settings/org.eclipse.core.resources.prefs mode change 100644 => 100755 CHANGES.txt mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 cexapi/__init__.py mode change 100644 => 100755 cexapi/cexapi.py mode change 100644 => 100755 cexapi/test.py mode change 100644 => 100755 setup.cfg mode change 100644 => 100755 setup.py diff --git a/.project b/.project old mode 100644 new mode 100755 diff --git a/.pydevproject b/.pydevproject old mode 100644 new mode 100755 diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs old mode 100644 new mode 100755 diff --git a/CHANGES.txt b/CHANGES.txt old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/cexapi/__init__.py b/cexapi/__init__.py old mode 100644 new mode 100755 index 41b2cea..f74459d --- a/cexapi/__init__.py +++ b/cexapi/__init__.py @@ -1 +1 @@ -from .cexapi import * +from .cexapi import * diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py old mode 100644 new mode 100755 index 5495357..198d643 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -1,89 +1,89 @@ -# -*- coding: utf-8 -*- -# Author: t0pep0 -# e-mail: t0pep0.gentoo@gmail.com -# Jabber: t0pep0@jabber.ru -# BTC : 1ipEA2fcVyjiUnBqUx7PVy5efktz2hucb -# donate free =) -import hashlib -import hmac -import time -import urllib.parse -import requests - - -class API(object): - __username = '' - __api_key = '' - __api_secret = '' - __nonce_v = '' - - # Init class - def __init__(self, username="", api_key="", api_secret=""): - self.__username = username - self.__api_key = api_key - self.__api_secret = api_secret - - # get timestamp as nonce - def __nonce(self): - self.__nonce_v = '{:.10f}'.format(time.time() * 1000).split('.')[0] - - # generate segnature - def __signature(self): - string = self.__nonce_v + self.__username + self.__api_key # create string - signature = hmac.new(self.__api_secret, string, digestmod=hashlib.sha256).hexdigest( - ).upper() # create signature - return signature - - def __post(self, url, param): # Post Request (Low Level API call) - params = urllib.parse.urlencode(param) - req = requests.post( - url, data=params, headers={'User-agent': 'bot-cex.io-' + self.__username}) - page = req.json() - return page - - def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) - url = 'https://cex.io/api/' + method + '/' # generate url - if couple != '': - url = url + couple + '/' # set couple if needed - if private == 1: # add auth-data if needed - self.__nonce() - param.update({ - 'key': self.__api_key, - 'signature': self.__signature(), - 'nonce': self.__nonce_v}) - answer = self.__post(url, param) # Post Request - return answer # generate dict and return - - def ticker(self, couple='GHS/BTC'): - return self.api_call('ticker', {}, 0, couple) - - def order_book(self, couple='GHS/BTC'): - return self.api_call('order_book', {}, 0, couple) - - def trade_history(self, since=1, couple='GHS/BTC'): - return self.api_call('trade_history', {"since": str(since)}, 0, couple) - - def balance(self): - return self.api_call('balance', {}, 1) - - def current_orders(self, couple='GHS/BTC'): - return self.api_call('open_orders', {}, 1, couple) - - def cancel_order(self, order_id): - return self.api_call('cancel_order', {"id": order_id}, 1) - - def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): - return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) - - def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): - return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type": "market"}, 1, couple) - - def markets(self): - response = self.api_call("currency_limits", ) - return [pair['symbol1'] + "/" + pair['symbol2'] for pair in response['data']['pairs']] - - def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): - return self.api_call( - 'price_stats', - {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, - 0, couple) +# -*- coding: utf-8 -*- +# Author: t0pep0 +# e-mail: t0pep0.gentoo@gmail.com +# Jabber: t0pep0@jabber.ru +# BTC : 1ipEA2fcVyjiUnBqUx7PVy5efktz2hucb +# donate free =) +import hashlib +import hmac +import time +import urllib.parse +import requests + + +class API(object): + __username = '' + __api_key = '' + __api_secret = '' + __nonce_v = '' + + # Init class + def __init__(self, username="", api_key="", api_secret=""): + self.__username = username + self.__api_key = api_key + self.__api_secret = api_secret + + # get timestamp as nonce + def __nonce(self): + self.__nonce_v = '{:.10f}'.format(time.time() * 1000).split('.')[0] + + # generate segnature + def __signature(self): + string = self.__nonce_v + self.__username + self.__api_key # create string + signature = hmac.new(self.__api_secret, string, digestmod=hashlib.sha256).hexdigest( + ).upper() # create signature + return signature + + def __post(self, url, param): # Post Request (Low Level API call) + params = urllib.parse.urlencode(param) + req = requests.post( + url, data=params, headers={'User-agent': 'bot-cex.io-' + self.__username}) + page = req.json() + return page + + def api_call(self, method, param={}, private=0, couple=''): # api call (Middle level) + url = 'https://cex.io/api/' + method + '/' # generate url + if couple != '': + url = url + couple + '/' # set couple if needed + if private == 1: # add auth-data if needed + self.__nonce() + param.update({ + 'key': self.__api_key, + 'signature': self.__signature(), + 'nonce': self.__nonce_v}) + answer = self.__post(url, param) # Post Request + return answer # generate dict and return + + def ticker(self, couple='GHS/BTC'): + return self.api_call('ticker', {}, 0, couple) + + def order_book(self, couple='GHS/BTC'): + return self.api_call('order_book', {}, 0, couple) + + def trade_history(self, since=1, couple='GHS/BTC'): + return self.api_call('trade_history', {"since": str(since)}, 0, couple) + + def balance(self): + return self.api_call('balance', {}, 1) + + def current_orders(self, couple='GHS/BTC'): + return self.api_call('open_orders', {}, 1, couple) + + def cancel_order(self, order_id): + return self.api_call('cancel_order', {"id": order_id}, 1) + + def place_order(self, ptype='buy', amount=1, price=1, couple='GHS/BTC'): + return self.api_call('place_order', {"type": ptype, "amount": str(amount), "price": str(price)}, 1, couple) + + def place_market_order(self, ptype='buy', amount=1, couple='GHS/BTC'): + return self.api_call('place_order', {"type": ptype, "amount": str(amount), "order_type": "market"}, 1, couple) + + def markets(self): + response = self.api_call("currency_limits", ) + return [pair['symbol1'] + "/" + pair['symbol2'] for pair in response['data']['pairs']] + + def price_stats(self, last_hours, max_resp_arr_size, couple='GHS/BTC'): + return self.api_call( + 'price_stats', + {"lastHours": last_hours, "maxRespArrSize": max_resp_arr_size}, + 0, couple) diff --git a/cexapi/test.py b/cexapi/test.py old mode 100644 new mode 100755 index 17da241..ef62484 --- a/cexapi/test.py +++ b/cexapi/test.py @@ -1,28 +1,28 @@ -# -*- coding: utf-8 -*- -from . import cexapi - -demo = cexapi.api(username, api_key, api_secret) -print("Ticker (GHS/BTC)") -print(demo.ticker()) ## or demo.ticker('GHS/BTC') -print("Ticker (BF1/BTC)") -print(demo.ticker('BF1/BTC')) -print("Order book (GHS/BTC)") -print(demo.order_book()) ## or demo.order_book('GHS/BTC') -print("Order book (BF1/BTC)") -print(demo.order_book('BF1/BTC')) -print("Trade history since=100 (GHS/BTC)") -print(demo.trade_history(100)) ## or (100,'GHS/BTC') -print("Trade history since=100 (BF1/BTC)") -print(demo.trade_history(100,'BF1/BTC')) -print("Balance") -print(demo.balance()) -print("Open orders (GHS/BTC)") -print(demo.current_orders()) ## or ('GHS/BTC') -print("Open orders (BF1/BTC)") -print(demo.current_orders('BF1/BTC')) -print("Cancel order (order_id=100)") -print(demo.cancel_order(100)) -print("Plaсe order buy 4GHS/0.1BTC)") -print(demo.place_order('buy',1,0.1)) ## or ('buy',1,0.1,'GHS/BTC') -print("Open orders sell 1BF1/1.5BTC") -print(demo.place_order('sell',1,1.5,'BF1/BTC')) +# -*- coding: utf-8 -*- +from . import cexapi + +demo = cexapi.api(username, api_key, api_secret) +print("Ticker (GHS/BTC)") +print(demo.ticker()) ## or demo.ticker('GHS/BTC') +print("Ticker (BF1/BTC)") +print(demo.ticker('BF1/BTC')) +print("Order book (GHS/BTC)") +print(demo.order_book()) ## or demo.order_book('GHS/BTC') +print("Order book (BF1/BTC)") +print(demo.order_book('BF1/BTC')) +print("Trade history since=100 (GHS/BTC)") +print(demo.trade_history(100)) ## or (100,'GHS/BTC') +print("Trade history since=100 (BF1/BTC)") +print(demo.trade_history(100,'BF1/BTC')) +print("Balance") +print(demo.balance()) +print("Open orders (GHS/BTC)") +print(demo.current_orders()) ## or ('GHS/BTC') +print("Open orders (BF1/BTC)") +print(demo.current_orders('BF1/BTC')) +print("Cancel order (order_id=100)") +print(demo.cancel_order(100)) +print("Plaсe order buy 4GHS/0.1BTC)") +print(demo.place_order('buy',1,0.1)) ## or ('buy',1,0.1,'GHS/BTC') +print("Open orders sell 1BF1/1.5BTC") +print(demo.place_order('sell',1,1.5,'BF1/BTC')) diff --git a/setup.cfg b/setup.cfg old mode 100644 new mode 100755 diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 From d26e1e97af0f3b07496221b69f0448b5100b1c79 Mon Sep 17 00:00:00 2001 From: shamanou Date: Sat, 9 Dec 2017 20:47:54 +0100 Subject: [PATCH 10/11] removed urllib entirely --- cexapi/cexapi.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py index 198d643..101f435 100755 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -7,7 +7,6 @@ import hashlib import hmac import time -import urllib.parse import requests @@ -35,7 +34,6 @@ def __signature(self): return signature def __post(self, url, param): # Post Request (Low Level API call) - params = urllib.parse.urlencode(param) req = requests.post( url, data=params, headers={'User-agent': 'bot-cex.io-' + self.__username}) page = req.json() From 3bdee8576b519a8fa6ce5121d95b117273b6deac Mon Sep 17 00:00:00 2001 From: shamanou Date: Sat, 9 Dec 2017 20:49:18 +0100 Subject: [PATCH 11/11] .. --- cexapi/.cexapi.py.swp | Bin 0 -> 12288 bytes cexapi/cexapi.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 cexapi/.cexapi.py.swp diff --git a/cexapi/.cexapi.py.swp b/cexapi/.cexapi.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..5d3c2045cf027d5910be6966fac496b6930a2513 GIT binary patch literal 12288 zcmeHN%a0UA7%v1L_`r8OQVfrtftlXfRai2~7{C|-fe>&px>=i=?%JJZd%An8YJgz_ zCVKF3QjZ!B{sVe4F~I|#^yY;`{{o{X-jzh+ud1tidUtsUF)<|F$#1&*tFOMtufF=a zH`~4TsY6HUwEF_V@dP36i_JF!vUlD4ON98L5($s>$Sn`6*E%-6d-CwBH&?x66(@Xt z-VKu$OT$(=QvD>>65QF7n~rX7q#CIhs2I3&28L?BwRaPFermF^-Bj}r1Z za1MA2m;;^#{(J;60`CD55WsW5)rSeW3|s;Z0~5eAz#kh4`4;#Dcmr^N9l-U62>Ai{ z9{3Dkz-gck{QMwt2Ce`f10MmWf$hLH;Q9lw30wwZ;M)C!`~`doOaps>&A@LP2>B5B z0O$gnfepYn;8^o)xV{H#r3(3fV1Sm6c9Z(aFpYSFl%#aI7BQ&~CPN`>9jdRrzP@SF z+JK!u!DYH%h?C(3j!_6a0g1TLM3ZW zn$fH?95AuSl{DGiAlQ|>IBCSdVIl%9oFjZ)2hs?S&yHb{oCfIh9fx6Om~a9?P0U<3ZWX^t_|}0N zBX^g9&tjiPrBw(6M3#{p20E@WpJiPeP_B6U)lO0#XKt`#=<SZW zk}TSkZs2mPbJw(~&|l2<;!UzLu|ut7r`ISv^;!Iy?ys$wFwhZ84y#nCNv^YuJ)>z%!rt$nVg&yEZi zVg~Oe?Lt&fUAy}zqf^>%|`YEq3lYFK=m*c6AqY2IP;H>7P+oh8o zogfPW%7&`n(ruYSBj!Bd!3uNW1U*^*?y^rgTsRYso-et|Wosuxl5HfqrAr;BQ&`O` zI(?;5*_p6kolfZQOdXgWaC~_hjC~X z$3_;iyX?$JE?Sr!E3Bx~OH|8#Wvg?wOErW}%m%zvJMfhG)3qmEQ=LWjwpz2?jq}WJ zmSDMRY5hoYjvmn&(*4H|nZ(zoS`=fEZv&;3a#1(iz!zLs&04KOf>8Sd=DRUJXErOg zgI*!YF;zA7^E8YXKvB4WYz9ft?K9br!k#PpY-;zOhTG@ov%&1;MU$FMg5`2OduP|O zHkR0(qE|VO*?2AySA=ZhL`T-HO6@{&yH&^au*yGbdAZ|Gw&yQ8F5YnlOx0C5;I94w zUpwh!yWMWMGL1r2cU-42+s@u{bluuEvD&$!dNy9}1}SBdnpUzVfH9*WWqe~Y&{^0x za}qKgG>+8@d9}exerZ&)_`*0;o@ZNbKHjb2t;-rNuCvv}ZNcIp%%whFbY&KN(G=mz zag394VXT%S*0Lyfp2>_^UBmUHcZT~)KTJtDNE4y-wlv!$zt?2u*Sao?>#XX?RvIK| z$ehj#j&0q50B^gXu(NS8OkdtVHSeDqoe5{+14}dKr;nc+?dJ1~>cUii==Y#|nDu&G zbT+DX%G36~Gv?M6Lk#iOfQ3;$NV$(Djo6H1?z2CdFh3T02|llL0nJhnkOp HwS@cwXdoC+ literal 0 HcmV?d00001 diff --git a/cexapi/cexapi.py b/cexapi/cexapi.py index 101f435..cfdcba0 100755 --- a/cexapi/cexapi.py +++ b/cexapi/cexapi.py @@ -33,7 +33,7 @@ def __signature(self): ).upper() # create signature return signature - def __post(self, url, param): # Post Request (Low Level API call) + def __post(self, url, params): # Post Request (Low Level API call) req = requests.post( url, data=params, headers={'User-agent': 'bot-cex.io-' + self.__username}) page = req.json()