63 lines
1.4 KiB
Ruby
63 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'peatio/influxdb'
|
|
class TickersService
|
|
ZERO = '0.0'.to_d
|
|
|
|
class << self
|
|
def [](market)
|
|
services[market] ||= new(market)
|
|
end
|
|
|
|
def services
|
|
@services ||= {}
|
|
end
|
|
end
|
|
|
|
attr_accessor :market_id
|
|
|
|
def initialize(market)
|
|
if market.is_a? Market
|
|
@market_id = market.id
|
|
else
|
|
@market_id = market.to_s
|
|
end
|
|
end
|
|
|
|
def ticker
|
|
ticker = Trade.market_ticker_from_influx(market_id)
|
|
format(ticker)
|
|
end
|
|
|
|
def default_ticker
|
|
{ min: ZERO, max: ZERO, last: ZERO, first: ZERO, volume: ZERO, amount: ZERO, vwap: ZERO }
|
|
end
|
|
|
|
def format(ticker)
|
|
if ticker.blank?
|
|
ticker = default_ticker
|
|
last_trade = Trade.public_from_influx(market_id, 1).first
|
|
ticker[:last] = last_trade[:price] if last_trade.present?
|
|
end
|
|
|
|
{
|
|
at: Time.now.to_i,
|
|
avg_price: ticker[:vwap].to_d,
|
|
high: ticker[:max].to_d,
|
|
last: ticker[:last].to_d,
|
|
low: ticker[:min].to_d,
|
|
open: ticker[:first].to_d,
|
|
price_change_percent: change_ratio(ticker[:first].to_d, ticker[:last].to_d),
|
|
volume: ticker[:volume].to_d,
|
|
amount: ticker[:amount].to_d
|
|
}.transform_values(&:to_s)
|
|
end
|
|
|
|
def change_ratio(open, last)
|
|
percent = open.zero? ? 0 : (last - open) / open * 100
|
|
|
|
# Prepend sign. Show two digits after the decimal point. Append '%'.
|
|
"#{'%+.2f' % percent}%"
|
|
end
|
|
end
|