Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/arjunvachhani/order-matcher
simple, fast and feature rich order matching engine supports limit, market, stop-loss, iceberg, IOC, FOK, GTD orders
https://github.com/arjunvachhani/order-matcher
cryptocurrency cryptocurrency-exchanges dotnet dotnet-core matching-engine order-book order-matching orderbook stocks stocks-exchange trading trading-engine
Last synced: 5 days ago
JSON representation
simple, fast and feature rich order matching engine supports limit, market, stop-loss, iceberg, IOC, FOK, GTD orders
- Host: GitHub
- URL: https://github.com/arjunvachhani/order-matcher
- Owner: ArjunVachhani
- License: mit
- Created: 2019-01-27T16:41:22.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2024-10-17T19:35:52.000Z (2 months ago)
- Last Synced: 2024-12-14T03:07:39.876Z (12 days ago)
- Topics: cryptocurrency, cryptocurrency-exchanges, dotnet, dotnet-core, matching-engine, order-book, order-matching, orderbook, stocks, stocks-exchange, trading, trading-engine
- Language: C#
- Homepage:
- Size: 2.8 MB
- Stars: 143
- Watchers: 8
- Forks: 73
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# order-matcher![](https://github.com/ArjunVachhani/order-matcher/workflows/.NET%20Core/badge.svg?branch=master)
order-matcher is a simple and fast library to build crypto-currency exchange, stock exchange or commodity exchange. order-matcher matches buy and sell orders using price-time priority algorithm. order-matcher supports multiple order types and able to excecute upto 1 million messages per seconds.
- Support multiple order types
- Limit
- Market
- Stop Loss
- Stop Limit
- Supports multiple options on order
- Book or Cancel
- Immediate or Cancel(IOC)
- Fill or kill(FOK)
- Iceberg
- Good till Date(GTD)
- Self Trade Prevention
**1 Million orders per seconds on AWS c6a.xlarge instance****Supports integer & real numbers/decimal for price and quantity**
**Hand written serializer faster than any serializer. x15 times faster than JSON, x5 times faster than messagepack**
## Documentation
[home](https://github.com/ArjunVachhani/order-matcher/wiki)[1. Terminology](https://github.com/ArjunVachhani/order-matcher/wiki/1.-Terminology)
[2. Order](https://github.com/ArjunVachhani/order-matcher/wiki/2.-Order)
[3. Frequently Asked Questions(FAQ)](https://github.com/ArjunVachhani/order-matcher/wiki/FAQ----Frequently-Asked-Questions)
## Project Development Status : Actively maintained.
## Community
Questions and pull requests are welcomed.## Are you building spot crypto exchange?
Chat with me on telegram at [https://t.me/Arjun_Vachhani](https://t.me/Arjun_Vachhani), I may be able to help you.## Code
```csharpclass Program
{
static void Main(string[] args)
{
//timeProvider will provide epoch
var timeProvider = new TimeProvider();//create instance of matching engine.
MatchingEngine matchingEngine = new MatchingEngine(new MyTradeListener(), new MyFeeProvider(), new Quantity(0.0000_0001m), 8);Order order1 = new Order { IsBuy = true, OrderId = 1, OpenQuantity = 0.01m, Price = 69_000 };
//push new order engine.
var addResult = matchingEngine.AddOrder(order1, timeProvider.GetSecondsFromEpoch());
if (addResult == OrderMatchingResult.OrderAccepted)
{
// matching engine has accepted order
}//cancel existing orders
var cancelResult = matchingEngine.CancelOrder(1);//pass orderId to cancel
if (cancelResult == OrderMatchingResult.CancelAcepted)
{
// cancel request is accepted
}
}
}//create a listener to receive events from matching engine. pass it to constructore of MatchingEngine
class MyTradeListener : ITradeListener
{
public void OnAccept(OrderId orderId, UserId userId)
{
Console.WriteLine($"Order Accepted.... orderId : {orderId}");
}public void OnCancel(OrderId orderId, UserId userId, Quantity remainingQuantity, Amount cost, Amount fee, CancelReason cancelReason)
{
Console.WriteLine($"Order Cancelled.... orderId : {orderId}, remainingQuantity : {remainingQuantity}, cancelReason : {cancelReason}");
}public void OnOrderTriggered(OrderId orderId, UserId userId)
{
Console.WriteLine($"Stop Order Triggered.... orderId : {orderId}");
}public void OnTrade(OrderId incomingOrderId, OrderId restingOrderId, UserId incomingUserId, UserId restingUserId, bool incomingOrderSide, Price matchPrice, Quantity matchQuantiy, Quantity? askRemainingQuantity, Amount? askFee, Amount? bidCost, Amount? bidFee)
{
if (bidCost.HasValue)
{
// buy order completed
}
if (askRemainingQuantity.HasValue)
{
// sell order completed
}Console.WriteLine($"Order matched.... incomingOrderId : {incomingOrderId}, restingOrderId : {restingOrderId}, executedQuantity : {matchQuantiy}, exetedPrice : {matchPrice}");
}
}class MyFeeProvider : IFeeProvider
{
public Fee GetFee(short feeId)
{
return new Fee
{
TakerFee = 0.5m, //0.5% taker fee
MakerFee = 0.1m, //0.1% maker fee
};
}
}
```