class Trader::Slope

Attributes

pair[R]

Public Class Methods

new(_pair) click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 5
def initialize(_pair)
  @pair = _pair
  reset
end

Public Instance Methods

add_order(_price, _volume) click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 15
def add_order(_price, _volume)
  @orders_sorted = false
  @orders << Order.new(pair, instruction, _volume, _price)
  nil
end
assess(_amount, _skip_volume=nil) click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 61
def assess(_amount, _skip_volume=nil)
  _amount = pair.quote.unpack _amount
  _skip_volume = pair.base.unpack _skip_volume, 0.0

  total_volume = 0.0
  slice(_skip_volume).each do |order, volume|
    order_quote = order.price.amount * volume
    if order_quote > _amount
      total_volume += _amount / order.price.amount
      break
    else
      total_volume += volume
      _amount -= order_quote
    end
  end

  Price.new pair.base, total_volume
end
price(_skip_volume=nil) click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 21
def price(_skip_volume=nil)
  _skip_volume = pair.base.unpack _skip_volume, 0.0

  slice(_skip_volume).first[0].price
end
quote(_volume, _skip_volume=nil) click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 49
def quote(_volume, _skip_volume=nil)
  _volume = pair.base.unpack _volume, 0.0
  _skip_volume = pair.base.unpack _skip_volume, 0.0

  total_price = 0.0
  slice(_skip_volume, _volume).each do |order, order_volume|
    total_price += order_volume * order.price.amount
  end

  Price.new pair.quote, total_price
end
reset() click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 10
def reset
  @orders = []
  @orders_sorted = false
end
volume_for_price(_price, _skip_volume=nil) click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 27
def volume_for_price(_price, _skip_volume=nil)
  _price = pair.quote.unpack _price
  _skip_volume = pair.base.unpack _skip_volume, 0.0

  wt_price = 0.0
  r_volume = 0.0

  slice(_skip_volume).each do |order, volume|
    if compare(order.price.amount, _price) == -1
      x = (_price - wt_price) * r_volume / (order.price.amount - _price)
      if x < volume
        volume = x
      end
    end

    wt_price = (wt_price * r_volume + order.price.amount * volume) / (r_volume + volume)
    r_volume += volume
  end

  Price.new pair.base, r_volume
end

Private Instance Methods

compare(_price_a, _price_b) click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 120
def compare(_price_a, _price_b)
  # abstract
end
order_type() click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 116
def order_type
  # abstract
end
orders() click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 82
def orders
  unless @orders_sorted
    sort_by_relevance @orders
    @orders_sorted = true
  end

  @orders
end
slice(_skip_volume, _volume=nil) { |order, volume| ... } click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 91
def slice(_skip_volume, _volume=nil)
  return to_enum(:slice, _skip_volume, _volume) unless block_given?

  orders.each do |order|
    if order.volume.amount >= _skip_volume
      volume = order.volume.amount - _skip_volume

      unless _volume.nil?
        volume = _volume if _volume < volume
        _volume -= volume
      end

      yield order, volume
      break if _volume == 0.0
      _skip_volume = 0.0
    else
      _skip_volume -= order.volume.amount
    end
  end
end
sort_by_relevance(_orders) click to toggle source
# File lib/trade-o-matic/structs/slope.rb, line 112
def sort_by_relevance(_orders)
  _orders.sort! { |a, b| compare a.price.amount, b.price.amount }
end