Your gateway to the world of crypto !
This project cannot be considered in any way as trading advice.
Use it at your own risks and be careful with your money ;)
- Does it support real-time data ?
Yes, gateway provides a WS endpoint
- 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. It is probably something I will try to integrate at some point (to help adding more exchanges). 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).
- 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
- 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
- Provides a basic UI which implements most API calls (see documentation in doc directory)
- Provides WS access for real-time data (tickers, order books & trades, see documentation in doc directory)
- Access to a portfolio portfolio overview across all exchanges with estimated value in USD
- Advanced alerting system
See 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
Install 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
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 or as a npm package
Currently supports for following exchanges :
- Bittrex (my favorite)
- Binance (nice Chinese exchange with good support)
- Poloniex (worst support 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 balances
See documentation in doc directory for an overview of each REST API
See documentation in doc directory for a description of the supported websocket protocol (similar to JSON-RPC)
See documentation in doc directory for informations regarding unit tests
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 on CoinMarketCap > 125$
Probably not ;) Anyway, you will now be able to define this kind of custom alerts. See documentation in doc directory
- 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 you can expect support in the future !)
CoinMarketCap module supports :
- Tickers
- History (history of USD prices)
See documentation in doc directory for an overview of each API
PushOver module supports :
- Push notifications
See documentation in doc directory for an overview of each API)
Rate limiting is implemented when required by exchange thanks to Bottleneck
- Install dependencies
npm install
- Copy sample config
cp config/config.sample.json config/config.json
Check documentation in doc directory for detailed information on each config section
- Start gateway
node gateway.js
- Check which exchanges are enabled
Open http://127.0.0.1:8000/exchanges/ in your browser. You should see JSON content such as below :
["binance","bittrex","poloniex"]
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 )
- Check BTC & ETH prices on CoinMarketCap
Open http://127.0.0.1:8000/coinmarketcap/tickers?symbols=BTC,ETH in your browser. You should see JSON content such as below :
[
{
"name":"Bitcoin",
"symbol":"BTC",
"rank":1,
"circulating_supply":17040712,
"total_supply":17040712,
"max_supply":21000000,
"last_updated":1526661572,
"converted":{
},
"price_usd":8117.73,
"market_cap_usd":138331899024,
"volume_24h_usd":6104730000,
"percent_change_1h":0.08,
"percent_change_24h":-2.29,
"percent_change_7d":-5.63,
"price_btc":1,
"market_cap_btc":17040712,
"volume_24h_btc":752024.2727954737
},
{
"name":"Ethereum",
"symbol":"ETH",
"rank":2,
"circulating_supply":99514883,
"total_supply":99514883,
"max_supply":null,
"last_updated":1526661558,
"converted":{
},
"price_usd":678.931,
"market_cap_usd":67563739348,
"volume_24h_usd":2444350000,
"percent_change_1h":0.13,
"percent_change_24h":-3.28,
"percent_change_7d":-0.76,
"price_btc":0.083635573,
"market_cap_btc":8322984,
"volume_24h_btc":301112.5031258739
}
]
- 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 :
{"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 :
{}
See this video 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 :
["binance","bittrex","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.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)
- cfg.coinmarketcap.enabled : enable/disable CoinMarketCap module (value should be set to 1 to enable CoinMarketCap module, 0 to disable CoinMarketCap module)
- cfg.coinmarketcap.history : enable/disable CoinMarketCap history feature (value should be set to 1 to enable CoinMarketCap history, 0 to disable CoinMarketCap history) (will be ignored if CoinMarketCap is disabled)
- cfg.pushover.user : PushOver user key
- cfg.pushover.token : PushOver token
- cfg.exchanges.poloniex.key : Poloniex user key
- cfg.exchanges.poloniex.secret : Poloniex secret
- cfg.exchanges.bittrex.key : Bittrex user key
- cfg.exchanges.bittrex.secret : Bittrex secret
- cfg.exchanges.binance.key : Binance user key
- cfg.exchanges.binance.secret : Binance secret
If 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
This project was made possible thanks to following projects :
- big.js
- binance
- body-parser
- bottleneck (for rate limiting)
- chump (for PushOver)
- css-select (for HTML parsing)
- express
- express-ws
- htmlparser2 (for HTML parsing)
- joi (for JSON schema validation)
- lodash
- mocha (for unit tests)
- node-bittrex-api
- poloniex-api-node
- retry (for custom retry strategies upon network failure)
- request
- sqlite3 (for data storage)
- uuid
- winston (for logging)
- ws
- yargs (for CLI commands)
This project is a work in progress. If you find it useful, you might consider a little donation ;)
BTC: 163Bu8qMSDoHc1sCatcnyZcpm38Z6PWf6E
ETH: 0xDEBBEEB9624449D7f2c87497F21722b1731D42a8
NEO/GAS: AaQ5xJt4v8GunVchTJXur8WtM8ksprnxRZ