GithubHelp home page GithubHelp logo

trentstauff / fxbot Goto Github PK

View Code? Open in Web Editor NEW
186.0 8.0 62.0 99 KB

A fully automated Forex trading bot utilizing the OANDA API.

Python 100.00%
finance forex trading trading-bot oanda-api-v20 trading-strategies algorithmic-trading python machine-learning bot

fxbot's Introduction

Codacy Badge PRs Welcome

Important:

This repo relies on submodules. To clone it properly, run:

git clone --recurse-submodules -j8 https://github.com/trentstauff/FXBot

FXBot

image

FXBot is just what you guessed- a Forex trading bot! It's been developed in Python, enabled by the OANDA V20 API.

This trading bot allows users to backtest and analyze their favourite strategies executed on the most popular currency pairs, while also enabling users to dive straight into trading these forex pairs in real-time, through algorithmic live trading.

As we all know, algorithmic trading is the future of finance. When looking at the top trading firms in the world, all of them are making a shift towards automated trading, and are investing heavily in the space. The ones who don't automate, are at risk of falling behind their competitors!

That's what inspired me to make this bot, and to expose to the public how really anyone this day and age can jump headfirst into the algorithmic trading world.

Disclaimer

Before downloading and using this bot, please make sure to understand the following:

Through OANDA, you do NOT need to trade real money, and the same is true with respect to using this bot. OANDA offers practice accounts, which this bot is highly recommended to utilize.

If you do decide to trade real money, this disclaimer is for you.

Understand the Risk

Trading Forex involves a risk of loss. Please consider carefully if such trading is appropriate for you. Past performance is not indicative of future results. FXBot has been created solely for educational purposes only and its calculations do not constitute investment recommendations or advice, and it is strongly recommended that you use this bot as a learning tool.

If you are to trade using this bot, understand that algorithmic trading involves a high level of risk and is not appropriate for everyone. No guarantee is being made that by using this bot, the algorithmic trading strategies will result in profitable trading or be free of risk of loss. There is a possibility that you could lose some or all of your investment.

What FXBot Can Do For You

When you first run FXBot, you will be prompted to enter the following:

  1. The currency pair you would like to analyze/trade
  2. Whether to conduct backtesting or live trading on said currency pair

image

Backtesting

Backtesting is a method for seeing how well a strategy would have performed on historical data. This powerful technique can gather a lot of important information about the strategy- such as when is the best time for the strategy to operate, which currency pairs it should execute on, and much more. If the strategy performs well during backtesting, then individuals can look into putting the strategy into a production environment and try to beat the market.

FXBot enables users to backtest their strategies, alongside giving flexibility and customization surrounding the parameters passed to the backtester.

When running the backtesting section of the bot, users will be prompted to specify the following:

  1. The strategy to backtest
  2. The date range the backtest should occur over
  3. Whether the strategy should consider trading costs
  4. The granularity for the backtest session (IE how often should the bot analyze the data and consider positions)?
  5. Values unique to the strategy (if these values are with respect to time, such as moving averages, the time unit is the same as your specified granularity)

Note: For Backtesting, here are the accepted granularity values you can choose from. You must enter a choice from this list. For live trading, please follow the on screen prompts to enter something along the lines of "1hr" or "30s". image

image

After entering this, the bot will go ahead and conduct the backtesting.

Not only will it test the user's specified parameter choices onto the currency pair, but the bot will also find the most optimal parameter values for that time period that allows for the highest ROI. This optimization gives critical information that can be further analyzed by the user to find the best values for their trading situation.

Finally, the bot will plot the results so that the user can tangibly see the performance of the strategy.

Live Trading

Once you believe you have found a good strategy and have optimized its unique parameters, you can jump into live trading.

Live trading is exactly how it sounds, it utilizes algorithmic, event-driven trading that allows the user to execute the strategy on data as it happens in real-time. This is where you can realize the full potential of your strategy and see how it performs against the market.

When running the live trading section of the bot, users will be prompted to specify the following:

  1. The strategy to backtest
  2. The date range the backtest should occur over
  3. The granularity for the trading session (IE how often should the bot analyze the data and consider positions)?
  4. The number of units to trade with (IE the size you want your positions to be)
  5. OPTIONAL: A "stop profit" to halt trading if you reach
  6. OPTIONAL: A "stop-loss" to halt trading if you go below
  7. Values unique to the strategy (if these values are with respect to time, such as moving averages, the time unit is the same as your specified granularity)

image

Once the bot is set up and ready to trade, the trading stream will open. For the duration of the session, the console will continuously output each "tick" of data that is being streamed back to the bot, which contains the time of the tick, the bid price, and the ask price.

Every "granularity", the bot will analyze the current market and determine if it should open, close, modify, or hold a position, which is based on the underlying strategy.

image

If any of the stop thresholds have been crossed, or if the user terminates the session, the bot will automatically exit all of its current positions, and the console will default back to the start, where the user can start over.

image

Current Strategies

How to Setup FXBot

You can start off by cloning the repo by running git clone --recurse-submodules -j8 https://github.com/trentstauff/FXBot

Requirements

First, you need to have at least a practice account with Oanda (https://oanda.com/). Once logged in, you must create an API token and copy your account number.

API Token

image

This green button will say "Generate". Click it, and copy the API Token. image

Navigate back to your account, so you can get your account number. image

Account Number

Click "Add Account". image

Make an account. Make sure to select 'v20 fxTrade' image

Once you have made an account, grab your account number. image

Now that you have an OANDA account and these values, you'll need to store them for the bot to use.

These values need to be put into a configuration file, with the name oanda.cfg, as follows:

(You can make it a .txt file first, type the data, and then rename the file to .cfg)

[oanda]
account_id = XYZ-ABC-...
access_token = ZYXCAB...
account_type = practice (default) or live

Place the oanda.cfg file into the same directory as the main.py file in the cloned repository folder.

After cloning the repo, run pip install -r requirements.txt to get the required packages.

Running the application

After installing the requirements, open a command prompt and you can start up the program by typing python main.py (python3 on Linux, if applicable) while in its directory.

Thats all! I hope that this bot helps you to see how awesome algorithmic trading can be.

If you need any help setting things up, feel free to email me at [email protected]

Have a good one!

fxbot's People

Contributors

trentscode avatar trentstauff 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

fxbot's Issues

Backtest Not run with SMA

Traceback (most recent call last):
File "main.py", line 214, in
trader = SMABacktest(instrument, start, end, smas, smal, granularity, trading_cost)
File "/root/FXBot/backtesting/SMABacktest.py", line 25, in init
super().init(
File "/root/FXBot/backtesting/Backtester.py", line 27, in init
self._data = self.acquire_data()
File "/root/FXBot/backtesting/Backtester.py", line 41, in acquire_data
df = oanda.get_history(
File "/root/FXBot/env/lib/python3.8/site-packages/tpqoa-0.0.55-py3.8.egg/tpqoa/tpqoa.py", line 241, in get_history
AttributeError: 'Index' object has no attribute 'tz_localize'

How long can the bot run

2022-04-18 23:41:35 python3 main.py //START

2022-04-19T21:32:01.787955976Z 1.07869 1.07906 //EXCEPTION OCCUR
Traceback (most recent call last):
File "/root/FXBot/env/lib/python3.8/site-packages/urllib3/response.py", line 700, in _update_chunk_length
self.chunk_left = int(line, 16)
ValueError: invalid literal for int() with base 16: b''

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/FXBot/env/lib/python3.8/site-packages/urllib3/response.py", line 441, in _error_catcher
yield
File "/root/FXBot/env/lib/python3.8/site-packages/urllib3/response.py", line 767, in read_chunked
self._update_chunk_length()
File "/root/FXBot/env/lib/python3.8/site-packages/urllib3/response.py", line 704, in _update_chunk_length
raise InvalidChunkLength(self, line)
urllib3.exceptions.InvalidChunkLength: InvalidChunkLength(got length b'', 0 bytes read)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/FXBot/env/lib/python3.8/site-packages/requests/models.py", line 760, in generate
for chunk in self.raw.stream(chunk_size, decode_content=True):
File "/root/FXBot/env/lib/python3.8/site-packages/urllib3/response.py", line 575, in stream
for line in self.read_chunked(amt, decode_content=decode_content):
File "/root/FXBot/env/lib/python3.8/site-packages/urllib3/response.py", line 796, in read_chunked
self._original_response.close()
File "/usr/lib/python3.8/contextlib.py", line 131, in exit
self.gen.throw(type, value, traceback)
File "/root/FXBot/env/lib/python3.8/site-packages/urllib3/response.py", line 458, in _error_catcher
raise ProtocolError("Connection broken: %r" % e, e)
urllib3.exceptions.ProtocolError: ("Connection broken: InvalidChunkLength(got length b'', 0 bytes read)", InvalidChunkLength(got length b'', 0 bytes read))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/root/FXBot/env/lib/python3.8/site-packages/v20/response.py", line 52, in parts
for line in self.lines:
File "/root/FXBot/env/lib/python3.8/site-packages/requests/models.py", line 804, in iter_lines
for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode):
File "/root/FXBot/env/lib/python3.8/site-packages/requests/models.py", line 763, in generate
raise ChunkedEncodingError(e)
requests.exceptions.ChunkedEncodingError: ("Connection broken: InvalidChunkLength(got length b'', 0 bytes read)", InvalidChunkLength(got length b'', 0 bytes read))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "main.py", line 114, in
trader = SMALive(cfg, instrument, granularity, smas, smal, units, stop_loss=stop_loss, stop_profit=stop_profit)
File "/root/FXBot/livetrading/SMALive.py", line 37, in init
super().init(
File "/root/FXBot/livetrading/LiveTrader.py", line 77, in init
self.stream_data(self._instrument)
File "/root/FXBot/env/lib/python3.8/site-packages/tpqoa-0.0.55-py3.8.egg/tpqoa/tpqoa.py", line 346, in stream_data
File "/root/FXBot/env/lib/python3.8/site-packages/v20/response.py", line 57, in parts
raise V20ConnectionError(self.path)
v20.errors.V20ConnectionError: Connection to v20 REST server at https://stream-fxpractice.oanda.com:443/v3/accounts/101-001-22097154-002/pricing/stream?instruments=EUR_USD&snapshot=True failed
2022-04-19T21:32:46.993264831Z : 0 --- 50.0 units, price of $1.07906, profit of $-0.0225, cum profit of $-0.1805

AttributeError: 'SMALive' object has no attribute '_position'

Markets are open, beginning trading session.


C:...\forexbot\venv\lib\site-packages\pandas\core\tools\timedeltas.py:132: FutureWarning: Units 'M', 'Y' and 'y' do not represent unambiguous timedelta values and will be removed in a future version
return _coerce_scalar_to_timedelta_type(arg, unit=unit, errors=errors)
Traceback (most recent call last):
File "C:...\forexbot\FXBot\main.py", line 114, in
trader = SMALive(cfg, instrument, granularity, smas, smal, units, stop_loss=stop_loss, stop_profit=stop_profit)
File "C:...\forexbot\FXBot\livetrading\SMALive.py", line 37, in init
super().init(
File "C:...\forexbot\FXBot\livetrading\LiveTrader.py", line 52, in init
self._bar_length = pd.to_timedelta(bar_length)
File "C:...\forexbot\venv\lib\site-packages\pandas\core\tools\timedeltas.py", line 132, in to_timedelta
return _coerce_scalar_to_timedelta_type(arg, unit=unit, errors=errors)
File "C:...\forexbot\venv\lib\site-packages\pandas\core\tools\timedeltas.py", line 138, in _coerce_scalar_to_timedelta_type
result = Timedelta(r, unit)
File "pandas_libs\tslibs\timedeltas.pyx", line 1194, in pandas._libs.tslibs.timedeltas.Timedelta.new
File "pandas_libs\tslibs\timedeltas.pyx", line 335, in pandas._libs.tslibs.timedeltas.parse_timedelta_string
File "pandas_libs\tslibs\timedeltas.pyx", line 490, in pandas._libs.tslibs.timedeltas.timedelta_from_spec
ValueError: could not convert string to float: '.'
Exception ignored in: <function LiveTrader.del at 0x00000110BDFCB9D0>
Traceback (most recent call last):
File "C:...\forexbot\FXBot\livetrading\LiveTrader.py", line 82, in del
self.close_position()
File "C:...\forexbot\FXBot\livetrading\LiveTrader.py", line 257, in close_position
if self._position != 0:
AttributeError: 'SMALive' object has no attribute '_position'

Process finished with exit code 1


Hope anyone can help me with this error code?

AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?

getting the following error: Traceback (most recent call last):
File "C:\Users\Administrator\GitHub\FXBot-main\FXBot-main\main.py", line 143, in
trader = BollingerBandsLive(cfg, instrument, granularity, sma, deviation, units, stop_loss=stop_loss,
File "C:\Users\Administrator\GitHub\FXBot-main\FXBot-main\livetrading\BollingerBandsLive.py", line 37, in init
super().init(
File "C:\Users\Administrator\GitHub\FXBot-main\FXBot-main\livetrading\LiveTrader.py", line 77, in init
self.stream_data(self._instrument)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\site-packages\tpqoa\tpqoa.py", line 357, in stream_data
self.on_success(msg.time,
File "C:\Users\Administrator\GitHub\FXBot-main\FXBot-main\livetrading\LiveTrader.py", line 181, in on_success
self._tick_data = self._tick_data.append(df)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\core\generic.py", line 5989, in getattr
return object.getattribute(self, name)
AttributeError: 'DataFrame' object has no attribute 'append'. Did you mean: '_append'?

AttributeError: module 'tpqoa' has no attribute 'tpqoa'

It's show this error when I try to run the main.py
Traceback (most recent call last):
File "main.py", line 4, in
from livetrading.BollingerBandsLive import BollingerBandsLive
File "/root/FXBot/livetrading/BollingerBandsLive.py", line 3, in
from livetrading.LiveTrader import LiveTrader
File "/root/FXBot/livetrading/LiveTrader.py", line 12, in
class LiveTrader(tpqoa.tpqoa):
AttributeError: module 'tpqoa' has no attribute 'tpqoa'

AttributeError: 'BollingerBandsLive' object has no attribute '_position'

i been getting this issue all day. everything was fine last night.

Traceback (most recent call last):
File "C:\Users\BNard\Documents\GitHub\FXBot-main\FXBot-main\main.py", line 143, in
trader = BollingerBandsLive(cfg, instrument, granularity, sma, deviation, units, stop_loss=stop_loss,
File "C:\Users\BNard\Documents\GitHub\FXBot-main\FXBot-main\livetrading\BollingerBandsLive.py", line 37, in init
super().init(
File "C:\Users\BNard\Documents\GitHub\FXBot-main\FXBot-main\livetrading\LiveTrader.py", line 45, in init
raise Exception("Sorry, markets are closed")
Exception: Sorry, markets are closed
Exception ignored in: <function LiveTrader.del at 0x00000242455913F0>
Traceback (most recent call last):
File "C:\Users\BNard\Documents\GitHub\FXBot-main\FXBot-main\livetrading\LiveTrader.py", line 82, in del
self.close_position()
File "C:\Users\BNard\Documents\GitHub\FXBot-main\FXBot-main\livetrading\LiveTrader.py", line 257, in close_position
if self._position != 0:
AttributeError: 'BollingerBandsLive' object has no attribute '_position'

Bot crash on trade creation (Pandas iloc)

When the bot tries to open a position, a crash occurs with the following traceback:

  File "/home/user/FXBot/main.py", line 139, in <module>
    trader = MomentumLive(cfg, instrument, granularity, window, units, stop_loss=stop_loss,
  File "/home/user/FXBot/livetrading/MomentumLive.py", line 34, in __init__
    super().__init__(
  File "/home/user/FXBot/livetrading/LiveTrader.py", line 77, in __init__
    self.stream_data(self._instrument)
  File "/home/user/.local/lib/python3.9/site-packages/tpqoa/tpqoa.py", line 357, in stream_data
    self.on_success(msg.time,
  File "/home/user/FXBot/livetrading/LiveTrader.py", line 199, in on_success
    self.trade()
  File "/home/user/FXBot/livetrading/LiveTrader.py", line 206, in trade
    if self._data["position"].iloc[-1] == 1:
  File "/home/user/.local/lib/python3.9/site-packages/pandas/core/indexing.py", line 895, in __getitem__
    return self._getitem_axis(maybe_callable, axis=axis)
  File "/home/user/.local/lib/python3.9/site-packages/pandas/core/indexing.py", line 1501, in _getitem_axis
    self._validate_integer(key, axis)
  File "/home/user/.local/lib/python3.9/site-packages/pandas/core/indexing.py", line 1444, in _validate_integer
    raise IndexError("single positional indexer is out-of-bounds")
IndexError: single positional indexer is out-of-bounds

index.html

<title>Forex Trading Signal Bot</title> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <style> body { font-family: Arial, sans-serif; background-color: #f4f4f4; margin: 0; padding: 20px; } .container { max-width: 800px; margin: auto; background: #fff; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); border-radius: 8px; } h1 { text-align: center; color: #333; } .chart-container { position: relative; height: 400px; width: 100%; } .analysis { margin-top: 20px; } .analysis p { font-size: 1.1em; } .chat-container { margin-top: 20px; border-top: 1px solid #ddd; padding-top: 20px; } .chat-input { display: flex; padding: 10px; border-top: 1px solid #ddd; } .chat-input input { flex: 1; padding: 10px; border: 1px solid #ddd; border-radius: 4px; margin-right: 10px; } .chat-input button { padding: 10px 20px; border: none; background: #007bff; color: #fff; border-radius: 4px; cursor: pointer; } .chat-input button:hover { background: #0056b3; } .chat-messages { padding: 20px; height: 200px; overflow-y: auto; border: 1px solid #ddd; border-radius: 4px; background: #fff; margin-bottom: 20px; } .message { margin-bottom: 10px; } .message.user { text-align: right; } .message.bot { text-align: left; } .message p { display: inline-block; padding: 10px; border-radius: 4px; max-width: 80%; } .message.user p { background: #007bff; color: #fff; } .message.bot p { background: #f1f1f1; color: #333; } </style>

Forex Trading Signal Bot

Market Analysis

Loading data...

Ask the Bot

Send
<script>
    // Simulated data for demonstration
    const forexData = {
        labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul"],
        prices: [1.2, 1.25, 1.23, 1.27, 1.3, 1.28, 1.32]
    };

    // Create chart
    const ctx = document.getElementById('forexChart').getContext('2d');
    const forexChart = new Chart(ctx, {
        type: 'line',
        data: {
            labels: forexData.labels,
            datasets: [{
                label: 'EUR/USD',
                data: forexData.prices,
                borderColor: 'rgba(75, 192, 192, 1)',
                borderWidth: 2,
                fill: false
            }]
        },
        options: {
            scales: {
                y: {
                    beginAtZero: false
                }
            }
        }
    });

    // Simple analysis function
    function analyzeMarket(data) {
        const movingAverage = data.prices.reduce((sum, price) => sum + price, 0) / data.prices.length;
        const lastPrice = data.prices[data.prices.length - 1];

        if (lastPrice > movingAverage) {
            return "The market trend is upward. Consider buying.";
        } else {
            return "The market trend is downward. Consider selling.";
        }
    }

    // Display analysis
    document.getElementById('analysis').querySelector('p').innerText = analyzeMarket(forexData);

    // Chat functionality
    function sendMessage() {
        var inputField = document.getElementById('user-input');
        var message = inputField.value.trim();
        if (message === '') return;

        // Display user message
        var userMessage = document.createElement('div');
        userMessage.className = 'message user';
        userMessage.innerHTML = '<p>' + message + '</p>';
        document.getElementById('chat-messages').appendChild(userMessage);
        inputField.value = '';

        // Scroll to the bottom
        var chatMessages = document.getElementById('chat-messages');
        chatMessages.scrollTop = chatMessages.scrollHeight;

        // Simulate bot response
        setTimeout(function() {
            var botMessage = document.createElement('div');
            botMessage.className = 'message bot';
            botMessage.innerHTML = '<p>' + getBotResponse(message) + '</p>';
            document.getElementById('chat-messages').appendChild(botMessage);

            // Scroll to the bottom
            chatMessages.scrollTop = chatMessages.scrollHeight;
        }, 1000);
    }

    function getBotResponse(message) {
        // Simple simulated responses for demonstration
        const analysis = analyzeMarket(forexData);
        var responses = {
            "apa itu forex": "Forex adalah pasar global untuk memperdagangkan mata uang.",
            "bagaimana cara trading forex": "Anda bisa mulai dengan membuka akun di broker forex dan belajar analisis teknikal serta fundamental.",
            "apa itu leverage": "Leverage adalah pinjaman yang diberikan oleh broker kepada trader untuk meningkatkan potensi keuntungan.",
            "strategi trading terbaik": "Tidak ada strategi terbaik yang cocok untuk semua orang. Cobalah beberapa strategi seperti scalping, day trading, dan swing trading.",
            "apa analisa pasar saat ini": analysis
        };
        return responses[message.toLowerCase()] || "Maaf, saya tidak mengerti pertanyaan Anda. Bisa dijelaskan lebih detail?";
    }
</script>

v20.errors.ResponseNoField: 400 response for GET

File "....\forexbot\venv\lib\site-packages\tpqoa-0.0.55-py3.9.egg\tpqoa\tpqoa.py", line 238, in get_history
File "....\forexbot\venv\lib\site-packages\tpqoa-0.0.55-py3.9.egg\tpqoa\tpqoa.py", line 167, in retrieve_data
File "....\forexbot\venv\lib\site-packages\v20\response.py", line 35, in get
raise ResponseNoField(self, field)
v20.errors.ResponseNoField: 400 response for GET https://api-fxpractice.oanda.com:443/v3/instruments/EUR_USD/candles?price=M&granularity=1h&from=2022-01-01T00%3A00%3A00.000000000Z&to=2022-01-07T00%3A00%3A00.000000000Z does not have field 'candles' (contains 'errorMessage')

Any ideas what causes this error message?

Cache historical data and last test parameter

While I was playing with the backtesting, I had to re-enter all the parameters every time. In addition, the historical data was not saved, which meant that it had to be downloaded again each time.

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.