github.com/diadata-org/diadata@v1.4.593/pkg/model/prices.go (about)

     1  package models
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/diadata-org/diadata/pkg/dia"
     9  	"github.com/diadata-org/diadata/pkg/dia/helpers"
    10  )
    11  
    12  func (datastore *DB) GetPrice(asset dia.Asset, exchange string) (float64, error) {
    13  	key := getKeyFilterSymbolAndExchangeZSET(dia.FilterKing, asset, exchange)
    14  	v, _, err := datastore.getZSETLastValue(key)
    15  	return v, err
    16  }
    17  
    18  func (datastore *DB) GetPriceYesterday(asset dia.Asset, exchange string) (float64, error) {
    19  	return datastore.getZSETValue(getKeyFilterZSET(getKey(dia.FilterKing, asset, exchange)), time.Now().Unix()-WindowYesterday)
    20  }
    21  
    22  func (datastore *DB) GetPrice1h(asset dia.Asset, exchange string) (float64, error) {
    23  	return datastore.getZSETValue(getKeyFilterZSET(getKey(dia.FilterKing, asset, exchange)), time.Now().Unix()-Window1h)
    24  }
    25  
    26  func (datastore *DB) GetPrice7d(asset dia.Asset, exchange string) (float64, error) {
    27  	return datastore.getZSETValue(getKeyFilterZSET(getKey(dia.FilterKing, asset, exchange)), time.Now().Unix()-Window7d)
    28  }
    29  
    30  func (datastore *DB) GetPrice14d(asset dia.Asset, exchange string) (float64, error) {
    31  	return datastore.getZSETValue(getKeyFilterZSET(getKey(dia.FilterKing, asset, exchange)), time.Now().Unix()-Window14d)
    32  }
    33  
    34  func (datastore *DB) GetPrice30d(asset dia.Asset, exchange string) (float64, error) {
    35  	return datastore.getZSETValue(getKeyFilterZSET(getKey(dia.FilterKing, asset, exchange)), time.Now().Unix()-Window30d)
    36  }
    37  
    38  func (datastore *DB) GetTradePriceBefore(asset dia.Asset, exchange string, timestamp time.Time, window time.Duration) (*dia.Trade, error) {
    39  	return datastore.GetTradeInflux(asset, exchange, timestamp, window)
    40  }
    41  
    42  func (datastore *DB) GetTradePrice1h(asset dia.Asset, exchange string) (*dia.Trade, error) {
    43  	return datastore.GetTradePriceBefore(asset, exchange, time.Now().Add(-1*time.Hour), time.Duration(2*24*time.Hour))
    44  }
    45  
    46  func (datastore *DB) GetTradePrice24h(asset dia.Asset, exchange string) (*dia.Trade, error) {
    47  	return datastore.GetTradePriceBefore(asset, exchange, time.Now().Add(-24*time.Hour), time.Duration(2*24*time.Hour))
    48  }
    49  
    50  func (datastore *DB) GetTradePrice7d(asset dia.Asset, exchange string) (*dia.Trade, error) {
    51  	return datastore.GetTradePriceBefore(asset, exchange, time.Now().Add(-7*24*time.Hour), time.Duration(2*24*time.Hour))
    52  }
    53  
    54  func (datastore *DB) GetTradePrice14d(asset dia.Asset, exchange string) (*dia.Trade, error) {
    55  	return datastore.GetTradePriceBefore(asset, exchange, time.Now().Add(-14*24*time.Hour), time.Duration(2*24*time.Hour))
    56  }
    57  
    58  func (datastore *DB) GetTradePrice30d(asset dia.Asset, exchange string) (*dia.Trade, error) {
    59  	return datastore.GetTradePriceBefore(asset, exchange, time.Now().Add(-30*24*time.Hour), time.Duration(2*24*time.Hour))
    60  }
    61  
    62  func (datastore *DB) GetLastPriceBefore(asset dia.Asset, filter string, exchange string, timestamp time.Time) (Price, error) {
    63  	exchangeQuery := "exchange='" + exchange + "'"
    64  	table := influxDbFiltersTable
    65  	// q := fmt.Sprintf("SELECT LAST(value) FROM %s WHERE filter='%s' AND symbol='%s' AND %s AND time < %d",
    66  	// 	table, filter, symbol, exchangeQuery, timestamp.UnixNano())
    67  
    68  	q := fmt.Sprintf("SELECT value FROM %s WHERE filter='%s' AND address='%s' AND blockchain='%s' AND %s AND time<now() AND time > %d ORDER BY ASC LIMIT 1",
    69  		table, filter, asset.Address, asset.Blockchain, exchangeQuery, timestamp.UnixNano())
    70  
    71  	res, err := queryInfluxDB(datastore.influxClient, q)
    72  	if err != nil {
    73  		log.Errorln("GetLastFilterPointBefore", err)
    74  	}
    75  
    76  	log.Info("GetLastFilterPointBefore query: ", q, " returned ", len(res))
    77  
    78  	var price Price
    79  	price.Symbol = asset.Symbol
    80  	price.Name = helpers.NameForSymbol(asset.Symbol)
    81  	if len(res) > 0 && len(res[0].Series) > 0 {
    82  		for _, row := range res[0].Series[0].Values {
    83  			price.Time, err = time.Parse(time.RFC3339, row[0].(string))
    84  			if err == nil {
    85  				value, ok := row[1].(json.Number)
    86  				if ok {
    87  					price.Price, _ = value.Float64()
    88  				} else {
    89  					log.Errorln("GetLastFilterPointBefore: error on parsing row price", row)
    90  				}
    91  			} else {
    92  				log.Errorln("GetLastFilterPointBefore: error on parsing row time", err, row)
    93  			}
    94  		}
    95  	} else {
    96  		log.Errorln("Empty response GetLastFilterPointBefore")
    97  	}
    98  
    99  	return price, err
   100  }