Code Monkey home page Code Monkey logo

chrisleekr / binance-trading-bot Goto Github PK

View Code? Open in Web Editor NEW
4.9K 137.0 1.1K 6.96 MB

Automated Binance trading bot - Trade multiple cryptocurrencies. Buy low/sell high with Grid Trading. Integrated with TradingView technical analysis

License: MIT License

JavaScript 98.62% Dockerfile 0.08% CSS 0.66% HTML 0.46% PowerShell 0.03% Shell 0.08% Python 0.08%
binance binance-api trading-bot binance-trading-bot binance-api-node cryptocurrency cryptotrading bot grid-trading traidingview

binance-trading-bot's Introduction

Binance Trading Bot

Stand With Ukraine

GitHub version Build CodeCov Docker pull GitHub contributors MIT License

Automated Binance trading bot with trailing buy/sell strategy


ko 中文

This is a test project. I am just testing my code.

Warnings

I cannot guarantee whether you can make money or not.

So use it at your own risk! I have no responsibility for any loss or hardship incurred directly or indirectly by using this code. Read disclaimer before using this code.

Before updating the bot, make sure to record the last buy price in the note. It may lose the configuration or last buy price records.

How it works

Trailing Grid Trade Buy/Sell Bot

This bot is using the concept of trailing buy/sell order which allows following the price fall/rise.

Trailing Stop Orders About Trailing Stop Orders Concept you can find at Binance Official document

TL;DR Place orders at a fixed value or percentage when the price changes. Using this feature you can buy at the lowest possible price when buying down and sell at the highest possible price when selling up.

  • The bot supports multiple buy/sell orders based on the configuration.
  • The bot can monitor multiple symbols. All symbols will be monitored per second.
  • The bot is using MongoDB to provide a persistence database. However, it does not use the latest MongoDB to support Raspberry Pi 32bit. Used MongoDB version is 3.2.20, which is provided by apcheamitru.
  • The bot is tested/working with Linux and Raspberry Pi 4 32bit. Other platforms are not tested.

Buy Signal

The bot will continuously monitor the coin based on the grid trade configuration.

For grid trade #1, the bot will place a STOP-LOSS-LIMIT order to buy when the current price reaches the lowest price. If the current price continuously falls, then the bot will cancel the previous order and re-place the new STOP-LOSS-LIMIT order with the new price.

After grid trade #1, the bot will monitor the COIN based on the last buy price.

  • The bot will not place a buy order of the grid trade #1 if has enough coin (typically over $10 worth) to sell when reaches the trigger price for selling.
  • The bot will remove the last buy price if the estimated value is less than the last buy price removal threshold.
Buy Scenario

Let say, if the buy grid trade configurations are set as below:

  • Number of grids: 2
  • Grids
    No# Trigger Percentage Stop Price Percentage Limit price percentage USDT
    1 1 1.05 1.051 50
    2 0.8 1.03 1.031 100

To make it easier to understand, I will use $ as a USDT symbol. For the simple calculation, I do not take an account for the commission. In real trading, the quantity may be different.

Your 1st grid trading for buying is configured as below:

  • Grid No#: 1
  • Trigger percentage: 1
  • Stop percentage: 1.05 (5.00%)
  • Limit percentage: 1.051 (5.10%)
  • Max purchase amount: $50

And the market is as below:

  • Current price: $105
  • Lowest price: $100
  • Trigger price: $100

When the current price is falling to the lowest price ($100) and lower than ATH(All-Time High) restricted price if enabled, the bot will place new STOP-LOSS-LIMIT order for buying.

  • Stop price: $100 * 1.05 = $105
  • Limit price: $100 * 1.051 = $105.1
  • Quantity: 0.47573

Let's assume the market changes as below:

  • Current price: $95

Then the bot will follow the price fall and place new STOP-LOSS-LIMIT order as below:

  • Stop price: $95 * 1.05 = $99.75
  • Limit price: $95 * 1.051 = $99.845
  • Quantity: 0.5

Let's assume the market changes as below:

  • Current price: $100

Then the bot will execute 1st purchase for the coin. The last buy price will be recorded as $99.845. The purchased quantity will be 0.5.

Once the coin is purchased, the bot will start monitoring the sell signal and at the same time, monitor the next grid trading for buying.

Your 2nd grid trading for buying is configured as below:

  • Grid#: 2
  • Current last buy price: $99.845
  • Trigger percentage: 0.8 (20%)
  • Stop percentage: 1.03 (3.00%)
  • Limit percentage: 1.031 (3.10%)
  • Max purchase amount: $100

And if the current price is continuously falling to $79.876 (20% lower), then the bot will place new STOP-LOSS-LIMIT order for the 2nd grid trading for the coin.

Let's assume the market changes as below:

  • Current price: $75

Then the bot will follow the price fall and place new STOP-LOSS-LIMT order as below:

  • Stop price: $75 * 1.03 = $77.25
  • Limit price: $75 * 1.031 = $77.325
  • Quantity: 1.29

Let's assume the market changes as below:

  • Current price: $78

Then the bot will execute 2nd purchase for the coin. The last buy price will be automatically re-calculated as below:

  • Final last buy price: ($50 + $100)/(0.5 COIN + 1.29 COIN) = $83.80
In-depth Buy Configuration in-depth

The detailed document for buy configuration available here.

https://github.com/chrisleekr/binance-trading-bot/wiki/Buy-Scenario

Sell Signal

If there is enough balance for selling and the last buy price is recorded in the bot, then the bot will start monitoring the sell signal of the grid trade #1. Once the current price reaches the trigger price of the grid trade #1, then the bot will place a STOP-LOSS-LIMIT order to sell. If the current price continuously rises, then the bot will cancel the previous order and re-place the new STOP-LOSS-LIMIT order with the new price.

  • If the bot does not have a record for the last buy price, the bot will not sell the coin.
  • If the coin is worth less than the last buy price removal threshold, then the bot will remove the last buy price.
  • If the coin is not worth than the minimum notional value, then the bot will not place an order.

Sell Scenario

Let say, if the sell grid trade configurations are set as below:

  • Number of grids: 2
  • Grids
    No# Trigger Percentage Stop Price Percentage Limit price percentage Sell Quantity Percentage
    1st 1.05 0.97 0.969 0.5
    2nd 1.08 0.95 0.949 1

Unlike buy, the sell configuration will use the percentage of a quantity. If you want to sell all of your coin quantity, then simply configure it as 1 (100%).

From the last buy actions, you now have the following balances:

  • Current quantity: 1.79
  • Current last buy price: $83.80

Your 1st grid trading for selling is configured as below:

  • Grid No# 1
  • Trigger percentage: 1.05
  • Stop price percentage: 0.97
  • Limit price percentage: 0.969
  • Sell amount percentage: 0.5

Let's assume the market changes as below:

  • Current price: $88

As the current price is higher than the sell trigger price($87.99), then the bot will place new STOP-LOSS-LIMIT order for selling.

  • Stop price: $88 * 0.97 = $85.36
  • Limit price: $88 * 0.969 = $85.272
  • Quantity: 0.895

Let's assume the market changes as below:

  • Current price: $90

Then the bot will follow the price rise and place new STOP-LOSS-LIMIT order as below:

  • Stop price: $90 * 0.97 = $87.30
  • Limit price: $90 * 0.969 = $87.21
  • Quantity: 0.895

Let's assume the market changes as below:

  • Current price: $87

Then the bot will execute 1st sell for the coin. Then the bot will now wait for 2nd selling trigger price ($83.80 * 1.08 = $90.504).

  • Current quantity: 0.895
  • Current last buy price: $83.80

Let's assume the market changes as below:

  • Current price: $91

Then the current price($91) is higher than 2nd selling trigger price ($90.504), the bot will place new STOP-LOSS-LIMIT order as below:

  • Stop price: $91 * 0.95 = $86.45
  • Limit price: $91 * 0.949 = $86.359
  • Quantity: 0.895

Let's assume the market changes as below:

  • Current price: $100

Then the bot will follow the price rise and place new STOP-LOSS-LIMT order as below:

  • Stop price: $100 * 0.95 = $95
  • Limit price: $100 * 0.949 = $94.9
  • Quantity: 0.895

Let's assume the market changes as below:

  • Current price: $94

Then the bot will execute 2nd sell for the coin.

The final profit would be

  • 1st sell: $94.9 * 0.895 = $84.9355
  • 2nd sell: $87.21 * 0.895 = $78.05295
  • Final profit: $162 (8% profit)
In-depth Sell Configuration

The detailed document for buy configuration available here.

https://github.com/chrisleekr/binance-trading-bot/wiki/Sell-Scenario

  • Manual trade
  • Convert small balances to BNB
  • Trade all symbols
  • Monitoring multiple coins simultaneously
  • Stop-Loss
  • Restrict buying with ATH price
  • Grid Trade for buy/sell
  • Integrated with TradingView Technical Analysis

Frontend + WebSocket

React.js based frontend communicating via Web Socket:

  • List monitoring coins with buy/sell signals/open orders
  • View account balances
  • View open/closed trades
  • Manage global/symbol settings
  • Delete caches that are not monitored
  • Link to public URL
  • Support Add to Home Screen
  • Secure frontend

Environment Parameters

Use environment parameters to adjust parameters. Check /config/custom-environment-variables.json to see list of available environment parameters.

Or use the frontend to adjust configurations after launching the application.

How to use

  1. Create .env file based on .env.dist.

    Environment Key Description Sample Value
    BINANCE_LIVE_API_KEY Binance API key for live (from Binance)
    BINANCE_LIVE_SECRET_KEY Binance API secret for live (from Binance)
    BINANCE_TEST_API_KEY Binance API key for test (from Binance Spot Test Network)
    BINANCE_TEST_SECRET_KEY Binance API secret for test (from Binance Spot Test Network)
    BINANCE_SLACK_ENABLED Slack enable/disable true
    BINANCE_SLACK_WEBHOOK_URL Slack webhook URL (from Slack)
    BINANCE_SLACK_CHANNEL Slack channel "#binance"
    BINANCE_SLACK_USERNAME Slack username Chris
    BINANCE_LOCAL_TUNNEL_ENABLED Enable/Disable local tunnel true
    BINANCE_LOCAL_TUNNEL_SUBDOMAIN Local tunnel public URL subdomain binance
    BINANCE_AUTHENTICATION_ENABLED Enable/Disable frontend authentication true
    BINANCE_AUTHENTICATION_PASSWORD Frontend password 123456
    BINANCE_LOG_LEVEL Logging level. Possible values described on bunyan docs. ERROR

    A local tunnel makes the bot accessible from the outside. Please set the subdomain of the local tunnel as a subdomain that only you can remember. You must change the authentication password; otherwise, it will be configured as the default password.

  2. Launch/Update the bot with docker-compose

    Pull latest code first:

    git pull

    If want production/live mode, then use the latest build image from DockerHub:

    docker-compose -f docker-compose.server.yml pull
    docker-compose -f docker-compose.server.yml up -d

    Or if want development/test mode, then run below commands:

    docker-compose up -d --build
  3. Open browser http://0.0.0.0:8080 to see the frontend

    • When launching the application, it will notify public URL to the Slack.
    • If you have any issue with the bot, you can check the log to find out what happened with the bot. Please take a look Troubleshooting

Install via Stackfile

  1. In Portainer create new Stack

  2. Copy content of docker-stack.yml or upload the file

  3. Set environment keys for binance-bot in the docker-stack.yml

  4. Launch and open browser http://0.0.0.0:8080 to see the frontend

Screenshots

Password Protected Frontend Mobile
Password Protected Frontend Mobile
Setting Manual Trade
Setting Manual Trade
Frontend Desktop Closed Trades
Frontend Desktop Closed Trades

Sample Trade

Chart Buy Orders Sell Orders
Chart Buy Orders Sell Orders

Changes & Todo

Please refer CHANGELOG.md to view the past changes.

  • Develop simple setup screen for secrets
  • Allow to execute stop-loss before buy action - #299
  • Improve sell strategy with conditional stop price percentage based on the profit percentage - #94
  • Add sudden drop buy strategy - #67
  • Manage setting profiles (save/change/load?/export?) - #151
  • Improve notifications by supporting Apprise - #106
  • Support cool time after hitting the lowest price before buy - #105
  • Reset global configuration to initial configuration - #97
  • Support multilingual frontend - #56
  • Non linear stop price and chase function - #246
  • Support STOP-LOSS configuration per grid trade for selling - #261

Donations

If you find this project helpful, feel free to make a small donation to the developer.

Acknowledgments

  • @d0x2f
  • And many others! Thanks guys!

Contributors

Thanks to all contributors ❤️ Click to see our heroes

Disclaimer

I give no warranty and accepts no responsibility or liability for the accuracy or the completeness of the information and materials contained in this project. Under no circumstances will I be held responsible or liable in any way for any claims, damages, losses, expenses, costs or liabilities whatsoever (including, without limitation, any direct or indirect damages for loss of profits, business interruption or loss of information) resulting from or arising directly or indirectly from your use of or inability to use this code or any code linked to it, or from your reliance on the information and material on this code, even if I have been advised of the possibility of such damages in advance.

So use it at your own risk!

binance-trading-bot's People

Contributors

aiwenlg007 avatar azorpax avatar caebwallace avatar chrisleekr avatar github-actions[bot] avatar habibalkhabbaz avatar hipposen avatar izayl avatar pedrohusky avatar rando128 avatar romualdr avatar ruslan-khalitov avatar tham-le avatar thesmuks avatar uhliksk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

binance-trading-bot's Issues

Recommended settings

Does anyone have any recommended settings? I've had this running for some time now and not seeing any trades go through. Maybe I'm just impatient

Currently tracking USDT on the FIAT and on the Coin side DOGEUSDT VETUSDT ETHUSDT BTCUSDT

I have money in my USDT and I also have holdings in all of the coins above.

15 min candles on 5 candle limit
Max purchase 10
1.01 min profit
0.99 stop price / limit

Enhancements to reduce risks and increase profits

First of all I have to say I love this little thing!

I have a few ideas to help reduce risk and increase profits:

  1. Place stop-limit orders for buying too, the same way it is done in chaseStopLossLimitOrder. Could probably reuse that function to do both buy and sell.
  2. Seperate params per symbol to manage risk and strategy (maybe even have presets!). For example, BTCDOWN/USDT is more risky, I would like to look at 5m intervals and allow a lower maximum purchase amount just for that coin.
  3. Enable/disable buying per symbol. Sometimes I just want to exit without buying anything new for one specific coin.

Any thoughts? I might have a few hours this week to help out.

Don't sell at the percentage you set

Hi

When putting the data in the settings box, I set to sell the deal at a profit of 1%, but when the currency exceeds the profit percentage it set, it does not sell the bot, what is the problem?

Screen Shot 2021-03-04 at 3 45 25 PM

Last Buy price doesn't match with graphic arts of binance

Description

The Last Buy price doesn't match with the graphic arts value of binance. Its seems a bug ?

Screenshots

Here can you see that the boy have bought this coin with the price of 1.216
2021-03-31_13-15

Within the Binance app i`ll can see the buy moment in time. Thats today at 8:42
Screenshot_20210331-131724

But when i`ll look at this screenshot. The current time 8:42 doesnt match the buy value of 1.216?
2021-03-31_13-19

This seems a bug

can't connect the mongodb.

install the bot by the docker step by step.but can't connect the mongodb.the error msg is:

{"name":"binance-api","version":"0.0.65","hostname":"ba34d97d72c3","pid":17,"level":30,"NODE_ENV":"production","msg":"API logger loaded","time":"2021-03-30T05:28:12.841Z","v":0}
{"name":"binance-api","version":"0.0.65","hostname":"ba34d97d72c3","pid":17,"helper":"mongo","level":30,"uri":"mongodb://binance-mongo:27017/?poolSize=20&retryWrites=true&writeConcern=majority","msg":"Connecting mongodb","time":"2021-03-30T05:28:13.302Z","v":0}
[ioredis] Unhandled error event: Error: connect ETIMEDOUT
at Socket. (/srv/node_modules/ioredis/built/redis/index.js:308:37)
at Object.onceWrapper (events.js:421:28)
at Socket.emit (events.js:315:20)
at Socket._onTimeout (net.js:483:8)
at listOnTimeout (internal/timers.js:554:17)
at processTimers (internal/timers.js:497:7)

bot Not buying

{"name":"binance-api","version":"0.0.12","hostname":"5771f48662d2","pid":18,"job":"simpleStopChaser","uuid":"f0fca491-05a2-4546-a723-fa520a25a391","symbol":"BTCUSDT","symbolUuid":"ce0fba82-60dc-4bd3-8c0b-73603670cedf","level":50,"quantity":0,"msg":"Order quantity is less or equal than minimum quantity - 0.00000100.","time":"2021-01-18T15:34:45.412Z","v":0}

Multi language support

Is your proposal related to a problem?

For the bot GUI interface to support multiple languages.

Describe the solution you'd like

User able to select any of the supported language in the .ENV file or even inside the GUI settings page.

Additional context

Would be nice if the translations can be easily added by the community.

I am no developer anymore, but I think this can be achieved like this:
https://medium.com/i18n-and-l10n-resources-for-developers/node-js-tutorial-on-creating-a-multilingual-web-app-df24d8471482

Buy/sell signals not updating

Hi

I'm running the bot for 2 days and it didnt sell even when "minimum selling price" is reached.
When i check localhost:8080 I realized that "current price" is not updating. And the time near "Buy signal" and "sell signal" stays the same

What can i do to solve this problem ?

Getting ETIMEDOUT errors, does anyone experience these errors?

Hello,

First of all I want to congratulate you @chrisleekr for your work. I really like your bot and started using it for 2 weeks now.

I am using 5 pairs with the cron set up every second (default). So each second it makes 3 api calls to binance, get account info, get open orders and get candles. I am experiencing ETIMEDOUT errors each 2-3 minutes after a while. Sometimes I get the errors pretty fast, after a few minutes, sometimes after 30 minutes. Once the errors appear they kind of repeat every 2-3 minutes.

All api's give the ETIMEDOUT so it is not related to one api.

I know that binance could maybe experience issues from time to time but last night I left the bot running and got the errors every 2-3 minutes for 8 hours straight.

I have very good internet connection, fiber optics 500Mbps.

If I add more pairs it seems the errors start to appear faster to the point where the interface does not update for whole minutes.
I also increased the cron time to */5 (each 5 secs) and it was better but I still get the errors after a longer time.

I ran the bot on windows and also on mac and it is the same.

My thoughts are that somehow binance blocks the bot?
My question is if anyone experienced these errors or is it related to my setup?

I am pasting one example below.

request to https://api.binance.com/api/v3/klines?interval=30m&symbol=ADAUSDT&limit=30 failed, 
reason: connect ETIMEDOUT 52.84.150.39:443```Stack:```FetchError: request to https://api.binance.com/api/v3/klines?interval=30m&symbol=ADAUSDT&limit=30 failed, 
reason: connect ETIMEDOUT 52.84.150.39:443
    at ClientRequest.<anonymous> (/srv/node_modules/node-fetch/index.js:133:11)
    at ClientRequest.emit (events.js:315:20)
    at TLSSocket.socketErrorListener (_http_client.js:469:9)
    at TLSSocket.emit (events.js:315:20)
    at emitErrorNT (internal/streams/destroy.js:106:8)
    at emitErrorCloseNT (internal/streams/destroy.js:74:3)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)

Nice project

Hey nice project you did here, I'm new to the spot test network, do you know if there is a web interface I can see the orders list made by the bot? I want to compare the order results in test environment with what happened in real life.

Slack doesn't work

I don't know if i'm doing something wrong, I've put the URL on the env, and configured slack to recieve messages from user and bot, but nothing happens. Thanks!

Symbols didn't appears on frontent

Hello, It seems great bot. But I can't activate it. I'm adjusting symbols but nothing appeared on the frontend.
I can only see my balance.
Also, I want to add NPXR/USDT. And I didn't understand the flag limit option at all. Can you describe it.

Thanks in advance.

Stop Loss

I do a little naive query, positions does not have a defined stop loss, only one is executed when it reaches profit?

Why the price is not change when in test mode

i provide live and test api key and secret in .env file. And BINANCE_MODE = test in docker-compose.yml but the price is not tik tik.

But when mode = live the price change tik tik happen

Feature Suggestion

Hey, awesome work, a suggestion:

  • Add the option to choose FIAT currency - BUSD etc.
  • Also, a posibility to buy with % of available balance also seems like a good idea :)

Frontend Doesn't work

The frontend throws the following error in the console
Uncaught Error: Minified React error #130; visit https://reactjs.org/docs/error-decoder.html?invariant=130&args[]=undefined&args[]= for the full message or use the non-minified dev environment for full errors and additional helpful warnings. at fd (react-dom.production.min.js:185) at n (react-dom.production.min.js:87) at w (react-dom.production.min.js:90) at react-dom.production.min.js:94 at U (react-dom.production.min.js:110) at Pj (react-dom.production.min.js:234) at di (react-dom.production.min.js:168) at Nj (react-dom.production.min.js:168) at sc (react-dom.production.min.js:168) at gf (react-dom.production.min.js:162)

Installation steps (Windows)

Hello.

Congrats for the long-awaited bot.
Can you please provide more detailed installation instructions for your project, under Docker running through Windows OS ?

Im not really familiar with it - and would like to have some advise.

Steps I took so far:

-Installed Docker through Windows Store
-Created a portrainer server/agent using instructions from here: https://documentation.portainer.io/v2.0/deploy/ceinstalldocker/

But im really unsure about the next step.
-Where should I clone the github repo?
-How do I fire up the app?

Thanks in advance,

Doesn't load

It just keeps on hanging and spinning when opening at http://localhost:8080

(node:38) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token u in JSON at position 0

at JSON.parse (<anonymous>)

at handleLatest (/srv/app/websocket/handlers/latest.js:33:23)

at runMicrotasks (<anonymous>)

at processTicksAndRejections (internal/process/task_queues.js:93:5)

at async WebSocket.<anonymous> (/srv/app/websocket/configure.js:43:11)

(node:38) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 52)

{"name":"binance-api","version":"0.0.52","hostname":"addd366f6812","pid":38,"server":"cronjob","job":"simpleStopChaser","uuid":"3c219a02-94d4-4824-82c2-edd561b88896","level":30,"msg":"Trade: Simple Stop-Chasing","time":"2021-02-17T18:59:51.001Z","v":0}

{"name":"binance-api","version":"0.0.52","hostname":"addd366f6812","pid":38,"server":"cronjob","job":"simpleStopChaser","uuid":"3c219a02-94d4-4824-82c2-edd561b88896","level":30,"simpleStopChaserConfig":{"enabled":true,"cronTime":"* * * * * *","symbols":["BTCUPUSDT","ETHUPUSDT","BNBUPUSDT","XRPUPUSDT","ADADOWNUSDT","LTCDOWNUSDT","TRXUPUSDT","LINKUPUSDT","BCHUPUSDT"],"candles":{"interval":"15m","limit":200},"maxPurchaseAmount":100,"stopLossLimit":{"lastBuyPercentage":1.06,"stopPercentage":0.97,"limitPercentage":0.969}},"msg":"Successfully retrieved configuration from the cache.","time":"2021-02-17T18:59:51.002Z","v":0}

{"name":"binance-api","version":"0.0.52","hostname":"addd366f6812","pid":38,"server":"cronjob","job":"simpleStopChaser","uuid":"3c219a02-94d4-4824-82c2-edd561b88896","level":30,"symbols":["BTCUPUSDT","ETHUPUSDT","BNBUPUSDT","XRPUPUSDT","ADADOWNUSDT","LTCDOWNUSDT","TRXUPUSDT","LINKUPUSDT","BCHUPUSDT"],"msg":"Checking symbols...","time":"2021-02-17T18:59:51.002Z","v":0}

{"name":"binance-api","version":"0.0.52","hostname":"addd366f6812","pid":38,"server":"cronjob","job":"simpleStopChaser","uuid":"3c219a02-94d4-4824-82c2-edd561b88896","level":30,"cachedLastSymbol":"BNBUPUSDT","msg":"Cached last symbol","time":"2021-02-17T18:59:51.003Z","v":0}

{"name":"binance-api","version":"0.0.52","hostname":"addd366f6812","pid":38,"server":"cronjob","job":"simpleStopChaser","uuid":"3c219a02-94d4-4824-82c2-edd561b88896","level":30,"cachedSymbolIndex":2,"msg":"Found symbol index","time":"2021-02-17T18:59:51.003Z","v":0}

{"name":"binance-api","version":"0.0.52","hostname":"addd366f6812","pid":38,"server":"cronjob","job":"simpleStopChaser","uuid":"3c219a02-94d4-4824-82c2-edd561b88896","level":30,"currentSymbol":"XRPUPUSDT","msg":"Determined current symbol","time":"2021-02-17T18:59:51.003Z","v":0}

{"name":"binance-api","version":"0.0.52","hostname":"addd366f6812","pid":38,"server":"cronjob","job":"simpleStopChaser","uuid":"3c219a02-94d4-4824-82c2-edd561b88896","symbol":"XRPUPUSDT","symbolUuid":"feb85fab-4612-422f-9513-0ba6dbc5214b","level":30,"msg":"Start processing symbol...","time":"2021-02-17T18:59:51.004Z","v":0}

{"name":"binance-api","version":"0.0.52","hostname":"addd366f6812","pid":38,"server":"cronjob","job":"simpleStopChaser","uuid":"3c219a02-94d4-4824-82c2-edd561b88896","symbol":"XRPUPUSDT","symbolUuid":"feb85fab-4612-422f-9513-0ba6dbc5214b","level":30,"cachedExchangeInfo":"[\"BTCUSDT\",\"ETHUSDT\",\"BNBUSDT\",\"BCCUSDT\",\"NEOUSDT\",\"LTCUSDT\",\"QTUMUSDT\",\"ADAUSDT\",\"XRPUSDT\",\"EOSUSDT\",\"TUSDUSDT\",\"IOTAUSDT\",\"XLMUSDT\",\"ONTUSDT\",\"TRXUSDT\",\"ETCUSDT\",\"ICXUSDT\",\"VENUSDT\",\"NULSUSDT\",\"VETUSDT\",\"PAXUSDT\",\"BCHABCUSDT\",\"BCHSVUSDT\",\"USDCUSDT\",\"LINKUSDT\",\"WAVESUSDT\",\"BTTUSDT\",\"USDSUSDT\",\"ONGUSDT\",\"HOTUSDT\",\"ZILUSDT\",\"ZRXUSDT\",\"FETUSDT\",\"BATUSDT\",\"XMRUSDT\",\"ZECUSDT\",\"IOSTUSDT\",\"CELRUSDT\",\"DASHUSDT\",\"NANOUSDT\",\"OMGUSDT\",\"THETAUSDT\",\"ENJUSDT\",\"MITHUSDT\",\"MATICUSDT\",\"ATOMUSDT\",\"TFUELUSDT\",\"ONEUSDT\",\"FTMUSDT\",\"ALGOUSDT\",\"USDSBUSDT\",\"GTOUSDT\",\"ERDUSDT\",\"DOGEUSDT\",\"DUSKUSDT\",\"ANKRUSDT\",\"WINUSDT\",\"COSUSDT\",\"NPXSUSDT\",\"COCOSUSDT\",\"MTLUSDT\",\"TOMOUSDT\",\"PERLUSDT\",\"DENTUSDT\",\"MFTUSDT\",\"KEYUSDT\",\"STORMUSDT\",\"DOCKUSDT\",\"WANUSDT\",\"FUNUSDT\",\"CVCUSDT\",\"CHZUSDT\",\"BANDUSDT\",\"BUSDUSDT\",\"BEAMUSDT\",\"XTZUSDT\",\"RENUSDT\",\"RVNUSDT\",\"HCUSDT\",\"HBARUSDT\",\"NKNUSDT\",\"STXUSDT\",\"KAVAUSDT\",\"ARPAUSDT\",\"IOTXUSDT\",\"RLCUSDT\",\"MCOUSDT\",\"CTXCUSDT\",\"BCHUSDT\",\"TROYUSDT\",\"VITEUSDT\",\"FTTUSDT\",\"BUSDTRY\",\"USDTTRY\",\"USDTRUB\",\"EURUSDT\",\"OGNUSDT\",\"DREPUSDT\",\"BULLUSDT\",\"BEARUSDT\",\"ETHBULLUSDT\",\"ETHBEARUSDT\",\"TCTUSDT\",\"WRXUSDT\",\"BTSUSDT\",\"LSKUSDT\",\"BNTUSDT\",\"LTOUSDT\",\"EOSBULLUSDT\",\"EOSBEARUSDT\",\"XRPBULLUSDT\",\"XRPBEARUSDT\",\"STRATUSDT\",\"AIONUSDT\",\"MBLUSDT\",\"COTIUSDT\",\"BNBBULLUSDT\",\"BNBBEARUSDT\",\"STPTUSDT\",\"USDTZAR\",\"WTCUSDT\",\"DATAUSDT\",\"XZCUSDT\",\"SOLUSDT\",\"USDTIDRT\",\"CTSIUSDT\",\"HIVEUSDT\",\"CHRUSDT\",\"BTCUPUSDT\",\"BTCDOWNUSDT\",\"GXSUSDT\",\"ARDRUSDT\",\"LENDUSDT\",\"MDTUSDT\",\"STMXUSDT\",\"KNCUSDT\",\"REPUSDT\",\"LRCUSDT\",\"PNTUSDT\",\"USDTUAH\",\"COMPUSDT\",\"USDTBIDR\",\"BKRWUSDT\",\"SCUSDT\",\"ZENUSDT\",\"SNXUSDT\",\"ETHUPUSDT\",\"ETHDOWNUSDT\",\"ADAUPUSDT\",\"ADADOWNUSDT\",\"LINKUPUSDT\",\"LINKDOWNUSDT\",\"VTHOUSDT\",\"DGBUSDT\",\"GBPUSDT\",\"SXPUSDT\",\"MKRUSDT\",\"DAIUSDT\",\"DCRUSDT\",\"STORJUSDT\",\"BNBUPUSDT\",\"BNBDOWNUSDT\",\"XTZUPUSDT\",\"XTZDOWNUSDT\",\"USDTBKRW\",\"MANAUSDT\",\"AUDUSDT\",\"YFIUSDT\",\"BALUSDT\",\"BLZUSDT\",\"IRISUSDT\",\"KMDUSDT\",\"USDTDAI\",\"JSTUSDT\",\"SRMUSDT\",\"ANTUSDT\",\"CRVUSDT\",\"SANDUSDT\",\"OCEANUSDT\",\"NMRUSDT\",\"DOTUSDT\",\"LUNAUSDT\",\"RSRUSDT\",\"PAXGUSDT\",\"WNXMUSDT\",\"TRBUSDT\",\"BZRXUSDT\",\"SUSHIUSDT\",\"YFIIUSDT\",\"KSMUSDT\",\"EGLDUSDT\",\"DIAUSDT\",\"RUNEUSDT\",\"FIOUSDT\",\"UMAUSDT\",\"EOSUPUSDT\",\"EOSDOWNUSDT\",\"TRXUPUSDT\",\"TRXDOWNUSDT\",\"XRPUPUSDT\",\"XRPDOWNUSDT\",\"DOTUPUSDT\",\"DOTDOWNUSDT\",\"USDTNGN\",\"BELUSDT\",\"WINGUSDT\",\"LTCUPUSDT\",\"LTCDOWNUSDT\",\"UNIUSDT\",\"NBSUSDT\",\"OXTUSDT\",\"SUNUSDT\",\"AVAXUSDT\",\"HNTUSDT\",\"FLMUSDT\",\"UNIUPUSDT\",\"UNIDOWNUSDT\",\"ORNUSDT\",\"UTKUSDT\",\"XVSUSDT\",\"ALPHAUSDT\",\"USDTBRL\",\"AAVEUSDT\",\"NEARUSDT\",\"SXPUPUSDT\",\"SXPDOWNUSDT\",\"FILUSDT\",\"FILUPUSDT\",\"FILDOWNUSDT\",\"YFIUPUSDT\",\"YFIDOWNUSDT\",\"INJUSDT\",\"AUDIOUSDT\",\"CTKUSDT\",\"BCHUPUSDT\",\"BCHDOWNUSDT\",\"AKROUSDT\",\"AXSUSDT\",\"HARDUSDT\",\"DNTUSDT\",\"STRAXUSDT\",\"UNFIUSDT\",\"ROSEUSDT\",\"AVAUSDT\",\"XEMUSDT\",\"AAVEUPUSDT\",\"AAVEDOWNUSDT\",\"SKLUSDT\",\"SUSDUSDT\",\"SUSHIUPUSDT\",\"SUSHIDOWNUSDT\",\"XLMUPUSDT\",\"XLMDOWNUSDT\",\"GRTUSDT\",\"JUVUSDT\",\"PSGUSDT\",\"USDTBVND\",\"1INCHUSDT\",\"REEFUSDT\",\"OGUSDT\",\"ATMUSDT\",\"ASRUSDT\",\"CELOUSDT\",\"RIFUSDT\",\"BTCSTUSDT\",\"TRUUSDT\",\"CKBUSDT\",\"TWTUSDT\",\"FIROUSDT\",\"LITUSDT\",\"SFPUSDT\"]","msg":"Retrieved exchange information from cache","time":"2021-02-17T18:59:51.004Z","v":0}

Not able to view newly added new symbols

Hi,

I added new symbols in .env file as below, but in frontend new symbols are not shown only the default symbols are listed.

BINANCE_JOBS_SIMPLE_STOP_CHASER_SYMBOLS=['IOSTBTC','BTCUSDT','ETHUSDT','LTCUSDT','XRPUSDT','LINKUSDT','BNBUSDT','EOSUSDT','TRXUSDT','XLMUSDT','BCHUSDT','DOTUSDT','ADAUSDT']

Thanks,
Santosh

Filled orders not applying in the bot

The issue is that the bot puts an order in a decent time, but after the order is filled, it doesn't start tracking it, it doesn't acknowledge that there is already a position to trade with.

So after the bot buys and it is filled, it just ignores it.

Different between current and highest price.

Is your proposal related to a problem?

Not a problem like software issue more frustration.

Describe the solution you'd like

  1. When a Coin drops within a few minutes with 15% (current price vs highest price and between the candles interval) but still higher then the buy/lowest counter it can be interesting to buy

  2. When the current price >15% vs highest price buy coins.

  3. When the current price <15% vs highest price do nothing

  4. When the Trigger Sell price < Highest price dont buy

Describe alternatives you've considered

Doing manual.

Refresh interval going down after few minutes

Hello, It's working great.
FYI I notice something, when I started the bot, in a few 15-20 sec. all coin's current price information refreshing in 2 seconds. after a 15-20 sec. It's going down and it starting to refresh in random seconds.

All the best.

Can we add a wiki to the project?

Hi C, I was thinking about adding a wiki to the project here on github. What do you think?

That could help reduce README size and organize things a little bit better for new users... Including a FAQ.

If you're OK with it, I could do it on my free time if you allow me to.

I would be more than glad to help.

Password protected interface

Is there a way to protect the interface from unauthorized use, like setting a password in settings or the complete view?

How to use this bot?

Hello, can you help me with settings?
If I want profit percentage 0.7% should I set 0,07?
And why that bot always create stop limit order and never sell/buy coin?

Pair - USDTBTC

Display release version on the web GUI

Is your proposal related to a problem?

There's no way to know on the GUI, which version of the bot you currently running.

Describe the solution you'd like

Display the release version number somewhere in the GUI screen.

Got this problem: Error: connection refused: localtunnel.me:39801

Hi,

Today I got this problem:

env:

  • BINANCE_LOCAL_TUNNEL_SUBDOMAIN=default

docker-compose:

  • target: production-stage

Error:

`events.js:292
throw er; // Unhandled 'error' event
^

Error: connection refused: localtunnel.me:39801 (check your firewall settings)
at Socket. (/srv/node_modules/localtunnel/lib/TunnelCluster.js:52:11)
at Socket.emit (events.js:315:20)
at emitErrorNT (internal/streams/destroy.js:106:8)
at emitErrorCloseNT (internal/streams/destroy.js:74:3)
at processTicksAndRejections (internal/process/task_queues.js:80:21)
Emitted 'error' event on Tunnel instance at:
at TunnelCluster. (/srv/node_modules/localtunnel/lib/Tunnel.js:96:12)
at TunnelCluster.emit (events.js:315:20)
at Socket. (/srv/node_modules/localtunnel/lib/TunnelCluster.js:50:14)
at Socket.emit (events.js:315:20)
[... lines matching original stack trace ...]
at processTicksAndRejections (internal/process/task_queues.js:80:21)
[nodemon] app crashed - waiting for file changes before starting`

Reset to Global Settings not working???

I think this could be a bug, but since am not 100% sure I am reporting it as a question.

It's possible that Reset do Global Settings (on a individual pair GUI settings page) is not working properly? Or maybe I don't know how to use it properly.

I am assuming that if you want a pair to be back to use global settings you must to the paid settings and click on the red button "Reset to Global Settings" and then click on the "Save" button. Is that assumption correct?

Assuming yes, what's happening is, after you reset a specific pair back to global settings, the pair goes back to "Customised" mode every time you made any change on the Global Settings.

Here's some screenshots:

image
Currently only 2 "customised" pairs in my setup.

image
11 "customised" pairs a few mins after changing my "Buy: Trigger %" in the Global Settings.

You can see by the timestamp from the Buy Signal that the bot already "processed" both coins and SOLUSDT is now in "customised" mode when it should be in "Global Settings" like BELUSDT.

I think this is happening to all pairs that I already adjusted individual settings before, so basically I can't or don't know how to actually reset a pair back to global settings.

Do you think you can try to reproduce this on your end?

Appreciate your help!

Enhancement of usability, suggestions:

I've been using it for some time, started to keep a steady wallet in the time of testing. The strategy really works!
So, what would improve the customizability and controll:

  • configuration templates: let't say that a couple of coins are following similar growth rates, but they don't surge above 8%, that would make a of selection for 7% high risk coins as a group, templates will come handy;
  • average growth dynamic variable: if you can calculate the average % growth that thing can spot the peak prices and make maximum profit and dispose of a coin position, so you can also have the funds avaiblable for more oportunities. The idea is that you don't stay in a position more than needed (time is money, right?)
  • include EMA 200 as a trend indicator: that is an all time market trade classic and a proven indicator;
  • strategy backtesting: needless to say how powerful that is, it will need a worker node, but with redis already present it can be pulled off*.

* understandably that is a heavy feature and the scope grows quite a lot here

Keep up the good work, mate!

i cant run the bot

[email protected] start /srv
node dist/server.js

{"name":"binance-api","version":"0.0.64","hostname":"34db31900293","pid":19,"level":30,"NODE_ENV":"production","msg":"API logger loaded","time":"2021-03-31T08:41:58.466Z","v":0}
{"name":"binance-api","version":"0.0.64","hostname":"34db31900293","pid":19,"helper":"mongo","level":30,"uri":"mongodb://binance-mongo:27017/?poolSize=20&retryWrites=true&writeConcern=majority","msg":"Connecting mongodb","time":"2021-03-31T08:42:02.352Z","v":0}
[ioredis] Unhandled error event: Error: getaddrinfo EAI_AGAIN binance-redis
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26)
[ioredis] Unhandled error event: Error: getaddrinfo EAI_AGAIN binance-redis
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26)
[ioredis] Unhandled error event: Error: getaddrinfo EAI_AGAIN binance-redis
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26)
[ioredis] Unhandled error event: Error: getaddrinfo EAI_AGAIN binance-redis
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26)
[ioredis] Unhandled error event: Error: getaddrinfo EAI_AGAIN binance-redis
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:67:26)
{"name":"binance-api","version":"0.0.64","hostname":"34db31900293","pid":19,"helper":"mongo","level":50,"e":{"name":"MongoServerSelectionError","reason":{"type":"Unknown","setName":null,"maxSetVersion":null,"maxElectionId":null,"servers":{},"stale":false,"compatible":true,"compatibilityError":null,"logicalSessionTimeoutMinutes":null,"heartbeatFrequencyMS":10000,"localThresholdMS":15,"commonWireVersion":null}},"msg":"Error on connecting to mongodb","time":"2021-03-31T08:42:32.491Z","v":0}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: node dist/server.js
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2021-03-31T08_42_35_384Z-debug.log

what should i do?

i am very new in docker. your installation guide is so complicated for me

i tried on windows local and centos dedicated server.
the problem is same.

Why do you need to use a FIAT currency?

As title, just wondered why is there a need to use a FIAT market? I'd like to use ETH as my base coin, so I always end up back at that, and can trade with any ETH markets.

Is this not possible?

Thanks.

Bot placing buy orders when "Buy: Trading Enabled" is unchecked

First of all, thanks for sharing this. Great work. I am loving it so far...
I've using the bot for 2 o 3 days now...
Took me some time to understand how the set triggers and %s properly for buy and sell, but I think I've finally figured out.

Description

I've disabled "Buy: Trading Enabled" on settings which is displaying correcting on the GUI
However, during yesterday BTC dip the bot started buying all over when it wasn't supposed to do it.
So, the bot didn't respect the configuration.
I had to set "Buy: Trigger percentage" to 0.99 to avoid getting buy orders created, which partially fix the problem but not without problems, because when buy is triggered the bot get hanged on that pair and never moves forward until you reboot the docker.

To Reproduce

Not sure how to reproduce, but I know is still happening on my install.

Expected Behaviours

The bot shouldn't create any buy order when "Buy: Trading Enabled" is unchecked.

Screenshots

image
image
image

Additional context

My setup is running inside a Ubuntu Server 20.04 KVM machine on a Proxmox server with stable and fast internet connection. HW is also pretty fast.
Deployed with docker + docker-composer using docker-compose.server.yml

If you need any additional info. please let me know.

Not working on Raspberry Pi

Hello, I wanted to test out the bot on my Raspberry Pi 4 but it keeps saying exec user process caused: exec format error.

Of course, I've used the docker image for the RPi.

Any ideas?

App crashed - maybe tunnel related

events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: connection refused: localtunnel.me:44027 (check your firewall settings)
    at Socket.<anonymous> (/srv/node_modules/localtunnel/lib/TunnelCluster.js:52:11)
    at Socket.emit (events.js:315:20)
    at emitErrorNT (internal/streams/destroy.js:106:8)
    at emitErrorCloseNT (internal/streams/destroy.js:74:3)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
Emitted 'error' event on Tunnel instance at:
    at TunnelCluster.<anonymous> (/srv/node_modules/localtunnel/lib/Tunnel.js:96:12)
    at TunnelCluster.emit (events.js:315:20)
    at Socket.<anonymous> (/srv/node_modules/localtunnel/lib/TunnelCluster.js:50:14)
    at Socket.emit (events.js:315:20)
    [... lines matching original stack trace ...]
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
[nodemon] app crashed - waiting for file changes before starting...

Bot on Raspberry

Someone has the bot running on raspberry pi? I could not make it run. Thanks!

Run without docker

Hello, I need to run the docker container in a apache2 subdirectory, I've tried with reverse proxy but node seems to have a problem with proxys.

Is there any way to run this bot natively on my machine? It's a Raspberry Pi 4 with Raspberry Pi OS 64-bit with mongo, node and redis already installed.

Change multi symbol trade setting.

  • I trade 5 symbols in 1 docker at same time.

first request

  • some time i need to change all symbol setting but if i use global setting, every symbol will be customised setting. then i have to modify every symbol setting.
  • have a way to make change at same time.

second request

  • With the limit of ip request api, the tick only happen in 1 second. but i have 5 symbols trading, so a symbol have to wait 4 second to get the turn.
  • have a way to request all symbol info at a time for calculate the trading.

Can't stop a symbol from showing up on the GUI

Is your proposal related to a problem?

Once I remove a symbol from the Global Setting page the symbol still shows up on the GUI but with a "remove" button for you to remove it manually if you want it.

Unfortunately that button doesn't show up for symbol where you have some balance left, is this on purpose?

Can't we enable the remove button for these symbols as sell? For me they just take space from screen since they are not even getting updated (which is correct since is not in the monitoring list any longer)

Here's a screenshot where you can notice that I can't remove the symbol BTCUSDT.

image

Describe the solution you'd like

Enable the remove button in a symbol on the main screen, for any symbol that is already removed from "Symbols" list in the Global Settings page.

Data empty after few seconds

Hi,

I got a problem on Windows with WSL. I got docker, the application was running fine but only few minutes. I tryied reinstall all (docker, binance-trading-bot). And now the application is completely empty. I just get the header.

When i check the WebSocker tab in chrome i got this :
{command: "latest", data: {}}
command: "latest"
data: {}

I found a really similar issue here :

#31

But the issue is closed and he don't have solution.

Do you have an idea please ?

Performance Issues

Hi Chris,

It is a lovely bot. I setup and configured settings on Windows with using Docker Desktop. It works great for a time however approx. 1 hour 30 minutes the UI becomes unresponsive and only updates the time and does not gather any data. For now, I'm thinking a task scheduler to restart the docker after that time. Is it possible that you can take a look at that? I have decent internet connection and hardware. Thanks in advance.

Regards,
Bariscan

Sell Order when loss

Hello,

Is it possible, with actual available settings, to set an automatic sell when the current price comes lower than the last buy price ?

Thanks.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.