0.5.0 • Published 4 years ago

@wangshijun/exchange-engine v0.5.0

Weekly downloads
1
License
MIT
Repository
github
Last release
4 years ago

@wangshijun/exchange-engine

Exchange engine written in node.js

Package Version semantic-release Downloads Status Build Status: Linux

PRs Welcome dependencies Status devDependencies Status code style: prettier MIT License

Why

// TODO

Installation

npm install --save @wangshijun/exchange-engine

Usage

const ExchangeEngine = require('@wangshijun/exchange-engine');
const OrderBook = require('@wangshijun/order-book');
const OrderStorage = require('@wangshijun/order-storage-mongo');
const { Queue, Worker, Events } = require('@wangshijun/order-queue-redis');
const MatchEngine = require('@wangshijun/order-matcher-limit');
const { Order, Trade } = require('@wangshijun/order-matcher');

// OrderQueue => stores data that are persisted before adding to order book
// OrderStorage => stores data that are persisted after adding to order book

const tradingPair = 'XIN/FXIN';
const orderBook = new OrderBook();
const orderStorage = new OrderStorage();
const matchEngine = new MatchEngine(orderBook);
const exchangeEngine = new ExchangeEngine({
  tradingPair,
  orderBook,
  orderStorage,
  orderQueue,
  matchEngine,
});

// Events emitted from the exchange engine
exchangeEngine.on('order.create', () => {});
exchangeEngine.on('order.cancel', () => {});
exchangeEngine.on('order.match', () => {});

// TODO: recover from order storage when start
exchangeEngine.start();

// This is what happens when exchange starts
// @link https://www.npmjs.com/package/bullmq
const orderQueue = new Queue(tradingPair, { connection: 'mongo://localhost:27017/test' });
const orderWorker = new Worker(tradingPair, { connection: 'mongo://localhost:27017/test' }, async job => {
  if (job.name === 'order.create') {
    const trades = matchEngine.processOrder(Order.fromJson(job.data));
    exchangeEngine.emit('order.match', trades);
  }

  // TODO: match engine does not support this yet
  if (job.name === 'order.cancel') {
    matchEngine.cancelOrder(Order.fromJson(job.data));
    exchangeEngine.emit('order.cancel', job.data);
  }
});

exchangeEngine.createOrder(order); // orderQueue.add('order.create', order);
exchangeEngine.cancelOrder(orderId); // orderQueue.add('order.cancel', orderId);

Related

// TODO

License

MIT © wangshijun