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