currency-market

A synchronous implementation of a limit order based currency market

currency-market

A synchronous implementation of a limit order based currency market

  • Supports an arbitrary list of currencies
  • Synchronously executes trades as orders are added
  • Emits events when changes are made to the market
npm install currency-market

All functions complete synchronously and throw errors if they fail. Events are made available for monitoring changes in the market.

var CurrencyMarket = require('currency-market');
 
// instantiate a market 
var currencyMarket = new CurrencyMarket({
  currencies: [
    'EUR',
    'USD',
    'BTC'
  ]
});
 
// register for events 
currencyMarket.on('account', function(account) {
  console.log(account);
});
currencyMarket.on('deposit', function(deposit) {
  console.log(deposit);
});
currencyMarket.on('withdrawal', function(withdrawal) {
  console.log(withdrawal);
});
currencyMarket.on('order', function(order) {
  console.log(order);
});
currencyMarket.on('cancellation', function(order) {
  console.log(order);
});
currencyMarket.on('trade', function(trade) {
  console.log(trade);
});
 
// add accounts 
currencyMarket.register({
  id: 'Peter'
});
currencyMarket.register({
  id: 'Paul'
});
 
// make deposits 
currencyMarket.deposit({
  account: 'Peter',
  currency: 'EUR',
  amount: '5000'
});
currencyMarket.deposit({
  account: 'Paul',
  currency: 'BTC',
  amount: '5000'
});
 
// make withdrawals 
currencyMarket.withdraw({
  account: 'Peter',
  currency: 'EUR',
  amount: '1000'
});
currencyMarket.withdraw({
  account: 'Paul',
  currency: 'BTC',
  amount: '1000'
});
 
// submit orders 
currencyMarket.submit({
  id: '1',
  timestamp: '1366758222',
  account: 'Peter',
  bidCurrency: 'BTC',
  offerCurrency: 'EUR',
  bidPrice: '2',
  bidAmount: '500'
});
currencyMarket.submit({
  id: '2',
  timestamp: '1366758245',
  account: 'Peter',
  bidCurrency: 'BTC',
  offerCurrency: 'EUR',
  bidPrice: '1',
  bidAmount: '2000'
});
currencyMarket.submit({
  id: '3',
  timestamp: '1366758256',
  account: 'Paul',
  bidCurrency: 'EUR',
  offerCurrency: 'BTC',
  offerPrice: '2',
  offerAmount: '250'
});
currencyMarket.submit({
  id: '4',
  timestamp: '1366758268',
  account: 'Paul',
  bidCurrency: 'EUR',
  offerCurrency: 'BTC',
  offerPrice: '3',
  offerAmount: '3000'
});
 
// cancel an order 
currencyMarket.cancel({
  id: '1',
  timestamp: '1366758222',
  account: 'Peter',
  bidCurrency: 'BTC',
  offerCurrency: 'EUR',
  bidPrice: '2',
  bidAmount: '250'
});
 
// list all the active orders (keyed by id) 
console.log(currencyMarket.orders);
 
// list all the active accounts (keyed by id) 
console.log(currencyMarket.accounts);
 
// list all the active order books  
console.log(currencyMarket.books);
 
// Get the top of an order book 
console.log(currencyMarket.books['EUR']['BTC'].highest);
console.log(currencyMarket.books['BTC']['EUR'].highest);
  • Instant orders (execute or cancel)
  • Pluggable rounding policies
  • Pluggable commission schemes

In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality.

The CoffeeScript source is located in the src/ directory and tests in the test/ directory. Do not edit the contents of the lib/ directory as this is compiled from the CoffeeScript source.

Before commiting run npm test to perform a clean compile of the source and run the tests. This ensures that everything commited is up to date and tested and allows people to npm install directly from the git repository (useful for integrating development branches, etc).

Copyright (c) 2013 Peter Halliday
Licensed under the MIT license.