All Projects → darwinex → Dwx Zeromq Connector

darwinex / Dwx Zeromq Connector

Licence: bsd-3-clause
Wrapper library for algorithmic trading in Python 3, providing DMA/STP access to Darwinex liquidity via a ZeroMQ-enabled MetaTrader Bridge EA.

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Dwx Zeromq Connector

Spectre
GPU-accelerated Factors analysis library and Backtester
Stars: ✭ 157 (-30.53%)
Mutual labels:  algorithmic-trading
Chumak
Pure Erlang implementation of ZeroMQ Message Transport Protocol.
Stars: ✭ 167 (-26.11%)
Mutual labels:  zeromq
Mlfinlab
MlFinLab helps portfolio managers and traders who want to leverage the power of machine learning by providing reproducible, interpretable, and easy to use tools.
Stars: ✭ 2,676 (+1084.07%)
Mutual labels:  algorithmic-trading
Salt
Software to automate the management and configuration of any infrastructure or application at scale. Get access to the Salt software package repository here:
Stars: ✭ 12,086 (+5247.79%)
Mutual labels:  zeromq
Fedmsg
Federated Messaging with ZeroMQ
Stars: ✭ 165 (-26.99%)
Mutual labels:  zeromq
Catalyst
An Algorithmic Trading Library for Crypto-Assets in Python
Stars: ✭ 2,311 (+922.57%)
Mutual labels:  algorithmic-trading
Pyportfolioopt
Financial portfolio optimisation in python, including classical efficient frontier, Black-Litterman, Hierarchical Risk Parity
Stars: ✭ 2,502 (+1007.08%)
Mutual labels:  algorithmic-trading
Reddit Hyped Stocks
A web application to explore currently hyped stocks on Reddit
Stars: ✭ 173 (-23.45%)
Mutual labels:  algorithmic-trading
Mixture model trading public
Stars: ✭ 166 (-26.55%)
Mutual labels:  algorithmic-trading
Netmq
A 100% native C# implementation of ZeroMQ for .NET
Stars: ✭ 2,366 (+946.9%)
Mutual labels:  zeromq
Algorithmictrading
This repository contains three ways to obtain arbitrage which are Dual Listing, Options and Statistical Arbitrage. These are projects in collaboration with Optiver and have been peer-reviewed by staff members of Optiver.
Stars: ✭ 157 (-30.53%)
Mutual labels:  algorithmic-trading
Stock.indicators
Stock indicator technical analysis library package for .NET. Send in historical price quotes and get back desired technical indicators. Nothing more. It can be used in any market analysis software using standard OHLCV price quotes for equities, commodities, forex, cryptocurrencies, and others. We had private trading algorithms, machine learning, and charting systems in mind when originally creating this community library. Current indicators include: Accumulation/Distribution Line (ADL), Aroon Oscillator, Arnaud Legoux Moving Average (ALMA), Average Directional Index (ADX), Average True Range (ATR), Awesome Oscillator (AO), Balance of Power (BOP), Beta Coefficient, Bollinger Bands®, Chaikin Money Flow (CMF), Chaikin Oscillator, Chandelier Exit, Choppiness Index (CHOP), Commodity Channel Index (CCI), ConnorsRSI, Correlation Coefficient, Donchian Channels, Double Exponential Moving Average (DEMA), Elder-ray Index, Exponential Moving Average (EMA), Force Index, Fractal Chaos Bands (FCB), Gator Oscillator, Heikin-Ashi, Hull Moving Average (HMA), Ichimoku Cloud, Kaufman's Adaptive Moving Average (KAMA), KDJ Index, Keltner Channels, Momentum Oscillator, Money Flow Index (MFI), MESA Adaptive Moving Averages (MAMA), Moving Average Convergence/Divergence (MACD), Moving Average Envelopes, On-balance Volume (OBV), Parabolic SAR (stop and reverse), Percentage Volume Oscillator (PVO), Pivot Points and Rolling Pivot Points, Price Channels, Price (Comparative) Relative Strength (PRS), Price Momentum Oscillator (PMO), Rate of Change (ROC), Relative Strength Index (RSI), R-Squared (Coefficient of Determination), Simple Moving Average (SMA), Slope and Linear Regression, Smoothed Moving Average (SMMA), Standard Deviation, Stoller Average Range Channel (STARC) Bands, Stochastic Oscillator, Stochastic RSI, SuperTrend, Tillson T3 Moving Average, Triple Exponential Moving Average (TEMA), Triple EMA Oscillator (TRIX), True Strength Index (TSI), Ulcer Index, Ultimate Oscillator, Volume Simple Moving Average, Volume Weighted Average Price (VWAP), Vortex Indicator (VI), Weighted Moving Average (WMA), Williams %R, Williams Alligator, Williams Fractal, and Zig Zag.
Stars: ✭ 157 (-30.53%)
Mutual labels:  algorithmic-trading
Zmq4
[WIP] Pure-Go implementation of ZeroMQ-4
Stars: ✭ 181 (-19.91%)
Mutual labels:  zeromq
Unity3d Python Communication
⚡️ A very fast, simple, and general inter-process communication example between Unity3D C# and Python, using ZeroMQ
Stars: ✭ 157 (-30.53%)
Mutual labels:  zeromq
Tradingview Data Scraper
Extract price and indicator data from TradingView charts to create ML datasets
Stars: ✭ 203 (-10.18%)
Mutual labels:  algorithmic-trading
Eiten
Statistical and Algorithmic Investing Strategies for Everyone
Stars: ✭ 2,197 (+872.12%)
Mutual labels:  algorithmic-trading
Paperbroker
An open source simulated options brokerage and UI for paper trading, algorithmic interfaces and backtesting.
Stars: ✭ 173 (-23.45%)
Mutual labels:  algorithmic-trading
Devalpha Node
A stream-based approach to algorithmic trading and backtesting in Node.js
Stars: ✭ 217 (-3.98%)
Mutual labels:  algorithmic-trading
Zipline
Zipline, a Pythonic Algorithmic Trading Library
Stars: ✭ 14,712 (+6409.73%)
Mutual labels:  algorithmic-trading
Trading Server
A multi-asset, multi-strategy, event-driven trade execution and management platform for running many algorithms/bots at many venues simultaneously with unified risk management and reporting. Uses MongoDB for storage and Telegram for user notifications/trade consent.
Stars: ✭ 191 (-15.49%)
Mutual labels:  algorithmic-trading

DWX ZeroMQ Connector { Python 3 to MetaTrader 4 }

Latest version: 2.0.1 (here)

(v2.0.2 is currently in beta-testing, please do not upgrade to v2.0.2)

Need help? Join the Darwinex Collective Slack for code updates, Q&A and more.

About Darwinex

Darwinex is a UK FCA-Regulated broker & technology provider, enabling traders to:

  1. Trade the markets on the best terms and competitive execution conditions
  2. Develop their trading skills and build verifiable, investable track records
  3. Provide regulatory cover to attract capital and charge a 20% performance fee on investor profits

Please take a moment to read our Risk Disclosure here

Click here to visit our Trader Hall of Fame * ranked by Performance Fees earned (over 2M EUR paid to date)

Click here to Open a Darwinex Trading Account

Table of Contents

Introduction

In this project, we present a technique employing ZeroMQ (an Open Source, Asynchronous Messaging Library and Concurrency Framework) for building a basic – but easily extensible – high performance bridge between external (non-MQL) programming languages and MetaTrader 4.

IMPORTANT NOTES - PLEASE READ:

  1. Please note that we cannot provide support for Python or MQL as programming languages themselves. Therefore, if you are new to Python and MQL, incorporating the project into your specific algorithmic trading environment will require some additional work on your part (i.e. enough Python experience to integrate the Bridge into your environment -> it is assumed that users of the Bridge are self-sufficient in Python).

  2. Any code provided and/or referenced in this repository is NOT meant to be used "as-is". Users must treat all code as educational content that requires modification / incorporation into existing works, as per their individual requirements.

  3. We have drafted as detailed a set of steps as possible in our project README, but cannot cover all the dependencies as they are independent projects on their own that programmers need to account for / follow / keep up to speed with when considering using the DWX ZeroMQ Connector.

  4. This project and all accompanying source code should be run standalone (i.g. via a Python or IPython console, or batch process).

  5. Please DO NOT run this code in Jupyter or IPython Notebooks.

  6. The project's dependencies require MS VC++ Libraries. Without these installed, you are likely to run into "Resource Timeout" errors. The DLLs in the dependency projects (mql-zmq, libzmq, libsodium) require that you have the latest Visual C++ runtime (2015) libraries already installed.

  7. This project has not been tested on emulated environments (e.g. WINE, VMWare, etc).

  8. This project is intended for use solely in Windows 10 environments, at the present time.

Reasons for writing this post:

  • Lack of comprehensive, publicly available literature about this topic on the web.
  • Traders have traditionally relied on Winsock/WinAPI based solutions that often require revision with both Microsoft™ and MetaQuotes™ updates.
  • Alternatives to ZeroMQ include named pipes, and approaches where filesystem-dependent functionality forms the bridge between MetaTrader and external languages.

We lay the foundation for a distributed trading system that will:

  • Consist of one or more trading strategies developed outside MetaTrader 4 (non-MQL),
  • Use MetaTrader 4 for acquiring market data, trade execution and management,
  • Support multiple non-MQL strategies interfacing with MetaTrader 4 simultaneously,
  • Consider each trading strategy as an independent “Client”,
  • Consider MetaTrader 4 as the “Server”, and medium to market,
  • Permit both Server and Clients to communicate with each other on-demand.

Infographic: ZeroMQ-Enabled Distributed Trading Infrastructure (with MetaTrader 4) DWX ZMQ Infographic 1

Why ZeroMQ?

  • Enables programmers to connect any code to any other code, in a number of ways.
  • Eliminates a MetaTrader user’s dependency on just MetaTrader-supported technology (features, indicators, language constructs, libraries, etc.)
  • Traders can develop indicators and strategies in C/C#/C++, Python, R and Java (to name a few), and deploy to market via MetaTrader 4.
  • Leverage machine learning toolkits in Python and R for complex data analysis and strategy development, while interfacing with MetaTrader 4 for trade execution and management.
  • ZeroMQ can be used as a high-performance transport layer in sophisticated, distributed trading systems otherwise difficult to implement in MQL.
  • Different strategy components can be built in different languages if required, and seamlessly talk to each other over TCP, in-process, inter-process or multicast protocols.
  • Multiple communication patterns and disconnected operation.

Installation

This project requires the following:

You may install Python-specific dependencies either via pip install -r ./v2.0.1/python/api/requirements.txt or via installing the latest Anaconda distribution (Python 3 variants).

For your convenience, files from the last three items above have been included in this repository with appropriate copyrights referenced within.

This project incorporates functionality authored by Ding Li (GitHub: https://github.com/dingmaotu), who has kindly licensed his work under the Apache 2.0 license.

We acknowledge copyright as per the terms of the license, the following repositories serving as mandatory dependencies for this project:

  1. https://github.com/dingmaotu/mql-zmq

  2. https://github.com/dingmaotu/mql4-lib

Thank you Ding for your amazing open source contribution to this space!

Sincerely,
The Darwinex Labs Team
www.darwinex.com

Steps:

  1. Download and unzip mql-zmq-master.zip (by GitHub author @dingmaotu)
  2. Copy the contents of mql-zmq-master/Include/Mql and mql-zmq-master/Include/Zmq into your MetaTrader installation's MQL4/Include directory as-is. Your MQL4/Include directory should now have two additional folders "Mql" and "Zmq".
  3. Copy libsodium.dll and libzmq.dll from mql-zmq-master/Library/MT4 to your MetaTrader installation's MQL4/Libraries directory.
  4. Download DWX_ZeroMQ_Server_vX.Y.Z_RCx.mq4 and place it inside your MetaTrader installation's MQL4/Experts directory.
  5. Finally, download vX.Y.Z / python / api / DWX_ZeroMQ_Connector_vX_Y_Z_RCx.py.

Note: vX_Y_Z_RCx refers to version and release candidate, e.g. v2.0.1_RC8.

Configuration

  1. After completing the steps above, terminate and restart MetaTrader 4.

  2. Open any new chart, e.g. EUR/USD M, then drag and drop DWX_ZeroMQ_Server_vX.Y.Z_RCx.

  3. Switch to the EA's Inputs tab and customize values as necessary:

    EA Inputs

  4. Note: Setting Publish_MarketData to True will cause MetaTrader 4 to begin publishing BID/ASK tick data in real-time for all symbols specified in the array Publish_Symbols contained in the .mq4 script.

  5. Simply modify the Publish_Symbols[] aarray's contents to add/remove required symbols as necessary and re-compile.

  6. The default list of symbols is:

    string Publish_Symbols[7] = {
       "EURUSD","GBPUSD","USDJPY","USDCAD","AUDUSD","NZDUSD","USDCHF"
    };
    

    MetaTrader Publishing Tick Data 1

    MetaTrader Publishing Tick Data 2

Example Usage

Initialize Connector:

_zmq = DWX_ZeroMQ_Connector()

Construct Trade to send via ZeroMQ to MetaTrader:

_my_trade = _zmq._generate_default_order_dict()

Output: 
{'_action': 'OPEN',
 '_type': 0,
 '_symbol': 'EURUSD',
 '_price': 0.0,
 '_SL': 500,
 '_TP': 500,
 '_comment': 'DWX_Python_to_MT',
 '_lots': 0.01,
 '_magic': 123456,
 '_ticket': 0}

_my_trade['_lots'] = 0.05

_my_trade['_SL'] = 250

_my_trade['_TP'] = 750

_my_trade['_comment'] = 'nerds_rox0r'

Send trade to MetaTrader:

_zmq._DWX_MTX_NEW_TRADE_(_order=_my_trade)

# MetaTrader response (JSON):
{'_action': 'EXECUTION', 
'_magic': 123456, 
'_ticket': 85051741, 
'_open_price': 1.14414, 
'_sl': 250, 
'_tp': 750}

Get all open trades from MetaTrader:

_zmq._DWX_MTX_GET_ALL_OPEN_TRADES_()

# MetaTrader response (JSON):

{'_action': 'OPEN_TRADES', 
'_trades': {
    85051741: {'_magic': 123456, 
                '_symbol': 'EURUSD', 
                '_lots': 0.05, 
                '_type': 0, 
                '_open_price': 1.14414, 
                '_pnl': -0.45}
    }
}

Partially close 0.01 lots:

_zmq._DWX_MTX_CLOSE_PARTIAL_BY_TICKET_(85051741, 0.01)

# MetaTrader response (JSON):
{'_action': 'CLOSE', 
'_ticket': 85051741, 
'_response': 'CLOSE_PARTIAL', 
'_close_price': 1.14401, 
'_close_lots': 0.01}

# Partially closing a trade renews the ticket ID, retrieve it again.

_zmq._DWX_MTX_GET_ALL_OPEN_TRADES_()

# MetaTrader response (JSON):
{'_action': 'OPEN_TRADES', 
'_trades': {
    85051856: {'_magic': 123456, 
                '_symbol': 'EURUSD', 
                '_lots': 0.04, 
                '_type': 0, 
                '_open_price': 1.14414, 
                '_pnl': -0.36}
    }
}

Close a trade by ticket:

_zmq._DWX_MTX_CLOSE_TRADE_BY_TICKET_(85051856)

# MetaTrader response (JSON):
{'_action': 'CLOSE', 
'_ticket': 85051856, 
'_close_price': 1.14378, 
'_close_lots': 0.04, 
'_response': 'CLOSE_MARKET', 
'_response_value': 'SUCCESS'}

Close all trades by Magic Number:

# Before running the following example, 5 trades were executed using the same values as in "_my_trade" above, the magic number being 123456.

# Check currently open trades.

_zmq._DWX_MTX_GET_ALL_OPEN_TRADES_()

# MetaTrader response (JSON):
{'_action': 'OPEN_TRADES', 
    '_trades': {
        85052022: {'_magic': 123456, '_symbol': 'EURUSD', '_lots': 0.05, '_type': 0, '_open_price': 1.14353, '_pnl': 1.15}, 
        85052026: {'_magic': 123456, '_symbol': 'EURUSD', '_lots': 0.05, '_type': 0, '_open_price': 1.14354, '_pnl': 1.1}, 
        85052025: {'_magic': 123456, '_symbol': 'EURUSD', '_lots': 0.05, '_type': 0, '_open_price': 1.14354, '_pnl': 1.1}, 
        85052024: {'_magic': 123456, '_symbol': 'EURUSD', '_lots': 0.05, '_type': 0, '_open_price': 1.14354, '_pnl': 1.1}, 
        85052023: {'_magic': 123456, '_symbol': 'EURUSD', '_lots': 0.05, '_type': 0, '_open_price': 1.14356, '_pnl': 1}
    }
}

# Close all trades with magic number 123456
_zmq._DWX_MTX_CLOSE_TRADES_BY_MAGIC_(123456)

# MetaTrader response (JSON):
{'_action': 'CLOSE_ALL_MAGIC', '_magic': 123456, 
'_responses': {
    85052026: {'_symbol': 'EURUSD', '_close_price': 1.14375, '_close_lots': 0.05, '_response': 'CLOSE_MARKET'}, 
    85052025: {'_symbol': 'EURUSD', '_close_price': 1.14375, '_close_lots': 0.05, '_response': 'CLOSE_MARKET'}, 
    85052024: {'_symbol': 'EURUSD', '_close_price': 1.14375, '_close_lots': 0.05, '_response': 'CLOSE_MARKET'}, 
    85052023: {'_symbol': 'EURUSD', '_close_price': 1.14375, '_close_lots': 0.05, '_response': 'CLOSE_MARKET'}, 
    85052022: {'_symbol': 'EURUSD', '_close_price': 1.14375, '_close_lots': 0.05, '_response': 'CLOSE_MARKET'}}, 
'_response_value': 'SUCCESS'}

Close ALL open trades:


# Open 5 trades

_zmq._DWX_MTX_NEW_TRADE_()
{'_action': 'EXECUTION', '_magic': 123456, '_ticket': 85090920, '_open_price': 1.15379, '_sl': 500, '_tp': 500}

_zmq._DWX_MTX_NEW_TRADE_()
{'_action': 'EXECUTION', '_magic': 123456, '_ticket': 85090921, '_open_price': 1.15379, '_sl': 500, '_tp': 500}

_zmq._DWX_MTX_NEW_TRADE_()
{'_action': 'EXECUTION', '_magic': 123456, '_ticket': 85090922, '_open_price': 1.15375, '_sl': 500, '_tp': 500}

_zmq._DWX_MTX_NEW_TRADE_()
{'_action': 'EXECUTION', '_magic': 123456, '_ticket': 85090926, '_open_price': 1.15378, '_sl': 500, '_tp': 500}

_zmq._DWX_MTX_NEW_TRADE_()
{'_action': 'EXECUTION', '_magic': 123456, '_ticket': 85090927, '_open_price': 1.15378, '_sl': 500, '_tp': 500}

# Close all open trades
_zmq._DWX_MTX_CLOSE_ALL_TRADES_()

# MetaTrader response (JSON):
{'_action': 'CLOSE_ALL',
 '_responses': {85090927: {'_symbol': 'EURUSD',
   '_magic': 123456,
   '_close_price': 1.1537,
   '_close_lots': 0.01,
   '_response': 'CLOSE_MARKET'},
  85090926: {'_symbol': 'EURUSD',
   '_magic': 123456,
   '_close_price': 1.1537,
   '_close_lots': 0.01,
   '_response': 'CLOSE_MARKET'},
  85090922: {'_symbol': 'EURUSD',
   '_magic': 123456,
   '_close_price': 1.1537,
   '_close_lots': 0.01,
   '_response': 'CLOSE_MARKET'},
  85090921: {'_symbol': 'EURUSD',
   '_magic': 123456,
   '_close_price': 1.15369,
   '_close_lots': 0.01,
   '_response': 'CLOSE_MARKET'},
  85090920: {'_symbol': 'EURUSD',
   '_magic': 123456,
   '_close_price': 1.15369,
   '_close_lots': 0.01,
   '_response': 'CLOSE_MARKET'}},
 '_response_value': 'SUCCESS'}

Subscribe/Unsubscribe to/from EUR/USD bid/ask prices in real-time:

_zmq._DWX_MTX_SUBSCRIBE_MARKETDATA_('EURUSD')

Output:
[KERNEL] Subscribed to EURUSD BID/ASK updates. See self._Market_Data_DB.

# BID/ASK prices are now being streamed into _zmq._Market_Data_DB.
_zmq._Market_Data_DB

Output: 
{'EURUSD': {
  '2019-01-08 13:46:49.157431': (1.14389, 1.14392),
  '2019-01-08 13:46:50.673151': (1.14389, 1.14393),
  '2019-01-08 13:46:51.010993': (1.14392, 1.14395),
  '2019-01-08 13:46:51.100941': (1.14394, 1.14398),
  '2019-01-08 13:46:51.205881': (1.14395, 1.14398),
  '2019-01-08 13:46:52.283107': (1.14394, 1.14397),
  '2019-01-08 13:46:52.377055': (1.14395, 1.14398),
  '2019-01-08 13:46:52.777823': (1.14394, 1.14398),
  '2019-01-08 13:46:52.870773': (1.14395, 1.14398),
  '2019-01-08 13:46:52.985708': (1.14395, 1.14397),
  '2019-01-08 13:46:53.080652': (1.14393, 1.14397),
  '2019-01-08 13:46:53.196584': (1.14394, 1.14398),
  '2019-01-08 13:46:53.294541': (1.14393, 1.14397)}}

_zmq._DWX_MTX_UNSUBSCRIBE_MARKETDATA('EURUSD')

Output:
**
[KERNEL] Unsubscribing from EURUSD
**

Video Tutorials

Step-by-Step Installation & Configuration Tutorials

  1. Introduction

  2. Dependencies

  3. MetaTrader 4 Setup

  4. Programming Environment Setup

  5. ZeroMQ Client Configuration

  6. ZeroMQ Server Configuration

  7. Example Usage

The nuts & bolts of the DWX ZeroMQ Connector project

  1. How to Interface Python/R Trading Strategies with MetaTrader 4

  2. Algorithmic Trading via ZeroMQ: Trade Execution, Reporting & Management (Python to MetaTrader)

  3. Algorithmic Trading via ZeroMQ: Subscribing to Market Data (Python to MetaTrader)

  4. Build Algorithmic Trading Strategies with Python & ZeroMQ: Part 1

  5. Build Algorithmic Trading Strategies with Python & ZeroMQ: Part 2

  6. Troubleshooting Python, ZeroMQ & MetaTrader Configuration for Algorithmic Trading

Available functions:

  1. DWX_MTX_NEW_TRADE_(self, _order=None)
  2. DWX_MTX_MODIFY_TRADE_BY_TICKET_(self, _ticket, _SL, _TP)
  3. DWX_MTX_CLOSE_TRADE_BY_TICKET_(self, _ticket)
  4. DWX_MTX_CLOSE_PARTIAL_BY_TICKET_(self, _ticket, _lots)
  5. DWX_MTX_CLOSE_TRADES_BY_MAGIC_(self, _magic)
  6. DWX_MTX_CLOSE_ALL_TRADES_(self)
  7. DWX_MTX_GET_ALL_OPEN_TRADES_(self)
  8. generate_default_order_dict(self)
  9. generate_default_data_dict(self)
  10. DWX_MTX_SEND_MARKETDATA_REQUEST_(self, _symbol, _timeframe, _start, _end)
  11. DWX_MTX_SEND_COMMAND_(self, _action, _type, _symbol, _price, _SL, _TP, _comment, _lots, _magic, _ticket)
  12. DWX_MTX_SUBSCRIBE_MARKETDATA_(self, _symbol, _string_delimiter=';')
  13. DWX_MTX_UNSUBSCRIBE_MARKETDATA_(self, _symbol)
  14. DWX_MTX_UNSUBSCRIBE_ALL_MARKETDATA_REQUESTS_(self)

License

BSD 3-Clause License

Copyright (c) 2019, Darwinex. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  • Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].