Class: Bitcoin::Analyzer

Inherits:
Object
  • Object
show all
Defined in:
lib/bitcoin/analyzer.rb

Class Method Summary collapse

Class Method Details

.analyze_candles(symbol) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/bitcoin/analyzer.rb', line 18

def self.analyze_candles(symbol)
  candles = Bitcoin::Candle.new_from_range(symbol.id, get_datetimes_from_user,
                                           interval_from_user)
  return "No candles found! :(" if !candles
  puts ''
  puts '///// [Analysis Results] /////'
  puts ''
  puts "Got #{candles.length} candles from #{candles.last.timestamp} - #{candles.first.timestamp}"
  puts '|'
  puts '| Period with highest price:'
  puts "| #{get_max(candles, :max).display_details}"
  puts '| Period with lowest open:'
  puts "| #{get_min(candles, :open).display_details}"
  puts '| Period with lowest volume:'
  puts "| #{get_min(candles, :volume).display_details}"
  puts "| Average Volume: #{avg(candles, 'volume')}"
  puts '| Avg Open, Close, Min and Max:'
  puts "| #{candle_averages(candles)}"
end

.analyze_trades(symbol) ⇒ Object

input Symbol object, prints results



4
5
6
7
8
9
10
11
12
13
14
15
16
# File 'lib/bitcoin/analyzer.rb', line 4

def self.analyze_trades(symbol)
  trades = Bitcoin::Trade.get_trades_in_range(symbol.id,
                                              get_datetimes_from_user)
  puts ''
  puts '///// [Analysis Results] /////'
  puts '|'
  puts '| Trade with highest price:'
  puts "| #{get_max(trades).display_details}"
  puts '| Trade with lowest price:'
  puts "| #{get_min(trades).display_details}"
  puts '| Largest trade:'
  puts "| #{get_max(trades, :quantity).display_details}"
end

.avg(object_array, attribute) ⇒ Object

calculate avg of attribute



71
72
73
74
75
# File 'lib/bitcoin/analyzer.rb', line 71

def self.avg(object_array, attribute)
  num = object_array.length
  sum = object_array.inject(0) { |memo, e| memo + e.send("#{attribute}").to_i}
  sum.to_f / num.to_f
end

.candle_averages(candles) ⇒ Object

calculate moving averages of candles array return: [ open, close, min, max]



59
60
61
62
63
64
65
66
67
68
# File 'lib/bitcoin/analyzer.rb', line 59

def self.candle_averages(candles)
  result = [0, 0, 0, 0]
  candles.each do |candle|
    result[0] += candle.open.to_f
    result[1] += candle.close.to_f
    result[2] += candle.min.to_f
    result[3] += candle.max.to_f
  end
  result.map { |e| e / candles.length }
end

.date_from_userObject

returns date in array format [‘YYYY’, ‘MM’, ‘DD’]



99
100
101
102
103
104
105
106
107
# File 'lib/bitcoin/analyzer.rb', line 99

def self.date_from_user
  puts 'Enter Year (YYYY MM DD)'
  d = gets.strip.split(' ')
  if d[0].to_i < 2014 || !d[1].to_i.between?(1, 12) || !d[2].to_i.between?(1, 31) || d[0].length != 4 || d[1].length != 2 || d[2].length != 2
    puts 'Invalid Date. Try Again'
    date_from_user
  end
  d
end

.get_datetimeObject

returns ISO formatted datetime string from user



39
40
41
42
43
44
45
46
# File 'lib/bitcoin/analyzer.rb', line 39

def self.get_datetime
  d = date_from_user
  t = time_from_user
  r = "#{d[0]}-#{d[1]}-#{d[2]}T#{t[0]}:#{t[1]}:#{t[2]}Z"
  puts "Is this correct? #{d[0]}/#{d[1]}/#{d[2]}, #{t[0]}:#{t[1]}:#{t[2]}"
  puts 'Y / N'
  gets.strip.upcase == 'Y' ? r : get_datetime
end

.get_datetimes_from_userObject

returns 2-element array with formatted datetimes



49
50
51
52
53
54
55
# File 'lib/bitcoin/analyzer.rb', line 49

def self.get_datetimes_from_user
  puts '*** Enter Start Time *** (2014 or later)'
  from = get_datetime
  puts '*** Enter End Time *** (2014 or later)'
  to = get_datetime
  [from, to]
end

.get_max(object_array, attribute = :price) ⇒ Object

returns object with largest attribute



78
79
80
# File 'lib/bitcoin/analyzer.rb', line 78

def self.get_max(object_array, attribute = :price)
  object_array.max_by{ |e| e.send("#{attribute}") }
end

.get_min(object_array, attribute = :price) ⇒ Object

returns object with smallest attribute



83
84
85
# File 'lib/bitcoin/analyzer.rb', line 83

def self.get_min(object_array, attribute = :price)
  object_array.min_by{ |e| e.send("#{attribute}") }
end

.interval_from_userObject



109
110
111
112
113
114
115
116
117
118
119
# File 'lib/bitcoin/analyzer.rb', line 109

def self.interval_from_user
  puts 'Enter time interval. Accepted values:'
  puts '  M1 (one minute), M3, M5, M15, M30, '
  puts '  H1 (one hour), H4, '
  puts '  D1 (one day), D7, '
  puts '  1M (one month)'
  valid = ['M1', 'M3', 'M5', 'M15', 'M30', 'H1', 'H4', 'D1', 'D7', '1M']
  input = gets.strip
  interval_from_user if !valid.any?(input)
  input
end

.time_from_userObject

returns time in array format [‘HH’, ‘MM’, ‘SS’]



88
89
90
91
92
93
94
95
96
# File 'lib/bitcoin/analyzer.rb', line 88

def self.time_from_user
  puts 'Enter Time (24-hour format) (hh mm ss)'
  t = gets.strip.split(' ')
  if !t[0].to_i.between?(0, 23) || !t[1].to_i.between?(0, 59) || !t[2].to_i.between?(0, 59) || t[0].length != 2 || t[1].length != 2 || t[2].length != 2
    puts 'Invalid time.'
    time_from_user
  end
  t
end