Giter VIP home page Giter VIP logo

interactive-broker-python-api's Introduction

UPDATE

This repo will soon be updated to include the new https://github.com/areed1192/interactive-brokers-api library. The master branch will be overwritten and the old code will need to be updated to reflect the new changes. If you would like to start rewriting your old code, please refer to the new branch merge-new-repo or go the link above.

Unofficial Interactive Brokers API

Table of Contents

Overview

The unofficial Python API client library for Interactive Broker Client Portal Web API allows individuals with Interactive Broker accounts to manage trades, pull historical and real-time data, manage their accounts, create and modify orders all using the Python programming language.

Interactive Broker offers multiple APIs for their clients. If you would like to learn more about their API offerings click on the links below:

What's in the API

  • Authentication
  • Account Endpoints
  • Market Data Endpoints
  • Trade Endpoints
  • Portfolio Endpoints
  • Scanner Endpoints
  • Portfolio Analysis Endpoints
  • Web Streaming

Setup Requirements

The following requirements must be met to use this API:

  • A Interactive Broker account, you'll need your account password and account number to use the API.
  • Java 8 update 192 or higher installed (gateway is compatible with higher Java versions including OpenJDK 11).
  • Download the Beta Client Portal Gateway

Setup Client Portal

Once you've downloaded the latest client portal or if you chose to use the one provided by the repo. You need to unzip the folder and place it in the repo where this code is stored.

Setup API Key and Credentials

The API does not require any API keys to use it, all of the authentication is handled by the Client Portal Gateway. Everytime a user starts a new session with the API they will need to proivde their login credentials for the account they wish to use. The Interactive Broker Web API does offer the ability to use the API using a paper account.

Important: Your account number and account password should be kept secret.

Setup Installation

pip install interactive-broker-python-web-api

Setup Writing Account Information

The Client needs specific account information to create a and validate a new session. Where you choose to store this information is up to you, but I'll layout some options here.

Write a Config File:

It's common in Python to have a config file that contains information you need to use during the setup of a script. Additionally, you can make this file in a standard way so that way it's easy to read everytime. In Python, there is a module called configparser which can be used to create config files that mimic that of Windows INI files.

To create a config file using hte configparser module, run the script below in a separate file or go to the Resources Folder and run the write_config.py file.

import pathlib
from configparser import ConfigParser

# Initialize a new instance of the `ConfigParser` object.
config = ConfigParser()

# Define a new section called `main`.
config.add_section('main')

# Set the values for the `main` section.
config.set('main', 'REGULAR_ACCOUNT', 'YOUR_ACCOUNT_NUMBER')
config.set('main', 'REGULAR_USERNAME', 'YOUR_ACCOUNT_USERNAME')

config.set('main', 'PAPER_ACCOUNT', 'YOUR_ACCOUNT_NUMBER')
config.set('main', 'PAPER_USERNAME', 'YOUR_ACCOUNT_USERNAME')

# Make the `config` folder for the user.
new_directory = pathlib.Path("config/").mkdir(parents=True, exist_ok=True)

# Write the contents of the `ConfigParser` object to the `config.ini` file.
with open('config/config.ini', 'w+') as f:
    config.write(f)

Store the Variables in the Script:

If you plan to not share the script with anyone else, then you can store the account info inside the script itself. However, please make sure that you do not make the file public to individuals you don't know.

Usage

This example demonstrates how to login to the API and demonstrates sending a request using the market_data_history endpoint, using your API key.

from ibw.client import IBClient

REGULAR_ACCOUNT = 'MY_ACCOUNT_NUMBER'
REGULAR_USERNAME = 'MY_ACCOUNT_USERNAME'

# Create a new session of the IB Web API.
ib_client = IBClient(
    username=REGULAR_USERNAME,
    account=REGULAR_ACCOUNT,
    is_server_running=True
)

# create a new session.
ib_client.create_session()

# grab the account data.
account_data = ib_client.portfolio_accounts()

# print the data.
print(account_data)

# Grab historical prices.
aapl_prices = ib_client.market_data_history(conid=['265598'], period='1d', bar='5min')

# print the prices.
print(aapl_prices)

# close the current session.
ib_client.close_session()

Features

Request Validation

For certain requests, in a limited fashion, it will help validate your request when possible. For example, when grabbing real-time quotes using the market_data endpoint, it will validate the fields you request to ensure they're valid fields for that endpoint.

Endpoint Verification

To use certain endpoints, you must call other endpoints before you use it. To help limit the amount of confusion for users, the library will call those endpoints for you behind the scenes so that way you don't need to worry about it.

Client Portal Download

If the user doesn't have the clientportal gateway downloaded, then the library will download a copy it, unzip it for you, and quickly allow you to get up and running with your scripts.

Documentation and Resources

Support these Projects

Patreon: Help support this project and future projects by donating to my Patreon Page. I'm always looking to add more content for individuals like yourself, unfortuantely some of the APIs I would require me to pay monthly fees.

YouTube: If you'd like to watch more of my content, feel free to visit my YouTube channel Sigma Coding.

Hire Me: If you have a project, you think I can help you with feel free to reach out at [email protected] or fill out the contract request form

interactive-broker-python-api's People

Contributors

areed1192 avatar beanhedge avatar josh-baltar avatar voyz 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

interactive-broker-python-api's Issues

More Order Samples!

Hey!

I just discovered your repo and YouTube video series. Excellent work! I'm looking to use your application to build my strategy using Interactive Brokers.

What I am a bit confused about, is how to create "custom" types of orders. The IB API docs are confusing and don't really highlight what I'm after. (I typed out a request form on their website and hit "Send" where I was then greeted with a "Something went wrong, please try again later" error message eye roll). I'm thinking this might be better served here anyway as I'm hoping we might discover some new order types to add to your examples/samples to help others!

To keep things simple, I'll pseudocode what the order I'm looking to create should look like:

**Buy Stop-Limit Order for 100 shares of AAPL WITH Trailing Stop Loss.**
Stop price (to trigger the buy Limit order) - $25.00
Limit price (once Buy Stop price is triggered) - $30.00
Trailing Stop Loss (once Buy Stop price is triggered) - $20.00
Trailing Stop Amount (to increment every X) - $1.00

I assume one could make some kind of bracket order, just leaving the Take Profit stuff blank as it's not needed in this case? Some potential issues I see with this above order might be:

  1. Is it even possible to trigger a Buy Limit order with Trailing SL order like this?
  2. If it is, if the order only gets a partial fill before exceeding the limit price (say only 56 shares get filled), can the Trailing SL be fitted to sell the entire position, regardless of the share size?

Looking at the sample for limit orders included in this repo's docs, and this webpage, I would envision it should look something like:

[
    // STOP-LIMIT BUY ORDER, ENTER A POSITION.
    {
        "conid": 251962528, # <- or whatever AAPL's conid is
        "secType": "362673777:STK",
        "cOID": "limit-buy-order-1",
        "orderType": "STP LMT",
        "lmtPrice": 30.00,
        "auxPrice": 25.00
        "side": "BUY",
        "quantity": 100,
        "tif": "DAY"
    },
    // TRAILING STOP, EXIT A POSITION.
    {
        "conid": 251962528,
        "secType": "362673777:STK",
        "cOID": "market-sell-order-1",
        "orderType": "TRAIL",
        "trailStopPrice": 20.00,
        "trailingPercent": 0.01, # <- 1%? Is there a way to make this $1.00 as described above?
        "side": "BUY",
        "quantity": 100,  # <- is there a way to make this 100% of position?
        "tif": "DAY"
    }
]

I noticed there might be something to do with defining the transmit attribute too, which is not included above (as I have no clue what I'm doing yet XD)

private methods

Small issue but in the run_client.py line 69 the code is:
aapl_income_statement = ib_client.fundamentals_financials( conid='265598', financial_statement='income', period

in order for this code to run need to make line 896 in client.py to be
def fundamentals_financials(self, conid: str, financial_statement: str, period: str = 'annual') -> Dict:

Place order reply should accept `reply` as bool

I was getting a http error 500 when using the order reply request

def place_order_reply(self, reply_id: str = None, reply: str = None):

According to ibrk documentation the confirmation should be boolean :
https://www.interactivebrokers.co.uk/api/doc.html#tag/Order/paths/~1iserver~1account~1orders~1{faGroup}/post

Changing the function signature makes it work
def place_order_reply(self, reply_id: str = None, reply: bool = None):

Please also note that the documentation section of the function looks like it is copy pasted from a different function

Example for placing the order

Do you have example of placing order or modify order using this lib? I am getting bad request error. Perhaps the format of the order is not correct. I would like to see if you have a working example.

Thanks.

Directory name is invalid

Hi Alex! I installed the package, but when trying to use I get this error below:

Traceback (most recent call last):

File "", line 1, in
ib_client.create_session()

File "C:\Users\User\anaconda3-64bit\lib\site-packages\ibw\client.py", line 146, in create_session
self.connect(start_server=True)

File "C:\Users\User\anaconda3-64bit\lib\site-packages\ibw\client.py", line 455, in connect
server_state = self._start_server()

File "C:\Users\User\anaconda3-64bit\lib\site-packages\ibw\client.py", line 422, in _start_server
creationflags=subprocess.CREATE_NEW_CONSOLE

File "C:\Users\User\anaconda3-64bit\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 104, in init
super(SubprocessPopen, self).init(*args, **kwargs)

File "C:\Users\User\anaconda3-64bit\lib\subprocess.py", line 800, in init
restore_signals, start_new_session)

File "C:\Users\User\anaconda3-64bit\lib\subprocess.py", line 1207, in _execute_child
startupinfo)

NotADirectoryError: [WinError 267] The directory name is invalid

I´m new to Python, bu tried to find this path or to correct things and couldn´t, can you give an idea of what to do?

Best,

Can anyone provide me with a sample order for Options?

I looked through the sample orders in the order/market_order location and its limited to a few samples. I was wondering if anyone can provide me with a sample for options buy/sell. I tried build one out but for some reason its defaulting to STK purchase vs a OPT purchase.

Thanks

Account positions

Im authencitated and get my accounts without any problem.
But when I try to get my positions the page doesnt exist.
Does portfolio_account_positions work for anybody?

macOS Terminal opening but not running the authentication

When I run ib_client.create_session(), I get the expected message with steps 1-3 telling me how to authenticate. Terminal is opened. However, nothing is run in Terminal so there's nothing running at https://localhost:5000. However, if I cd to the correct folder and do bin/run.sh root/conf.yaml then localhost shows the login screen. So it seems the problem is that the command isn't being passed through to Terminal.

client.py contains def _start_server(self) with this relevant section:

# mac will use the terminal.
        elif self._operating_system == 'darwin':
            IB_WEB_API_PROC = ["open", "-F", "-a", "Terminal", r"bin/run.sh", r"root/conf.yaml"]
            self.server_process = subprocess.Popen(
                args=IB_WEB_API_PROC,
                cwd=self.client_portal_folder
            ).pid

screenshot

My suspicion is that something is up with subprocess. Not only because of this, but also because after Terminal does nothing and the command prompt in VS Code is asking me Would you like to make an authenticated request (Yes/No)? , when I type 'No', I get a few errors including

File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/ibw/client.py", line 483, in close_session
    return_code = subprocess.call("TASKKILL /F /PID {} /T".format(self.server_process), creationflags=subprocess.DETACHED_PROCESS)
AttributeError: module 'subprocess' has no attribute 'DETACHED_PROCESS'

sc2

After some Googling, someone pointed out that if you have your own subprocess.py then Python will look through that and not find the expected DETACHED_PROCESS, but I don't have my own subprocess.py.

Have I got a corrupt subprocess module, even though it comes as standard with Python? Is something else wrong? Thanks.

HTTPError when request fundamentals_financials

Hi, I am using the _fundamentals_financials and it seems like the end point is no longer working? Please see my code and error message below:

ib_client._fundamentals_financials(conid='265598', financial_statement='income', period='quarter')


https://localhost:5000/v1/portal/tws.proxy/fundamentals/financials/265598

HTTPError Traceback (most recent call last)
in
----> 1 ib_client._fundamentals_financials(conid='265598',
2 financial_statement='income',
3 period='quarter')

~/Documents/GitHub/invest_better/ibw_sz/client.py in _fundamentals_financials(self, conid, financial_statement, period)
932 endpoint = 'tws.proxy/fundamentals/financials/{}'.format(conid)
933 req_type = 'GET'
--> 934 content = self._make_request(
935 endpoint=endpoint,
936 req_type=req_type,

~/Documents/GitHub/invest_better/ibw_sz/client.py in _make_request(self, endpoint, req_type, headers, params, data, json)
722 elif not response.ok and url != 'https://localhost:5000/v1/portal/iserver/account':
723 print(url)
--> 724 raise requests.HTTPError()
725
726 def _prepare_arguments_list(self, parameter_list: List[str]) -> str:

HTTPError:

Too bad it is no longer update. I like it is simple and direct. I have added starting IB gateway in Ubuntu if anyone like it too.

client.py

@@ -527,8 +552,37 @@
                 args=IB_WEB_API_PROC,
                 cwd=self.client_portal_folder
             ).pid
-
-        return self.server_process
+
+        elif self._operating_system == 'linux':
+            IB_WEB_API_PROC = [self.client_portal_folder+r"/bin/run.sh",r"root/conf.yaml"]
+            process = subprocess.Popen(
+                args=IB_WEB_API_PROC,
+                cwd=self.client_portal_folder,
+                stdout=subprocess.PIPE, universal_newlines=True
+            ).pid
+            time.sleep(2)
+            # get the right process by psutil, the above process takes the pid from run.sh, not the java one
+            for proc in psutil.process_iter():
+                try:
+                    processID = proc.pid
+                    # processName = proc.name()
+                    cmd = proc.cmdline()
+                    if any(r"root/conf.yaml" in s for s in cmd) and not any('run.sh' in s for s in cmd):
+                        self.server_process = processID
+                        break
+                except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
+                    pass
+            # keep alive process
+            IB_WEB_ALIVE = r'while true; do /usr/bin/sleep 300; /usr/bin/curl -ks '+self.ib_gateway_path+'/v1/portal/tickle; done'
+            self.server_alive = subprocess.Popen(args=[IB_WEB_ALIVE], shell=True).pid
+
+        return self.server_process,self.server_alive

Authentication Error

I already mentioned it on your youtube channel, but I thought it might also be prudent to note it here:
image

In essence, even after authenticating the account at the user's end, the server does not accept the authentication request, so the library can not be used. The image attached shows the VSC terminal, as well as the associated command terminal and website confirmation of authentication.

You mentioned it was due to the order in which endpoints were called, and I'd love to learn more about what in particular is causing that problem.

Thank you!

Fundamentals endpoints coming back empty.

Unsure if this is an error on my end or not, but having used both the IBClient and querying the localhost directly I am getting nothing back when using some of the fundamental endpoints, wondering if they maybe have been removed since this code was published?

For example:
https://localhost:5000/v1/api/iserver/fundamentals/{conid}/summary and ib_client.fundamentals_summary both return a summary for a chosen conid as expected.

However:
https://localhost:5000/v1/api/fundamentals/financials/{conid}?type=income&annual=true and ib_client.fundamentals_financials come back as "None" or "Resource not found".

Similarly for ib_client.fundamentals_key_ratios, ib_client.fundamentals_esg, ib_client.fundamentals_dividends, ib_client.data_analyst_forecast, nothing is returned.

I have tried removing and adding the "/iserver/" in the paths to see if maybe it is the wrong path but neither came back with anything. I have tried finding the endpoints by looking at the fundamentals data on my IB account and watching the requests, which are called out to "https://ndcdyn.interactivebrokers.com/tws.proxy/fundamentals/financials/{conid
}?annual=true&type=income" which matches above without the prefix.

Wondering if this is something others have experienced?

api for BONDS ?

Hi,
I am trying to get BONDS info using this api with no success:

  1. When preforming symbol_search for symbols I get items restricted as BONDS for example with symbol MNSB:
    Return object:
    [
    {...},
    {
    "issuers": [
    {
    "id": "e3298009",
    "name": "MainStreet Bank"
    }
    ],
    "conid": 2147483647,
    "companyHeader": "MainStreet Bank",
    "companyName": "None",
    "symbol": "MNSB",
    "description": "None",
    "restricted": "BOND",
    "fop": "None",
    "opt": "None",
    "war": "None",
    "sections": [
    {
    "secType": "BOND"
    }
    ]
    }
    ]

But I failed to use the object values to receive usable data about the bond. The conid: 2147483647 is the same one for all bonds in IB so no success..

  1. In TWS api - https://interactivebrokers.github.io/tws-api/basic_contracts.html#Bonds
    Bond api is documented but is not mentioned in the our limited api - https://interactivebrokers.com/api/doc.html
    I did try to use to get bonds info using the CONTRACT endpoint, for example using CUSIP as symbol (as mentioned in TWS api), but with no luck.

Am I missing something?
Appreciate any help I can get!

Thanks,
Ashi

COULD NOT CREATE A NEW SESSION THAT WAS AUTHENTICATED, EXITING SCRIPT.

Hi,

I've got the localhost client setup and authenticated with paper trading account:

Client login succeeds

But when I run the code, it fails:

from ibw.client import IBClient

# Create a new session of the IB Web API.
ib_client = IBClient(
    username='xxx',
    account='xxx',
)

# create a new session.
ib_client.create_session()

with this error:


COULD NOT CREATE A NEW SESSION THAT WAS AUTHENTICATED, EXITING SCRIPT.
Process finished with exit code 0

401 returned on portfolio_account_positions call

Hey,
First of all thanks a lot for the repo, it has helped me pickup the interactive apis quite well. I have an issue where by whenever i call portfolio_account_positions i always get a 401. I also get the same on portfolio_account_position. I am using the api_client that you wrote so it does call the account api before it makes this call. I have tried to simulate the same on swagger docs and i get the same response there too. There is nothing in the response body and nothing in the header that i can correct. Do you have any clue on how can this be fixed. Also, yeah i am authenticated. The account calls print an empty [] (array). I can get the market data after this call too.

Streaming Websocket Data

Hi Alex, Great lib, thank you for making this. After watching your video series, I'm trying to get continuous market data from IB Websocket API. I could able to connect to Client Portal gateway and also connection to websocket is successful, but I'm not able to subscribe to any quotes. Below is the code I used.

Any guidance on where I might be doing wrong/missing? Thank you.

# -*- coding: utf-8 -*-
import websocket, json
import ssl

web_socket_endpoint = "wss://localhost:5000/v1/portal/ws"

def logout(ws):
    print("close")
    ws.close()

def on_open(ws):
    print("opened")
    ws.send("s+md+59392609")

def on_message(ws, message):
    print("message recieved")
    try:
        print(message)
    except:
        print("JSON Decode Failed")

def on_close(ws):
    print("Connection Closed")
    

def on_error(ws, error):
    print("error")
    print(error)

try:
    websocket.enableTrace(True)
    WSCONNECTION = websocket.WebSocketApp(web_socket_endpoint,
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close)
    WSCONNECTION.on_open = on_open
    WSCONNECTION.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
except Exception as e:
    print(e)
    capture_exception(e)

issue "no module name IBW" error

Screen Shot 2020-12-20 at 9 53 17 AM

I'm trying to figure out the issue but having hard time. I have a IB account. I created the config. run java8 with brew (run in Mac).

any help?

Add sample run_scanner() call to test_client.py

Hi Alex, great library!

Been having HTTP 500 errors trying to call run_scanner - would you be able to add a test call into test_client.py?

All other test_client.py calls and get_scanner() seem to work for me.

I saw you had sample output available - hoping this isn't too much trouble!
Chuck


DEBUG
function: _make_request
endpoint: /iserver/scanner/run
req_type: POST
params: {'instrument': 'STK', 'type': 'TOP_PERC_GAIN', 'filter': [{'code': 'usdPriceAbove', 'value': 1}],
'location': 'STK.US.MAJOR', 'size': 25}

REQUEST - STATUS CODE: 500
RESPONSE URL: https://localhost:5000/v1/portal//iserver/scanner/run
RESPONSE HEADERS: {'Date': 'Sat, 02 May 2020 15:26:03 GMT', 'Server': 'Apache', 'x-response-time': '0ms', 'Vary': 'Origin', 'Connection': 'close', 'Transfer-Encoding': 'chunked'}
RESPONSE TEXT:

How to get "secType" for an order

How did you find the secType to use in your orders?
for example in the sample code, the secType is "secType": "362673777:FUT"

here's an example order
{
"conid": 362698833,
"secType": "362673777:FUT",
"cOID": "YOUR_CONTRACT_ORDER_ID",
"orderType": "MKT",
"side": "BUY",
"quantity": 1,
"tif": "DAY"
}

Implementing streaming market data

Hi,

Thank you for all the work you did on this API.

I've been following the YouTube videos, it seems like the API does not provide support for streaming data.

Could you explain how one might integrate streaming data with the existing functionality?

It would be nice to have a stream of market data, and for those using technical indicators, a bit of historical data to warm up the indicators that require more than 1 pricing data point.

Thank you!

news endpoint or conid in client is out of date

Hi,
Thank you for your work and sharing. I had a test script working yesterday but not today. It seemed the hard coded news endpoint was out of date so I replaced it with an account endpoint ...

line 202 - 204 - commented out

line 342 ...
try:
# news_resp = self.data_news(conid='265598')
accs = self.portfolio_accounts()
if len(accs) > 0:
self.authenticated = True

                    #  Log the response.
                    logging.debug('Had to do Account Update Response: {auth_resp}'.format(
                            auth_resp=accs
                        )
                    )
                    break

Unable to create session due to validation URL failing.

The following error is received when I am running the "ib_client.create_session()" call .. The authentication is successful and then some APIs are working fine if I try directly on the browser. For instance : https://localhost:5000/v1/api/iserver/scanner/params

What might have happened is that Interactive Brokers have stopped supporting the "fundamentals" api which was undocumented in the first place ?

_Would you like to make an authenticated request (Yes/No)? Yes


BAD REQUEST - STATUS CODE: 404
RESPONSE URL: https://localhost:5000/v1/portal/fundamentals/landing/265598?widgets=news&lang=en
RESPONSE HEADERS: {'Date': 'Sat, 07 Aug 2021 18:16:02 GMT', 'Server': 'Apache', 'x-response-time': '0ms', 'Content-Type': 'text/html;charset=utf-8', 'Vary': 'Origin', 'Keep-Alive': 'timeout=5, max=200', 'Connection': 'Keep-Alive', 'Transfer-Encoding': 'chunked'}
RESPONSE TEXT:

Resource not found


--------------------------------------------------------------------------------_

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.