Giter Site home page Giter Site logo

v20-python-samples's Introduction

v20-python-samples

This repo contains a suite of Python sample code that desmonstrates the use of OANDA's v20 REST API along with OANDA's v20 bindings for Python.

Setup

The following procedure describes how to create a virtualenv appropriate for running the v20 sample code:

#
# Set up the virtualenv and install required packages. By default the
# virtualenv will be setup to use python3. If python2 is desired, use the make
# target "bootstrap-python2" and the virtualenv will be created under
# "env-python2"
#
user@host: ~/v20-python-samples$ make bootstrap

#
# Enter the virtualenv
#
user@host: ~/v20-python-samples$ source env/bin/activate

#
# Create the v20-* launch entry points in the virtualenv. These entry points
# are aliases for the scripts which use the v20 REST API to interact with an
# account (e.g. v20-market-order, v20-trades-list, etc.)
#
(env)user@host: ~/v20-python-samples$ python setup.py develop

Entering the v20 environment

The v20-python-samples virtualenv must be activated to ensure that the current enviroment is set up correctly to run the sample code. This is done using the virualenv's activate script:

user@host: ~/v20-python-samples$ source env/bin/activate
(env)user@host: ~/v20-python-samples$

The "(env)" prefix found in the prompt indicates that we are using the virtualenv "env". To leave the virtualenv, run the deactivate function:

(env)user@host: ~/v20-python-samples$ deactivate
user@host: ~/v20-python-samples$ 

Configuration-free Example

Most of the examples provided use a v20.conf discussed below. For a full example of how to create and use a v20 API context without the configuration wrapper, please examine src/market_order_full_example.py. This program enables the creation of a limited Market Order solely based on command line arguments.

Configuration

Using OANDA's v20 REST API requires configuration to set up connections and interact with the endpoints. This configuration includes:

  • API hostname
  • API port
  • API token
  • username of client
  • Account ID of account being manipulated

To simplify the management of this configuration, the v20 Python sample code requires that a configuration file be created. All of the sample code loads this configuration file prior to connecting to the v20 system.

v20 Configuration File Format

The v20 configuration is stored in a YAML file that resembles the following:

hostname: api-fxpractice.oanda.com
streaming_hostname: stream-fxpractice.oanda.com
port: 443
ssl: true
token: e6ab562b039325f12a026c6fdb7b71bb-b3d8721445817159410f01514acd19hbc
username: user
accounts:
- 101-001-100000-001
- 101-001-100000-002
active_account: 101-001-100000-001

Generating v20 Configuration files

v20 configuration files may be generated manually, however a script is provided that will generate one interactively located at src/configure.py.

To run it and generate a v20 configuration file, simply run:

(env)user@host: ~/v20-python-samples$ v20-configure

and follow the instructions.

Using v20 Configuration files

There are several ways to load a v20 configuration file in each of v20 sample scripts:

1. Run the script with the --config option

The --config options allows you to specify the location of a valid v20 configuration file v20. Example:

(env)user@host: ~/v20-python-samples$ v20-account-details --config /home/user/v20.conf

2. Use the default v20 configuration file location

The default location for the v20 configuration file is ~/.v20.conf. If a v20 configuration file exists in the default location, no --config option needs to be used. Example:

# Looks for config file at ~/.v20.conf
(env)user@host: ~/v20-python-samples$ v20-account-details

3. Set the location of the V20_CONF environment variable

This V20_CONF environment variable changes what the default location of the v20 configuration file is. If a configuration file exists in this location, no --config option needs to be used. Example:

(env)user@host: ~/v20-python-samples$ export V20_CONF=/home/user/v20.conf
(env)user@host: ~/v20-python-samples$ v20-account-details

Sample Code

Following is a listing of the sample code provided. More details can be found in the READMEs provided in each src directory.

Source File Entry Point Description
src/configure.py v20-configure Create/update a v20.conf file
src/market_order_full_example.py v20-market-order-full-example Limited Market Order example that does not use the v20.conf file
src/account/details.py v20-account-details Get the details of the current active Account
src/account/summary.py v20-account-summary Get the summary of the current active Account
src/account/instruments.py v20-account-instruments Get the list of tradeable instruments for the current active Account
src/account/changes.py v20-account-changes Follow changes to the current active Account
src/account/configure.py v20-account-configure Set configuration in the current active Account
src/instrument/candles.py v20-instrument-candles Fetch candles for an instrument
src/instrument/candles_poll.py v20-instrument-candles-poll Fetch and poll for candle updates for an instrument
src/order/get.py v20-order-get Get the details of an order in the current active Account
src/order/list_pending.py v20-order-list-pending List all pending Orders for the current active Account
src/order/cancel.py v20-order-cancel Cancel a pending Order in the current active Account
src/order/set_client_extensions.py v20-order-set-client-extensions Set the client extensions for a pending Order in the current active Account
src/order/market.py v20-order-market Create a Market Order in the current active Account
src/order/entry.py v20-order-entry Create or replace an Entry Order in the current active Account
src/order/limit.py v20-order-limit Create or replace a Limit Order in the current active Account
src/order/stop.py v20-order-stop Create or replace a Stop Order in the current active Account
src/order/take-profit.py v20-order-take-profit Create or replace a Take Profit Order in the current active Account
src/order/stop-loss.py v20-order-stop-loss Create or replace a Stop Loss Order in the current active Account
src/order/trailing-stop-loss.py v20-order-trailing-stop-loss Create or replace a Trailing Stop Loss Order in the current active Account
src/pricing/get.py v20-pricing-get Fetch/poll the current Prices for a list of Instruments
src/pricing/stream.py v20-pricing-stream Stream Prices for a list of Instruments
src/transaction/stream.py v20-transaction-stream Stream Transactions for the current active Account
src/transaction/poll.py v20-transaction-poll Poll Transactions for the current active Account
src/transaction/get.py v20-transaction-get Get details for a Transaction in the current active Account
src/transaction/range.py v20-transaction-range Get a range of Transactions in the current active Account
src/trade/get.py v20-trade-get Get all open Trades or a specific Trade in the current active Account
src/trade/close.py v20-trade-close Close (partially or fully) a Trade in the current active Account
src/trade/set_client_extensions.py v20-trade-set-client-extensions Set the client extensions for an open Trade in the current active Account
src/position/close.py v20-position-close Close a position for an instrument in the current active Account

v20-python-samples's People

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

v20-python-samples's Issues

'Context' object has no attribute 'primitives'

from running the script
$ v20-account-instruments

Traceback (most recent call last):
File "./v20-account-instruments", line 11, in
load_entry_point('v20-python-samples', 'console_scripts', 'v20-account-instruments')()
File "/home/archangel/git/OANDA/v20-python-samples/src/account/instruments.py", line 38, in main
response = api.account.instruments(account_id)
File "/home/archangel/git/OANDA/v20-python-samples/env/lib/python3.5/site-packages/v20/account.py", line 1128, in instruments
for d in jbody.get('instruments')
File "/home/archangel/git/OANDA/v20-python-samples/env/lib/python3.5/site-packages/v20/account.py", line 1128, in
for d in jbody.get('instruments')
AttributeError: 'Context' object has no attribute 'primitives'

Makefile bug

Using python2 to install a python3 environment has been problematic for some time now.

Example:
$ virtualenv -p python3 env

Invokes python2 virtualenv which imports the now deprecated emp module.

I better way to install a python3 virtual environment might be (adapted to match match this repo's expectations):
python3 -m venv env

Additionally, pip should be run from within the environment and upgraded upon its initial invocation. Reason being is that not all *nux distros have upgraded to python3 yet so without switching to the newly created vitual environment first might invoke pip2 not pip3. It is almost a forgone conclusion that when the virtual environment is created it will have an old version of pip3 installed in it and if it is invoked, it will toss warnings until upgraded.

a reasonable couple lines like:
source /env/bin/activate pip install --upgrade pip

Then finally the most reasonable:
pip install -r requirements/base.txt

*NOTE I didn't qualify pip in assuming that the virtualenv would still be active.

sample in win

This sample you given is based on linux. Are there some codes and comments for win? or win cannot run it. i just can use linux env to run it?

Removing the need for C++ compiler

While running pip install v20:

  error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C+
+ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

  ----------------------------------------
  Failed building wheel for ujson

ujson might be a fast json encoder/decoder, but is possible to use a more common library that doesn't require visual studio installed after all this is a python codebase?

Module not Found Error: No module name 'yaml'

I'm trying to set up the configure file but every time I run v20-configure I run into the following issue:

(test) C:\samplebackup\v20-python-samples-master>v20-configure
Traceback (most recent call last):
File "C:\samplebackup\v20-python-samples-master\test\Scripts\v20-configure-script.py", line 11, in
load_entry_point('v20-python-samples', 'console_scripts', 'v20-configure')()
File "C:\samplebackup\v20-python-samples-master\test\lib\site-packages\pkg_resources_init_.py", line 489, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "C:\samplebackup\v20-python-samples-master\test\lib\site-packages\pkg_resources_init_.py", line 2843, in load_entry_point
return ep.load()
File "C:\samplebackup\v20-python-samples-master\test\lib\site-packages\pkg_resources_init_.py", line 2434, in load
return self.resolve()
File "C:\samplebackup\v20-python-samples-master\test\lib\site-packages\pkg_resources_init_.py", line 2440, in resolve
module = import(self.module_name, fromlist=['name'], level=0)
File "c:\samplebackup\v20-python-samples-master\src\configure.py", line 3, in
import common.config
File "C:\Python37\Lib\common\config.py", line 2, in
import yaml
ModuleNotFoundError: No module named 'yaml'

I'm a little lost as to why I'm getting this, any ideas?

ModuleNotFoundError

After setup when I run
src/account/summary.py

I get following messages,

Traceback (most recent call last):
File "src/account/summary.py", line 5, in
from .account import Account
ModuleNotFoundError: No module named 'main.account'; 'main' is not a package

any clue?

make error

I download the Rest API V20 sample code from here
https://github.com/oanda/v20-python-samples
but I got below error when make
I have python 3.6.1 and GnuWin32 for make

Also how can I run the sample code on pycharm?

C:\Users\lei.wang\PycharmProjects\v20-python-samples-master>make bootstrap
virtualenv -p python3 env
process_begin: CreateProcess(NULL, virtualenv -p python3 env, ...) failed.
make (e=2): The system cannot find the file specified.
make: *** [bootstrap-python3] Error 2

Fedora 25 - Package Dependencies [ RESOLVED ]

There are some environmental bits that need to be setup on a new install of Fedora 25.

`
$ uname -a; cat /etc/redhat-release
Linux bastion.moor.local 4.9.14-200.fc25.x86_64 #1 SMP Mon Mar 13 19:26:40 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Fedora release 25 (Twenty Five)

gcc: error: /usr/lib/rpm/redhat/redhat-hardened-cc1: No such file or directory
error: command gcc failed with exit status 1


Failed building wheel for ujson

In file included from ./python/ujson.c:39:0:
./python/py_defines.h:39:20: fatal error: Python.h: No such file or directory
#include <Python.h>
^
compilation terminated.
error: command 'gcc' failed with exit status 1


Failed building wheel for ujson
`
SOLUTION: sudo dnf install redhat-rpm-config python-devel python3-devel

Unrecognized arguments

I encountered this error market_order_full_example.py: error: unrecognized arguments: instrument EUR_USD units 1000 whenever I execute market_order_full_example.py script. I did pass in the required arguments but it always complains about the instrument and units arguments.
The command I used.
python market_order_full_example.py accountid [my_account_id] token [token] instrument EUR_USD units 1000

ModuleNotFoundError: No module named 'common'

ModuleNotFoundError: No module named 'common'

was running the code such as summary.py but got the above error. it's from import common.config.

Any idea why? Thanks.

must I run this setup first?
I got errors telling me that can't find bootstrap after I remove the ~/v20-python-samples$ as I'm making the D:\Users\v20-python-samples-master as my current working directory already.

Appreciate it.

Set up the virtualenv and install required packages. By default the

virtualenv will be setup to use python3. If python2 is desired, use the make

target "bootstrap-python2" and the virtualenv will be created under

"env-python2"

user@host: ~/v20-python-samples$ make bootstrap

Enter the virtualenv

user@host: ~/v20-python-samples$ source env/bin/activate

Create the v20-* launch entry points in the virtualenv. These entry points

are aliases for the scripts which use the v20 REST API to interact with an

account (e.g. v20-market-order, v20-trades-list, etc.)

(env)user@host: ~/v20-python-samples$ python setup.py develop

Local Dependency Issues

Hello I am having problems with the local dependencies. When I run any of the sample files I get dependency errors. I created a virtual environment and ran setup.py .

v20-python-samples user$ v20-account-summary

No module named 'common.config'

Make error

It returns

user-MacBook-Pro:$ make bootstrap-python3
virtualenv -p python3 env
make: virtualenv: No such file or directory
make: *** [bootstrap-python3] Error 1

Limit Order Bad Request

I am getting Bad Request when I try using limit orders (I am able to make the same order using the market orders - without the price). Hence, I guess that the price is causing the problem. I am in fact using bid or ask prices of the asset for placing the limit order. Therefore, the price formatting should not be problem, I guess. I would welcome if somebody can help me on this.

Note: Also, when we calculate a price for the limit order, what is the best way to set precision etc of that calcualted price to make sure that we would not receive a bad request as response?

connectivity problem: cannot get candle data

When I use v20-instrument-candles EUR_USD

I got following error message

Traceback (most recent call last):
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 393, in _make_request
    six.raise_from(e, None)
  File "<string>", line 2, in raise_from
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 389, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/lib/python3.5/http/client.py", line 1197, in getresponse
    response.begin()
  File "/usr/lib/python3.5/http/client.py", line 297, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python3.5/http/client.py", line 258, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/lib/python3.5/socket.py", line 575, in readinto
    return self._sock.recv_into(b)
  File "/usr/lib/python3.5/ssl.py", line 929, in recv_into
    return self.read(nbytes, buffer)
  File "/usr/lib/python3.5/ssl.py", line 791, in read
    return self._sslobj.read(len, buffer)
  File "/usr/lib/python3.5/ssl.py", line 575, in read
    v = self._sslobj.read(len, buffer)
socket.timeout: The read operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 640, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/packages/urllib3/util/retry.py", line 261, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/packages/urllib3/packages/six.py", line 686, in reraise
    raise value
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 595, in urlopen
    chunked=chunked)
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 395, in _make_request
    self._raise_timeout(err=e, url=url, timeout_value=read_timeout)
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 315, in _raise_timeout
    raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='api-fxpractice.oanda.com', port=443): Read timed out. (read timeout=2)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/v20/__init__.py", line 301, in request
    timeout=timeout
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/sessions.py", line 475, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/sessions.py", line 596, in send
    r = adapter.send(request, **kwargs)
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/requests/adapters.py", line 499, in send
    raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='api-fxpractice.oanda.com', port=443): Read timed out. (read timeout=2)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/dex/github/v20-python-samples/env/bin/v20-instrument-candles", line 11, in <module>
    load_entry_point('v20-python-samples', 'console_scripts', 'v20-instrument-candles')()
  File "/home/dex/github/v20-python-samples/src/instrument/candles.py", line 139, in main
    response = api.instrument.candles(args.instrument, **kwargs)
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/v20/instrument.py", line 311, in candles
    response = self.ctx.request(request)
  File "/home/dex/github/v20-python-samples/env/lib/python3.5/site-packages/v20/__init__.py", line 308, in request
    raise V20Timeout(url, "read")
v20.errors.V20Timeout: v20 REST request to https://api-fxpractice.oanda.com:443/v3/instruments/EUR_USD/candles has timed out (read)

And then I checked the official doc and tried another method to get candle (example from doc, excluded my own token & account)

curl \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <AUTHENTICATION TOKEN>" \
  "https://api-fxtrade.oanda.com/v3/instruments/EUR_USD/candles?count=6&price=M&granularity=S5"

Still I got

{"errorMessage":"An internal server error has occurred."}

But I am able to create order using python src/market_order_full_example.py

So this seems to be a problem with connectivity of oanda's candle api.
Anyone knows how to fix this problem? Thanks in advance!

It seems no document about the v20.functions

I cannot find the v20.functions documents beside cURL RESTful endpoints.But I preferred use v20.functions to trade.If I were wrong, please tell me.

I trial and error to summarize some:

import v20

#Place a market order:Market BUY EURUSD 10000 with stop loss 0.99332 and take profit 1.04718
ctx=v20.Context(
account_id, #just like 101-011-8XXXXX6-001
token='xxxxxxxxxxxxxxxxxxxxx', # get from Oanda website
)
response=ctx.order.market(
account_id,
instrument='EUR_USD',
units=10000,
type='MARKET',
side='BUY',
stopLossOnFill=v20.transaction.StopLossDetails(price=0.99332), # stop loss price
takeProfitOnFill=v20.transaction.TakeProfitDetails(price=1.04718). # take profit price
)
if response.status==201 and response.reason=='Created': # if success to place order
print(response.body['orderFillTransaction']) # check the response.body['orderFillTransaction']
print('id:',response.body['orderFillTransaction'].id) # print the order id

beside id, there's some information of order fulfillment.

print('instrument:',response.body['orderFillTransaction'].instrument)
print('type:',response.body['orderFillTransaction'].type)
print('price:',response.body['orderFillTransaction'].price)
print('orderID:',response.body['orderFillTransaction'].orderID)
print('batchID:',response.body['orderFillTransaction'].batchID)
print('requestID:',response.body['orderFillTransaction'].requestID)
print('units:',response.body['orderFillTransaction'].units)
print('requestedUnits:',response.body['orderFillTransaction'].requestedUnits)
print('commission:',response.body['orderFillTransaction'].commission)
print('accountBalance:',response.body['orderFillTransaction'].accountBalance)
print('time:',response.body['orderFillTransaction'].time)
print('reason:',response.body['orderFillTransaction'].reason)

Hope to know more who trade by Oanda v20 API.
And hope more details of documents about the v20.

Weird behavior in src/pricing/stream.py

Zero heartbeats were showing when using the -s flag. I had to modify the code. It was a simple modification which I will share here.

line 69 of src/pricing/stream.py ...

`
for msg_type, msg in response.parts():

    if msg_type == "**pricing.PricingHeartbeat**" and args.show_heartbeats:
        print(heartbeat_to_string(msg))
    elif msg_type == "**pricing.ClientPrice**":
       print(price_to_string(msg))

`

Notice that pricing.PricingHeartbeat and pricing.ClientPrice were the only changes.

Thanks,

Vf

Trailing Stop Losses Not working

I cant get the trailing stop loss to work in any order, either when i make the order or even to modify an order... some of the errors i get are.

raceback (most recent call last):
File "/home/vamp/opt/v20-python-samples/env/bin/v20-order-stop-loss", line 11, in
load_entry_point('v20-python-samples', 'console_scripts', 'v20-order-stop-loss')()
File "/home/vamp/opt/v20-python-samples/src/order/stop_loss.py", line 47, in main
orderArgs.parse_arguments(args)
File "/home/vamp/opt/v20-python-samples/src/order/args.py", line 54, in parse_arguments
parser(args)
File "/home/vamp/opt/v20-python-samples/src/order/args.py", line 67, in
lambda args: self.parse_trade_id(args)
File "/home/vamp/opt/v20-python-samples/src/order/args.py", line 75, in parse_trade_id
if args.trade.id[0] == '@':
AttributeError: 'Namespace' object has no attribute 'trade'

everything has been working fine, just not trailing stop losses, any help would be much appreciated.

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.