Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/aloysius-pgast/crypto-exchanges-gateway
Your gateway to the world of crypto !
https://github.com/aloysius-pgast/crypto-exchanges-gateway
api binance bittrex cryptocurrency exchanges kucoin okex poloniex trading
Last synced: 3 days ago
JSON representation
Your gateway to the world of crypto !
- Host: GitHub
- URL: https://github.com/aloysius-pgast/crypto-exchanges-gateway
- Owner: aloysius-pgast
- Created: 2017-09-15T12:25:00.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2024-07-29T17:24:18.000Z (3 months ago)
- Last Synced: 2024-08-02T15:53:25.400Z (3 months ago)
- Topics: api, binance, bittrex, cryptocurrency, exchanges, kucoin, okex, poloniex, trading
- Language: JavaScript
- Size: 3.17 MB
- Stars: 586
- Watchers: 46
- Forks: 154
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
Awesome Lists containing this project
- awesome-crypto-trading-bots - crypto-exchanges-gateway - A self hosted unified REST API to various exchanges (can be used to automate trading or build bots). (Market data libraries)
- awesome-crypto-trading-bots - crypto-exchanges-gateway - A self hosted unified REST API to various exchanges (can be used to automate trading or build bots). (Market data libraries)
- stars - aloysius-pgast/crypto-exchanges-gateway - Your gateway to the world of crypto ! (JavaScript)
README
# crypto-exchanges-gateway
Your gateway to the world of crypto !
NB: this project won't build unless you use node 14.x (check Nix for that). It's unlikely to be updated since I don't really have time to work on it anymore :)
## Disclaimer
This project cannot be considered in any way as trading advice.
Use it at your own risks and be careful with your money ;)
## Faq
* Does it support real-time data ?
Yes, gateway provides a WS endpoint. See [video](https://youtu.be/_LfLLT693AM) explaining how to create custom WS streams
* What about _ccxt_ ?
_ccxt_ is a very nice project which provides a library to connect to multiple exchanges (_php_,_js_,_python_). When I started, I wasn't aware of the project. While _ccxt_ aims at providing a library, I want to offer an http gateway as an independant service to be used by any REST client (so virtually any language).
Btw, _ccxt_ library is now used to interface with some exchanges ;)
* What is the monthly fee for the service ?
There is no monthly fee. It's free since you will be the one running the service on your own server
* Where is your service hosted ?
This is a self-hosted service. You need to install it on your own server
* I saw you are accepting donations. What extra service will I get for a donation ?
Besides the privilege to go to bed, knowing that you did the right thing ? Not much
## What it does
* Provides a unified REST API to various exchanges (can be used to automate trading or build bots)
* Handles authentication so that on client side you can concentrate on what really matters
* Implements rate limiting when forwarding requests to remote exchanges
* Provides a REST API to send push notifications using [PushOver](https://pushover.net/api)
* Provides a basic UI which implements most API calls (see [documentation in _doc_ directory](doc/ui/index.adoc))
* Provides WS access for real-time data (tickers, order books & trades, see [documentation in _doc_ directory](doc/ws/index.adoc) and [video](https://youtu.be/_LfLLT693AM) explaining how to create custom WS streams to multiplex data from multiple exchanges)
* Access to a portfolio portfolio overview across all exchanges with estimated value in USD
* Advanced alerting systemSee a live demo at https://mpe-demo.crazyme.net/ui/
Of course, above demo **does not use any valid _user/token_**. This means the following :
* everything related to _price_ & _order book_ is **populated with real data**
* the list of _open/completed orders_ is **filled with random data**
* the list of _balances_ is **filled with random data**
* _new orders_ **won't be actually executed** ;)In order to have a full experience, just follow [installation steps](#installation)
## How to use it
[Install](#installation) it wherever you want and start sending requests from your own program
* it can be hosted on a VM in the cloud
* it can be installed at home, on a [Raspberry Pi](https://www.raspberrypi.org/products/raspberry-pi-zero-w/)Just use you favorite language (_python_, _javascript_, _ruby_, _bash_, ...) to send request to the gateway. Your own service, your own rules !
A _Node.js_ client is available [here](https://github.com/aloysius-pgast/crypto-exchanges-rest-client-nodejs) or as a [npm package](https://www.npmjs.com/package/crypto-exchanges-rest-client)
## Available Exchanges
Currently supports for following exchanges :
* [Binance](https://www.binance.com/) (used to be my favorite)
* [Bittrex](https://www.bittrex.com/)
* [Kucoin](https://www.kucoin.com) (optional KYC)
* [OKEx](https://www.okex.com) (optional KYC)
* [Poloniex](https://www.poloniex.com) ([**worst support**](https://www.reddit.com/r/PoloniexForum/) ever)
* More to come...Following API are currently supported :
* Retrieve pairs
* Retrieve tickers
* Retrieve order book
* Retrieve last executed trades
* Retrieve klines (charts data)
* List open orders
* List closed orders
* Retrieve a single order
* Test an order (to ensure quantity and price match exchange filters)
* Create an order
* Retrieve balancesSee [documentation in _doc_ directory](doc/exchanges/index.adoc) for an overview of each REST API
See [documentation in _doc_ directory](doc/ws/index.adoc) for a description of the supported _websocket protocol_ (similar to _JSON-RPC_)
See [documentation in _doc_ directory](doc/unitTests.adoc) for informations regarding unit tests
## Alerts
Have you ever wanted to receive an alert in case ALL of the following conditions are met :
* NEO-USDT price in range [120, 135] on Binance
* NEO-BTC price on Bittrex < 0.010
* NEO price in MarketCap module > 125$Probably not ;) Anyway, you will now be able to define this kind of custom alerts. See [documentation in _doc_ directory](doc/tickerMonitor/index.adoc)
It comes with built-in support for [PushOver](https://pushover.net/) but any other notification system can be easily implemented (through third party applications) since all alert changes are emitted over a websocket endpoint (see [documentation in _doc_ directory](doc/ws/notifications.adoc#tickermonitor-notifications))
## Limitations
* Margin trading is not supported (and is unlikely to be)
* Withdrawal is not supported (and is unlikely to be)
* _Stop loss_ & _trailing stop loss_ are not supported for the moment (although it might be supported at some point)## Other services
### MarketCap
MarketCap module supports :
* Tickers
See [documentation in _doc_ directory](doc/marketCap/index.adoc) for an overview of each API
### Push Over
[PushOver](https://pushover.net/) module supports :
* Push notifications
See [documentation in _doc_ directory](doc/pushover/index.adoc) for an overview of each API)
## Rate limiting
Rate limiting is implemented when required by exchange thanks to [Bottleneck](https://www.npmjs.com/package/bottleneck)
## Installation
* Install dependencies
```
npm install
```* Copy sample config
```
cp config/config.sample.json config/config.json
```Check [documentation in _doc_ directory](doc/config.adoc) for detailed information on each config section
* Start gateway
```
node gateway.js
```* Build UI
If you want to use the UI, follow these steps to build the UI before starting the gateway:
```
cd ui
npm install && ./rebuild-ui
```* Check which exchanges are enabled
Open http://127.0.0.1:8000/exchanges/ in your browser. You should see JSON content such as below :
```javascript
["binance","bittrex","poloniex","kucoin"]
```By default, only public API will be enabled. In order to access trading/private API, you need to update _config.json_ with appropriate _user_ and _secret_ provided by exchange (check [documentation in _doc_ directory](doc/config.adoc) )
* Check BTC & ETH prices using _MarketCap_ module
Open http://127.0.0.1:8000/marketCap/tickers?symbols=BTC,ETH in your browser. You should see JSON content such as below :
```javascript
[
{
"symbol":"BTC",
"name":"Bitcoin",
"circulating_supply":17372012,
"price_usd":6406.1049,
"percent_change_1h":-0.08,
"percent_change_1d":-0.08,
"percent_change_7d":-0.15,
"volume_24h_usd":3120534126.1266,
"lastUpdated":1542009997,
"market_cap_usd":111286930723.4185,
"rank":1,
"price_btc":1
},
{
"symbol":"ETH",
"name":"Ethereum",
"circulating_supply":103150460,
"price_usd":210.4854,
"percent_change_1h":-0.39,
"percent_change_1d":-0.39,
"percent_change_7d":-0.8,
"volume_24h_usd":1294093048.2094,
"lastUpdated":1542009997,
"market_cap_usd":21711669585.6914,
"rank":2,
"price_btc":0.032857
}
]
```* Place an order to buy 1 NEO at 0.0040BTC on Bittrex (assuming you have enough funds)
Execute the following in a terminal :
```
curl -X POST 'http://127.0.0.1:8000/exchanges/bittrex/openOrders?pair=BTC-NEO&quantity=1&targetRate=0.0040'
```You should see JSON content such as below :
```javascript
{"orderNumber":"8bc49a59-1056-4c20-90f2-893fff2be279"}
```* Cancel above order (assuming order still exists)
Execute the following in a terminal :
```
curl -X DELETE 'http://127.0.0.1:8000/exchanges/bittrex/openOrders/8bc49a59-1056-4c20-90f2-893fff2be279'
```You should see JSON content such as below in case order is valid :
```javascript
{}
```## Docker
See this [video](https://youtu.be/SQf3diruc8w) to know how to be ready to trade in less then 3 minutes using Docker & Kitematic
A docker image is available at https://hub.docker.com/r/apendergast/crypto-exchanges-gateway/
* Pull image
```
docker pull apendergast/crypto-exchanges-gateway
```* Run image
```
docker run --rm -p 8000:8000 -p 8001:8001 --name ceg apendergast/crypto-exchanges-gateway
```You should then be able to access service on http://127.0.0.1:8000
WS endpoint will be available on _ws://127.0.0.1:8001_
* Check which exchanges are enabled
Open http://127.0.0.1:8000/exchanges/ in your browser. You should see JSON content such as below :
```javascript
["binance","bittrex","kucoin","okex","poloniex"]
```By default, only public API will be enabled. In order to access trading/private API, you need to pass environment when creating container. Following environment variables are available :
* cfg.logLevel : log level
* cfg.listen.externalEndpoint : used to indicates the external endpoint used to reach http socket, in case gateway is running behing a proxy
* cfg.listenWs.externalEndpoint : used to indicates the external endpoint used to reach ws socket, in case gateway is running behing a proxy
* cfg.sessions.maxSubscriptions : maximum number of subscriptions allowed for a given session (optional, default = _0_, no maximum)
* cfg.sessions.maxDuration : maximum duration in second for a given session (optional, default = _0_, no maximum)
* cfg.sessions.hideIpaddr : whether or not ip addresses should be hidden when listing sessions through REST api (optional, default = _0_)
* cfg.auth.apikey : API Key used to protect access
* cfg.ui.enabled : enable/disable UI (value should be set to _1_ to enable UI, _0_ to disable UI)
* cfg.tickerMonitor.enabled : enable/disable Ticker Monitor module (value should be set to _1_ to enable Ticker Monitor, _0_ to disable Ticker Monitor) (default = _1_)
* cfg.marketCap.enabled : enable/disable MarketCap module (value should be set to _1_ to enable MarketCap module, _0_ to disable MarketCap module) (default = _1_)
* cfg.pushover.user : PushOver user key
* cfg.pushover.token : PushOver token
* cfg.exchanges.poloniex.enabled : value should be set to _1_ to enable exchange, _0_ to disable exchange (default = _1_)
* cfg.exchanges.poloniex.key : Poloniex user key
* cfg.exchanges.poloniex.secret : Poloniex secret
* cfg.exchanges.bittrex.enabled : value should be set to _1_ to enable exchange, _0_ to disable exchange (default = _1_)
* cfg.exchanges.bittrex.key : Bittrex user key
* cfg.exchanges.bittrex.secret : Bittrex secret
* cfg.exchanges.binance.enabled : value should be set to _1_ to enable exchange, _0_ to disable exchange (default = _1_)
* cfg.exchanges.binance.requirePair : value should be set to _0_ to allow retrieving tickers/orders for all pairs at once, _1_ to require pair for such operations (default = _0_)
* cfg.exchanges.binance.key : Binance user key
* cfg.exchanges.binance.secret : Binance secret
* cfg.exchanges.kucoin.enabled : value should be set to _1_ to enable exchange, _0_ to disable exchange (default = _1_)
* cfg.exchanges.kucoin.requirePair : value should be set to _0_ to allow retrieving tickers/orders for all pairs at once, _1_ to require pair for such operations (default = _0_)
* cfg.exchanges.kucoin.key : Kucoin user key
* cfg.exchanges.kucoin.secret : Kucoin secret
* cfg.exchanges.kucoin.password : Kucoin API password
* cfg.exchanges.okex.enabled : value should be set to _1_ to enable exchange, _0_ to disable exchange (default = _1_)
* cfg.exchanges.okex.requirePair : value should be set to _0_ to allow retrieving tickers/orders for all pairs at once, _1_ to require pair for such operations (default = _0_)
* cfg.exchanges.okex.key : OKEx user key
* cfg.exchanges.okex.secret : OKEx secret
* cfg.exchanges.okex.password : OKEx passwordIf you don't want to use environment variables or want to customize config for a running container, you can create and edit *custom_config/config.json*
_Examples_ :
Run container with Bittrex user/key environment variables
```
docker run --rm -p 8000:8000 -p 8001:8001 --name ceg -e cfg.exchanges.bittrex.key='abcdefghijkl' -e cfg.exchanges.bittrex.secret='123456789' apendergast/crypto-exchanges-gateway
```## Dependencies
This project was made possible thanks to following projects :
* [big.js](https://www.npmjs.com/package/big.js)
* [binance](https://www.npmjs.com/package/binance)
* [body-parser](https://www.npmjs.com/package/body-parser)
* [bottleneck](https://www.npmjs.com/package/bottleneck) (for rate limiting)
* [ccxt](https://www.npmjs.com/package/ccxt) (used to interface with some exchanges)
* [chump](https://www.npmjs.com/package/chump) (for PushOver)
* [css-select](https://www.npmjs.com/package/css-select) (for HTML parsing)
* [express](https://www.npmjs.com/package/express)
* [express-ws](https://www.npmjs.com/package/express-ws)
* [htmlparser2](https://www.npmjs.com/package/htmlparser2) (for HTML parsing)
* [joi](https://www.npmjs.com/package/joi) (for JSON schema validation)
* [lodash](https://www.npmjs.com/package/lodash)
* [mocha](https://www.npmjs.com/package/mocha) (for unit tests)
* [node-bittrex-api](https://www.npmjs.com/package/node-bittrex-api)
* [poloniex-api-node](https://www.npmjs.com/package/poloniex-api-node)
* [retry](https://www.npmjs.com/package/retry) (for custom retry strategies upon network failure)
* [request](https://www.npmjs.com/package/request)
* [sqlite3](https://www.npmjs.com/package/sqlite3) (for data storage)
* [uuid](https://www.npmjs.com/package/uuid)
* [winston](https://www.npmjs.com/package/winston) (for logging)
* [ws](https://www.npmjs.com/package/ws)
* [yargs](https://www.npmjs.com/package/yargs) (for CLI commands)## Donate
This project is a work in progress. If you find it useful, you might consider a little donation ;)
BTC: `163Bu8qMSDoHc1sCatcnyZcpm38Z6PWf6E`
ETH: `0xDEBBEEB9624449D7f2c87497F21722b1731D42a8`
NEO/GAS: `NXbbNQ2wSuavGRRffxFQrKLvSysEewzSHZ`