Class: Bitcoin::Analyzer
- Inherits:
-
Object
- Object
- Bitcoin::Analyzer
- Defined in:
- lib/bitcoin/analyzer.rb
Class Method Summary collapse
- .analyze_candles(symbol) ⇒ Object
-
.analyze_trades(symbol) ⇒ Object
input Symbol object, prints results.
-
.avg(object_array, attribute) ⇒ Object
calculate avg of attribute.
-
.candle_averages(candles) ⇒ Object
calculate moving averages of candles array return: [ open, close, min, max].
-
.date_from_user ⇒ Object
returns date in array format [‘YYYY’, ‘MM’, ‘DD’].
-
.get_datetime ⇒ Object
returns ISO formatted datetime string from user.
-
.get_datetimes_from_user ⇒ Object
returns 2-element array with formatted datetimes.
-
.get_max(object_array, attribute = :price) ⇒ Object
returns object with largest attribute.
-
.get_min(object_array, attribute = :price) ⇒ Object
returns object with smallest attribute.
- .interval_from_user ⇒ Object
-
.time_from_user ⇒ Object
returns time in array format [‘HH’, ‘MM’, ‘SS’].
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.} - #{candles.first.}" 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_user ⇒ Object
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_datetime ⇒ Object
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_user ⇒ Object
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_user ⇒ Object
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_user ⇒ Object
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 |