Files
Dena/app/services/tickers_service.rb
2026-08-13 19:50:53 +03:30

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