Sha256: 281953ca50d3806d9cc5ddbf46cc1eb96351265be7045e9f5574e317a5de00a3

Contents?: true

Size: 1.31 KB

Versions: 2

Compression:

Stored size: 1.31 KB

Contents

require_relative 'account'
require_relative 'order-book'
require_relative 'order'
require_relative 'server'

StartingEquity = 0
StartingCash = 10_000
DividendAmount = 0.25
DividendFrequency = 600

class Exchange
  def initialize
    @accounts = {}
    @orders = {}
    @order_no = 0
    @book = OrderBook.new
  end

  def accounts
    @accounts.values
  end

  # Pay dividends to all accounts
  def pay_dividends
    @accounts.values.each do |account|
      account.process_dividend DividendAmount
    end
  end

  def identify data
    account = @accounts[data["peer_name"]] || Account.new(data["peer_name"], data["name"], StartingEquity, StartingCash)

    account.ai = data["ai"]
    account.update_name data["name"]

    @accounts[account.name] = account

    account
  end

  def new_order account, data
    id = @order_no += 1
    order = Order.new id, data["local_id"], data["side"], data["price"],
      data["size"], account.id

    if not order.valid?
      return order.errors, order
    else
      @orders[id] = order
      return nil, order
    end
  end

  # Send an order
  def send_order order
    order.status = :accepted
    @book.send_order order
  end

  def level1
    {
      bid: @book.bid,
      ask: @book.ask,
      last: @book.last
    }
  end

  def cancel_order order
    @book.cancel_order order if order
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ruby-trade-0.4 server/exchange.rb
ruby-trade-0.3 server/exchange.rb