Class: Trader::Slope

Inherits:
Object
  • Object
show all
Defined in:
lib/trade-o-matic/structs/slope.rb

Direct Known Subclasses

AskSlope, BidSlope

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(_pair) ⇒ Slope

Returns a new instance of Slope.



5
6
7
8
# File 'lib/trade-o-matic/structs/slope.rb', line 5

def initialize(_pair)
  @pair = _pair
  reset
end

Instance Attribute Details

#pairObject (readonly)

Returns the value of attribute pair.



3
4
5
# File 'lib/trade-o-matic/structs/slope.rb', line 3

def pair
  @pair
end

Instance Method Details

#add_order(_price, _volume) ⇒ Object



15
16
17
18
19
# 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) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# 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) ⇒ Object



21
22
23
24
25
# 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) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
# 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

#resetObject



10
11
12
13
# File 'lib/trade-o-matic/structs/slope.rb', line 10

def reset
  @orders = []
  @orders_sorted = false
end

#volume_for_price(_price, _skip_volume = nil) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 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