exchanges

package module
v3.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 22, 2022 License: ISC Imports: 29 Imported by: 2

Documentation

Index

Constants

View Source
const (
	// DefaultCurrency is overridden by ExchangeBotConfig.BtcIndex. Data
	// structures are cached for DefaultCurrency, so requests are a little bit
	// faster.
	DefaultCurrency = "USD"
	// DefaultDataExpiry is the amount of time between calls to the exchange API.
	DefaultDataExpiry = "5m"
	// DefaultRequestExpiry : Any data older than RequestExpiry will be discarded.
	DefaultRequestExpiry = "60m"
)
View Source
const (
	Coinbase     = "coinbase"
	Coindesk     = "coindesk"
	Binance      = "binance"
	Bittrex      = "bittrex"
	DragonEx     = "dragonex"
	Huobi        = "huobi"
	Poloniex     = "poloniex"
	DexDotDecred = "dcrdex"
)

Tokens. Used to identify the exchange.

View Source
const (
	BittrexMsgHeartbeat  = "heartbeat"
	BittrexMsgBookUpdate = "orderBook"
)

Variables

View Source
var (
	CoinbaseURLs = URLs{
		Price: "https://api.coinbase.com/v2/exchange-rates?currency=BTC",
	}
	CoindeskURLs = URLs{
		Price: "https://api.coindesk.com/v2/bpi/currentprice.json",
	}
	BinanceURLs = URLs{
		Price: "https://api.binance.com/api/v3/ticker/24hr?symbol=DCRBTC",

		Depth: "https://api.binance.com/api/v3/depth?symbol=DCRBTC&limit=5000",
		Candlesticks: map[candlestickKey]string{
			// contains filtered or unexported fields
		},
	}
	BittrexURLs = URLs{
		Price: "https://api.bittrex.com/v3/markets/dcr-btc/ticker",
		Stats: "https://api.bittrex.com/v3/markets/dcr-btc/summary",
		Depth: "https://api.bittrex.com/v3/markets/dcr-btc/orderbook?depth=500",
		Candlesticks: map[candlestickKey]string{
			// contains filtered or unexported fields
		},

		Websocket: "socket.bittrex.com",
	}
	DragonExURLs = URLs{
		Price: "https://openapi.dragonex.io/api/v1/market/real/?symbol_id=1520101",

		Depth: "https://openapi.dragonex.io/api/v1/market/%s/?symbol_id=1520101",
		Candlesticks: map[candlestickKey]string{
			// contains filtered or unexported fields
		},
	}
	HuobiURLs = URLs{
		Price: "https://api.huobi.pro/market/detail/merged?symbol=dcrbtc",

		Depth: "https://api.huobi.pro/market/depth?symbol=dcrbtc&type=step0",
		Candlesticks: map[candlestickKey]string{
			// contains filtered or unexported fields
		},
	}
	PoloniexURLs = URLs{
		Price: "https://poloniex.com/public?command=returnTicker",

		Depth: "https://poloniex.com/public?command=returnOrderBook&currencyPair=BTC_DCR&depth=100",
		Candlesticks: map[candlestickKey]string{
			// contains filtered or unexported fields
		},
		Websocket: "wss://api2.poloniex.com",
	}
)

Prepare the URLs.

BtcIndices maps tokens to constructors for BTC-fiat exchanges.

View Source
var DcrExchanges = map[string]func(*http.Client, *BotChannels) (Exchange, error){
	Binance:  NewBinance,
	Bittrex:  NewBittrex,
	DragonEx: NewDragonEx,
	Huobi:    NewHuobi,
	Poloniex: NewPoloniex,
	DexDotDecred: NewDecredDEXConstructor(&DEXConfig{
		Token:    DexDotDecred,
		Host:     "dex.decred.org:7232",
		Cert:     core.CertStore[dex.Mainnet]["dex.decred.org:7232"],
		CertHost: "dex.decred.org",
	}),
}

DcrExchanges maps tokens to constructors for DCR-BTC exchanges.

Functions

func DisableLog

func DisableLog()

DisableLog disables all library log output. Logging output is disabled by default until UseLogger is called.

func IsBtcIndex

func IsBtcIndex(token string) bool

IsBtcIndex checks whether the given token is a known Bitcoin index, as opposed to a Decred-to-Bitcoin Exchange.

func IsDcrExchange

func IsDcrExchange(token string) bool

IsDcrExchange checks whether the given token is a known Decred-BTC exchange.

func NewDecredDEXConstructor

func NewDecredDEXConstructor(cfg *DEXConfig) func(*http.Client, *BotChannels) (Exchange, error)

NewDecredDEXConstructor creates a constructor for a DEX with the provided configuration.

func Tokens

func Tokens() []string

Tokens is a new slice of available exchange tokens.

func UseLogger

func UseLogger(logger slog.Logger)

UseLogger uses a specified Logger to output package logging info.

Types

type BaseState

type BaseState struct {
	Price float64 `json:"price"`
	// BaseVolume is poorly named. This is the volume in terms of (usually) BTC,
	// not the base asset of any particular market.
	BaseVolume float64 `json:"base_volume,omitempty"`
	Volume     float64 `json:"volume,omitempty"`
	Change     float64 `json:"change,omitempty"`
	Stamp      int64   `json:"timestamp,omitempty"`
}

BaseState are the non-iterable fields of the ExchangeState, which embeds BaseState.

type BinanceCandlestickResponse

type BinanceCandlestickResponse [][]interface{}

BinanceCandlestickResponse models candlestick data returned from the Binance API. Binance has a response with mixed-type arrays, so type-checking is appropriate. Sample response is [

[
  1499040000000,      // Open time
  "0.01634790",       // Open
  "0.80000000",       // High
  "0.01575800",       // Low
  "0.01577100",       // Close
  "148976.11427815",  // Volume
  ...
]

]

type BinanceDepthResponse

type BinanceDepthResponse struct {
	UpdateID int64
	Bids     [][2]string
	Asks     [][2]string
}

BinanceDepthResponse models the response for Binance depth chart data.

type BinanceExchange

type BinanceExchange struct {
	*CommonExchange
}

BinanceExchange is a high-volume and well-respected crypto exchange.

func (*BinanceExchange) Refresh

func (binance *BinanceExchange) Refresh()

Refresh retrieves and parses API data from Binance.

type BinancePriceResponse

type BinancePriceResponse struct {
	Symbol             string `json:"symbol"`
	PriceChange        string `json:"priceChange"`
	PriceChangePercent string `json:"priceChangePercent"`
	WeightedAvgPrice   string `json:"weightedAvgPrice"`
	PrevClosePrice     string `json:"prevClosePrice"`
	LastPrice          string `json:"lastPrice"`
	LastQty            string `json:"lastQty"`
	BidPrice           string `json:"bidPrice"`
	BidQty             string `json:"bidQty"`
	AskPrice           string `json:"askPrice"`
	AskQty             string `json:"askQty"`
	OpenPrice          string `json:"openPrice"`
	HighPrice          string `json:"highPrice"`
	LowPrice           string `json:"lowPrice"`
	Volume             string `json:"volume"`
	QuoteVolume        string `json:"quoteVolume"`
	OpenTime           int64  `json:"openTime"`
	CloseTime          int64  `json:"closeTime"`
	FirstID            int64  `json:"firstId"`
	LastID             int64  `json:"lastId"`
	Count              int64  `json:"count"`
}

BinancePriceResponse models the JSON price data returned from the Binance API.

type BittrexCandlestick

type BittrexCandlestick struct {
	StartsAt    time.Time   `json:"startsAt"`
	Open        StringFloat `json:"open"`
	High        StringFloat `json:"high"`
	Low         StringFloat `json:"low"`
	Close       StringFloat `json:"close"`
	Volume      StringFloat `json:"volume"`
	QuoteVolume StringFloat `json:"quoteVolume"`
}

BittrexCandlestick is the response from one of the /candles endpoints.

type BittrexDepthResponse

type BittrexDepthResponse struct {
	Seq uint64
	Bid []*BittrexRateQty `json:"bid"`
	Ask []*BittrexRateQty `json:"ask"`
}

BittrexDepthResponse is the response from /orderbook. The "orders" are actually binned pseudo-orders, but that's cool.

type BittrexExchange

type BittrexExchange struct {
	*CommonExchange
	MarketName string
	// contains filtered or unexported fields
}

BittrexExchange is an unregulated U.S. crypto exchange with good volume.

func (*BittrexExchange) Refresh

func (bittrex *BittrexExchange) Refresh()

Refresh retrieves and parses API data from Bittrex. Bittrex provides timestamps in a string format that is not quite RFC 3339.

type BittrexMarketSummary

type BittrexMarketSummary struct {
	Symbol        string      `json:"symbol"`
	High          StringFloat `json:"high"`
	Low           StringFloat `json:"low"`
	Volume        StringFloat `json:"volume"`
	QuoteVolume   StringFloat `json:"quoteVolume"`
	PercentChange StringFloat `json:"percentChange"`
	UpdatedAt     time.Time   `json:"updatedAt"`
}

BittrexMarketSummary is the response from markets/{market}/summary.

type BittrexOrderbookDelta

type BittrexOrderbookDelta struct {
	Qty  StringFloat `json:"quantity"`
	Rate StringFloat `json:"rate"`
}

BittrexOrderbookDelta is the new quantity for the order bin at the specified rate. If the Qty is zero, there order should be removed.

type BittrexOrderbookUpdate

type BittrexOrderbookUpdate struct {
	MarketSymbol string                   `json:"marketSymbol"`
	Depth        int64                    `json:"depth"`
	Sequence     uint64                   `json:"sequence"`
	BidDeltas    []*BittrexOrderbookDelta `json:"bidDeltas"`
	AskDeltas    []*BittrexOrderbookDelta `json:"askDeltas"`
}

BittrexOrderbookUpdate is a websocket update to the orderbook.

type BittrexPriceResponse

type BittrexPriceResponse struct {
	LastTradeRate StringFloat `json:"lastTradeRate"`
	BidRate       StringFloat `json:"bidRate"`
	AskRate       StringFloat `json:"askRate"`
}

BittrexPriceResponse is the response from markets/{market}/tickers.

type BittrexRateQty

type BittrexRateQty struct {
	Qty  StringFloat `json:"quantity"`
	Rate StringFloat `json:"rate"`
}

BittrexRateQty is an orderbook/depth data point.

type BittrexWSMsg

type BittrexWSMsg struct {
	Name    string
	Updates []*BittrexOrderbookUpdate
}

BittrexWSMsg is used to parse the ridiculous signalr message format into something sane.

type BotChannels

type BotChannels struct {
	// contains filtered or unexported fields
}

BotChannels is passed to exchanges for communication with the Start loop.

type Candlestick

type Candlestick struct {
	High   float64   `json:"high"`
	Low    float64   `json:"low"`
	Open   float64   `json:"open"`
	Close  float64   `json:"close"`
	Volume float64   `json:"volume"`
	Start  time.Time `json:"start"`
}

Candlestick is the record of price change over some bin width of time.

type Candlesticks

type Candlesticks []Candlestick

Candlesticks is a slice of CandleStick.

type CoinbaseExchange

type CoinbaseExchange struct {
	*CommonExchange
}

CoinbaseExchange provides tons of bitcoin-fiat exchange pairs.

func (*CoinbaseExchange) Refresh

func (coinbase *CoinbaseExchange) Refresh()

Refresh retrieves and parses API data from Coinbase.

type CoinbaseResponse

type CoinbaseResponse struct {
	Data CoinbaseResponseData `json:"data"`
}

CoinbaseResponse models the JSON data returned from the Coinbase API.

type CoinbaseResponseData

type CoinbaseResponseData struct {
	Currency string            `json:"currency"`
	Rates    map[string]string `json:"rates"`
}

CoinbaseResponseData models the "data" field of the Coinbase API response.

type CoindeskExchange

type CoindeskExchange struct {
	*CommonExchange
}

CoindeskExchange provides Bitcoin indices for USD, GBP, and EUR by default. Others are available, but custom requests would need to be implemented.

func (*CoindeskExchange) Refresh

func (coindesk *CoindeskExchange) Refresh()

Refresh retrieves and parses API data from Coindesk.

type CoindeskResponse

type CoindeskResponse struct {
	Time       CoindeskResponseTime           `json:"time"`
	Disclaimer string                         `json:"disclaimer"`
	ChartName  string                         `json:"chartName"`
	Bpi        map[string]CoindeskResponseBpi `json:"bpi"`
}

CoindeskResponse models the JSON data returned from the Coindesk API.

type CoindeskResponseBpi

type CoindeskResponseBpi struct {
	Code        string  `json:"code"`
	Symbol      string  `json:"symbol"`
	Rate        string  `json:"rate"`
	Description string  `json:"description"`
	RateFloat   float64 `json:"rate_float"`
}

CoindeskResponseBpi models the "bpi" field of the Coindesk API response.

type CoindeskResponseTime

type CoindeskResponseTime struct {
	Updated    string    `json:"updated"`
	UpdatedIso time.Time `json:"updatedISO"`
	Updateduk  string    `json:"updateduk"`
}

CoindeskResponseTime models the "time" field of the Coindesk API response.

type CommonExchange

type CommonExchange struct {
	URL string
	// contains filtered or unexported fields
}

CommonExchange is embedded in all of the exchange types and handles some state tracking and token handling for ExchangeBot communications. The http.Request must be created individually for each exchange.

func (*CommonExchange) Hurry

func (xc *CommonExchange) Hurry(d time.Duration)

Hurry can be used to subtract some amount of time from the lastUpdate and lastFail, and can be used to de-sync the exchange updates.

func (*CommonExchange) IsFailed

func (xc *CommonExchange) IsFailed() bool

IsFailed will be true if xc.lastFail > xc.lastUpdate.

func (*CommonExchange) LastFail

func (xc *CommonExchange) LastFail() time.Time

LastFail gets the last time.Time of a failed exchange update.

func (*CommonExchange) LastTry

func (xc *CommonExchange) LastTry() time.Time

LastTry is the more recent of lastFail and LastUpdate.

func (*CommonExchange) LastUpdate

func (xc *CommonExchange) LastUpdate() time.Time

LastUpdate gets a time.Time of the last successful exchange update.

func (*CommonExchange) LogRequest

func (xc *CommonExchange) LogRequest()

LogRequest sets the lastRequest time.Time.

func (*CommonExchange) SilentUpdate

func (xc *CommonExchange) SilentUpdate(state *ExchangeState)

SilentUpdate stores the update for internal use, but does not signal an update to the ExchangeBot.

func (*CommonExchange) Token

func (xc *CommonExchange) Token() string

Token is the string associated with the exchange's token.

func (*CommonExchange) Update

func (xc *CommonExchange) Update(state *ExchangeState)

Update sends an updated ExchangeState to the ExchangeBot.

func (*CommonExchange) UpdateIndices

func (xc *CommonExchange) UpdateIndices(indices FiatIndices)

UpdateIndices sends a bitcoin index update to the ExchangeBot.

type Conversion

type Conversion struct {
	Value float64 `json:"value"`
	Index string  `json:"index"`
}

Conversion is a representation of some amount of DCR in another index.

func (*Conversion) TwoDecimals

func (c *Conversion) TwoDecimals() string

TwoDecimals is a string representation of the value with two digits after the decimal point, but will show more to achieve at least three significant digits.

type DEXConfig

type DEXConfig struct {
	Token    string
	Host     string
	Cert     []byte
	CertHost string
}

DEXConfig is the configuration for the Decred DEX server.

type DecredDEX

type DecredDEX struct {
	*CommonExchange
	// contains filtered or unexported fields
}

DecredDEX is a Decred DEX.

func (*DecredDEX) Refresh

func (dcr *DecredDEX) Refresh()

Refresh grabs a book snapshot and sends the exchange update.

type DepthData

type DepthData struct {
	Time int64        `json:"time"`
	Bids []DepthPoint `json:"bids"`
	Asks []DepthPoint `json:"asks"`
}

DepthData is an exchanges order book for use in a depth chart.

func (*DepthData) IsFresh

func (depth *DepthData) IsFresh() bool

IsFresh will be true if the data is older than depthDataExpiration.

func (*DepthData) MidGap

func (depth *DepthData) MidGap() float64

MidGap returns the mid-gap price based on the best bid and ask. If the book is empty, the value 1.0 is returned.

type DepthPoint

type DepthPoint struct {
	Quantity float64 `json:"quantity"`
	Price    float64 `json:"price"`
}

DepthPoint is a single point in a set of depth chart data.

type Doer

type Doer interface {
	Do(*http.Request) (*http.Response, error)
}

Doer is an interface for a *http.Client to allow testing of Refresh paths.

type DragonExCandlestickColumns

type DragonExCandlestickColumns []string

DragonExCandlestickColumns models the column list returned in a candlestick chart data response from Dragon Exchange.

type DragonExCandlestickData

type DragonExCandlestickData struct {
	Columns DragonExCandlestickColumns `json:"columns"`
	Lists   DragonExCandlestickPts     `json:"lists"`
}

DragonExCandlestickData models the Data field of DragonExCandlestickResponse.

type DragonExCandlestickList

type DragonExCandlestickList []interface{}

DragonExCandlestickList models the value list returned in a candlestick chart data response from Dragon Exchange.

type DragonExCandlestickPts

type DragonExCandlestickPts []DragonExCandlestickList

DragonExCandlestickPts is a list of DragonExCandlestickList.

type DragonExCandlestickResponse

type DragonExCandlestickResponse struct {
	DragonExResponse
	Data DragonExCandlestickData
}

DragonExCandlestickResponse models the response from DragonEx for the historical k-line data.

type DragonExDepthArray

type DragonExDepthArray []DragonExDepthPt

DragonExDepthArray is a slice of DragonExDepthPt.

type DragonExDepthPt

type DragonExDepthPt struct {
	Price  string `json:"price"`
	Volume string `json:"volume"`
}

DragonExDepthPt models a single point of data in a Dragon Exchange depth chart data set.

type DragonExDepthResponse

type DragonExDepthResponse struct {
	DragonExResponse
	Data DragonExDepthArray `json:"data"`
}

DragonExDepthResponse models the Dragon Exchange depth chart data response.

type DragonExPriceResponse

type DragonExPriceResponse struct {
	DragonExResponse
	Data []DragonExPriceResponseData `json:"data"`
}

DragonExPriceResponse models the JSON data returned from the DragonEx API.

type DragonExPriceResponseData

type DragonExPriceResponseData struct {
	ClosePrice      string `json:"close_price"`
	CurrentVolume   string `json:"current_volume"`
	MaxPrice        string `json:"max_price"`
	MinPrice        string `json:"min_price"`
	OpenPrice       string `json:"open_price"`
	PriceBase       string `json:"price_base"`
	PriceChange     string `json:"price_change"`
	PriceChangeRate string `json:"price_change_rate"`
	Timestamp       int64  `json:"timestamp"`
	TotalAmount     string `json:"total_amount"`
	TotalVolume     string `json:"total_volume"`
	UsdtVolume      string `json:"usdt_amount"`
	SymbolID        int    `json:"symbol_id"`
}

DragonExPriceResponseData models the JSON data from the DragonEx API. Dragonex has the current price in close_price

type DragonExResponse

type DragonExResponse struct {
	Ok   bool   `json:"ok"`
	Code int    `json:"code"`
	Msg  string `json:"msg"`
}

DragonExResponse models the generic fields returned in every response.

type DragonExchange

type DragonExchange struct {
	*CommonExchange
	SymbolID int
	// contains filtered or unexported fields
}

DragonExchange is a Singapore-based crytocurrency exchange.

func (*DragonExchange) Refresh

func (dragonex *DragonExchange) Refresh()

Refresh retrieves and parses API data from DragonEx.

type Exchange

type Exchange interface {
	LastUpdate() time.Time
	LastFail() time.Time
	LastTry() time.Time
	Refresh()
	IsFailed() bool
	Token() string
	Hurry(time.Duration)
	Update(*ExchangeState)
	SilentUpdate(*ExchangeState) // skip passing update to the update channel
	UpdateIndices(FiatIndices)
}

Exchange is the interface that ExchangeBot understands. Most of the methods are implemented by CommonExchange, but Refresh is implemented in the individual exchange types.

func NewBinance

func NewBinance(client *http.Client, channels *BotChannels) (binance Exchange, err error)

NewBinance constructs a BinanceExchange.

func NewBittrex

func NewBittrex(client *http.Client, channels *BotChannels) (bittrex Exchange, err error)

NewBittrex constructs a BittrexExchange.

func NewCoinbase

func NewCoinbase(client *http.Client, channels *BotChannels) (coinbase Exchange, err error)

NewCoinbase constructs a CoinbaseExchange.

func NewCoindesk

func NewCoindesk(client *http.Client, channels *BotChannels) (coindesk Exchange, err error)

NewCoindesk constructs a CoindeskExchange.

func NewDragonEx

func NewDragonEx(client *http.Client, channels *BotChannels) (dragonex Exchange, err error)

NewDragonEx constructs a DragonExchange.

func NewHuobi

func NewHuobi(client *http.Client, channels *BotChannels) (huobi Exchange, err error)

NewHuobi constructs a HuobiExchange.

func NewPoloniex

func NewPoloniex(client *http.Client, channels *BotChannels) (poloniex Exchange, err error)

NewPoloniex constructs a PoloniexExchange.

type ExchangeBot

type ExchangeBot struct {
	DcrBtcExchanges map[string]Exchange
	IndexExchanges  map[string]Exchange
	Exchanges       map[string]Exchange

	// BtcIndex is the (typically fiat) currency to which the DCR price should be
	// converted by default. Other conversions are available via a lookup in
	// indexMap, but with slightly lower performance.
	// 3-letter currency code, e.g. USD.
	BtcIndex string

	DataExpiry    time.Duration
	RequestExpiry time.Duration

	TLSCredentials credentials.TransportCredentials
	// contains filtered or unexported fields
}

ExchangeBot monitors exchanges and processes updates. When an update is received from an exchange, the state is updated, and some convenient data structures are prepared. Make ExchangeBot with NewExchangeBot.

func NewExchangeBot

func NewExchangeBot(config *ExchangeBotConfig) (*ExchangeBot, error)

NewExchangeBot constructs a new ExchangeBot with the provided configuration.

func (*ExchangeBot) AvailableIndices

func (bot *ExchangeBot) AvailableIndices() []string

AvailableIndices creates a fresh slice of all available index currency codes.

func (*ExchangeBot) Conversion

func (bot *ExchangeBot) Conversion(dcrVal float64) *Conversion

Conversion attempts to multiply the supplied float with the default index. Nil pointer will be returned if there is no valid exchangeState.

func (*ExchangeBot) ConvertedRates

func (bot *ExchangeBot) ConvertedRates(code string) (*ExchangeRates, error)

ConvertedRates returns an ExchangeRates with a base of the provided currency code, if available.

func (*ExchangeBot) ConvertedState

func (bot *ExchangeBot) ConvertedState(code string) (*ExchangeBotState, error)

ConvertedState returns an ExchangeBotState with a base of the provided currency code, if available.

func (*ExchangeBot) ConvertedStateBytes

func (bot *ExchangeBot) ConvertedStateBytes(symbol string) ([]byte, error)

ConvertedStateBytes gives a JSON-encoded byte array of the currentState with a base of the provided currency code, if available.

func (*ExchangeBot) Cycle

func (bot *ExchangeBot) Cycle()

Cycle refreshes all expired exchanges.

func (*ExchangeBot) Indices

func (bot *ExchangeBot) Indices(token string) FiatIndices

Indices is the fiat indices for a given BTC index exchange.

func (*ExchangeBot) IsFailed

func (bot *ExchangeBot) IsFailed() bool

IsFailed is whether the failed flag was set during the last IndexUpdate or ExchangeUpdate. The failed flag is set when either no Bitcoin Index sources or no Decred Exchanges are up-to-date. Individual exchanges can be outdated/failed without IsFailed being false, as long as there is at least one Bitcoin index and one Decred exchange.

func (*ExchangeBot) Price

func (bot *ExchangeBot) Price() float64

Price gets the lastest Price in the default currency (BtcIndex).

func (*ExchangeBot) QuickDepth

func (bot *ExchangeBot) QuickDepth(token string) (chart []byte, err error)

QuickDepth returns the up-to-date depth chart data for the specified exchange, pulling from the cache if appropriate.

func (*ExchangeBot) QuickSticks

func (bot *ExchangeBot) QuickSticks(token string, rawBin string) ([]byte, error)

QuickSticks returns the up-to-date candlestick data for the specified exchange and bin width, pulling from the cache if appropriate.

func (*ExchangeBot) Rates

func (bot *ExchangeBot) Rates() *ExchangeRates

Rates is the current exchange rates for dcr and btc.

func (*ExchangeBot) Start

func (bot *ExchangeBot) Start(ctx context.Context, wg *sync.WaitGroup)

Start is the main ExchangeBot loop, reading from the exchange update channel and scheduling refresh cycles.

func (*ExchangeBot) State

func (bot *ExchangeBot) State() *ExchangeBotState

State is a copy of the current ExchangeBotState. A JSON-encoded byte array of the current state can be accessed through StateBytes().

func (*ExchangeBot) StateBytes

func (bot *ExchangeBot) StateBytes() []byte

StateBytes is a JSON-encoded byte array of the currentState.

func (*ExchangeBot) UpdateChannels

func (bot *ExchangeBot) UpdateChannels() *UpdateChannels

UpdateChannels creates an UpdateChannels, which holds a channel to receive exchange updates and a channel which is closed when the start loop exits.

type ExchangeBotConfig

type ExchangeBotConfig struct {
	Disabled       []string
	DataExpiry     string
	RequestExpiry  string
	BtcIndex       string
	Indent         bool
	MasterBot      string
	MasterCertFile string
}

ExchangeBotConfig is the configuration options for ExchangeBot. DataExpiry must be less than RequestExpiry. Recommend RequestExpiry > 2*DataExpiry, which will permit the exchange API request to fail a couple of times before the exchange's data is discarded.

type ExchangeBotState

type ExchangeBotState struct {
	BtcIndex string                    `json:"btc_index"`
	BtcPrice float64                   `json:"btc_fiat_price"`
	Price    float64                   `json:"price"`
	Volume   float64                   `json:"volume"`
	DcrBtc   map[string]*ExchangeState `json:"dcr_btc_exchanges"`
	// FiatIndices:
	// TODO: We only really need the BaseState for the fiat indices.
	FiatIndices map[string]*ExchangeState `json:"btc_indices"`
}

ExchangeBotState is the current known state of all exchanges, in a certain base currency, and a volume-averaged price and total volume in DCR.

func (*ExchangeBotState) BtcToFiat

func (state *ExchangeBotState) BtcToFiat(btc float64) float64

BtcToFiat converts an amount of Bitcoin to fiat using the current calculated exchange rate.

func (*ExchangeBotState) FiatToBtc

func (state *ExchangeBotState) FiatToBtc(fiat float64) float64

FiatToBtc converts an amount of fiat in the default index to a value in BTC.

func (*ExchangeBotState) VolumeOrderedExchanges

func (state *ExchangeBotState) VolumeOrderedExchanges() []*tokenedExchange

VolumeOrderedExchanges returns a list of tokenedExchange sorted by volume, highest volume first.

type ExchangeRates

type ExchangeRates struct {
	BtcIndex  string               `json:"btcIndex"`
	DcrPrice  float64              `json:"dcrPrice"`
	BtcPrice  float64              `json:"btcPrice"`
	Exchanges map[string]BaseState `json:"exchanges"`
}

ExchangeRates is the dcr and btc prices converted to fiat.

type ExchangeState

type ExchangeState struct {
	BaseState
	Depth        *DepthData                      `json:"depth,omitempty"`
	Candlesticks map[candlestickKey]Candlesticks `json:"candlesticks,omitempty"`
}

ExchangeState is the simple template for a price. The only member that is guaranteed is a price. For Decred exchanges, the volumes will also be populated.

func (*ExchangeState) HasCandlesticks

func (state *ExchangeState) HasCandlesticks() bool

HasCandlesticks checks for data in the candlesticks map.

func (*ExchangeState) HasDepth

func (state *ExchangeState) HasDepth() bool

HasDepth is true if the there is data in the depth field.

func (*ExchangeState) StickList

func (state *ExchangeState) StickList() string

StickList is a semicolon-delimited list of available binSize.

type ExchangeUpdate

type ExchangeUpdate struct {
	Token string
	State *ExchangeState
}

ExchangeUpdate packages the ExchangeState for the update channel.

type FiatIndices

type FiatIndices map[string]float64

FiatIndices maps currency codes to Bitcoin exchange rates.

type HuobiCandlestickData

type HuobiCandlestickData []*HuobiCandlestickPt

HuobiCandlestickData is a list of candlestick data pts.

type HuobiCandlestickPt

type HuobiCandlestickPt struct {
	ID     int64   `json:"id"` // ID is actually start time as unix stamp
	Open   float64 `json:"open"`
	Close  float64 `json:"close"`
	Low    float64 `json:"low"`
	High   float64 `json:"high"`
	Amount float64 `json:"amount"` // Volume BTC
	Vol    float64 `json:"vol"`    // Volume DCR
	Count  int64   `json:"count"`
}

HuobiCandlestickPt is a single candlestick pt in a Huobi API candelstick response.

type HuobiCandlestickResponse

type HuobiCandlestickResponse struct {
	HuobiResponse
	Data HuobiCandlestickData `json:"data"`
}

HuobiCandlestickResponse models the response from Huobi for candlestick data.

type HuobiDepthPts

type HuobiDepthPts [][2]float64

HuobiDepthPts is a list of tuples [price, volume].

type HuobiDepthResponse

type HuobiDepthResponse struct {
	HuobiResponse
	Tick HuobiDepthTick `json:"tick"`
}

HuobiDepthResponse models the response from a Huobi API depth chart response.

type HuobiDepthTick

type HuobiDepthTick struct {
	ID   int64         `json:"id"`
	Ts   int64         `json:"ts"`
	Bids HuobiDepthPts `json:"bids"`
	Asks HuobiDepthPts `json:"asks"`
}

HuobiDepthTick models the tick field of the Huobi depth chart response.

type HuobiExchange

type HuobiExchange struct {
	*CommonExchange
	Ok string
}

HuobiExchange is based in Hong Kong and Singapore.

func (*HuobiExchange) Refresh

func (huobi *HuobiExchange) Refresh()

Refresh retrieves and parses API data from Huobi.

type HuobiPriceResponse

type HuobiPriceResponse struct {
	HuobiResponse
	Tick HuobiPriceTick `json:"tick"`
}

HuobiPriceResponse models the JSON data returned from the Huobi API.

type HuobiPriceTick

type HuobiPriceTick struct {
	Amount  float64   `json:"amount"`
	Open    float64   `json:"open"`
	Close   float64   `json:"close"`
	High    float64   `json:"high"`
	ID      int64     `json:"id"`
	Count   int64     `json:"count"`
	Low     float64   `json:"low"`
	Version int64     `json:"version"`
	Ask     []float64 `json:"ask"`
	Vol     float64   `json:"vol"`
	Bid     []float64 `json:"bid"`
}

HuobiPriceTick models the "tick" field of the Huobi API response.

type HuobiResponse

type HuobiResponse struct {
	Status string `json:"status"`
	Ch     string `json:"ch"`
	Ts     int64  `json:"ts"`
}

HuobiResponse models the common response fields in all API BittrexResponseResult

type IndexUpdate

type IndexUpdate struct {
	Token   string
	Indices FiatIndices
}

IndexUpdate is sent from the Exchange to the ExchangeBot indexChan when new data is received.

type PoloniexCandlestickPt

type PoloniexCandlestickPt struct {
	Date            int64   `json:"date"`
	High            float64 `json:"high"`
	Low             float64 `json:"low"`
	Open            float64 `json:"open"`
	Close           float64 `json:"close"`
	Volume          float64 `json:"volume"`
	QuoteVolume     float64 `json:"quoteVolume"`
	WeightedAverage float64 `json:"weightedAverage"`
}

type PoloniexCandlestickResponse

type PoloniexCandlestickResponse []*PoloniexCandlestickPt

type PoloniexDepthArray

type PoloniexDepthArray []*PoloniexDepthPt

PoloniexDepthArray is a slice of depth chart data points.

type PoloniexDepthPt

type PoloniexDepthPt [2]interface{}

PoloniexDepthPt is a tuple of ["price", volume].

type PoloniexDepthResponse

type PoloniexDepthResponse struct {
	Asks     PoloniexDepthArray `json:"asks"`
	Bids     PoloniexDepthArray `json:"bids"`
	IsFrozen string             `json:"isFrozen"`
	Seq      int64              `json:"seq"`
}

PoloniexDepthResponse models the response from Poloniex for depth chart data.

type PoloniexExchange

type PoloniexExchange struct {
	*CommonExchange
	CurrencyPair string
	// contains filtered or unexported fields
}

PoloniexExchange is a U.S.-based exchange.

func (*PoloniexExchange) Refresh

func (poloniex *PoloniexExchange) Refresh()

Refresh retrieves and parses API data from Poloniex.

type PoloniexPair

type PoloniexPair struct {
	ID            int    `json:"id"`
	Last          string `json:"last"`
	LowestAsk     string `json:"lowestAsk"`
	HighestBid    string `json:"highestBid"`
	PercentChange string `json:"percentChange"`
	BaseVolume    string `json:"baseVolume"`
	QuoteVolume   string `json:"quoteVolume"`
	IsFrozen      string `json:"isFrozen"`
	High24hr      string `json:"high24hr"`
	Low24hr       string `json:"low24hr"`
}

PoloniexPair models the data returned from the Poloniex API.

type StringFloat

type StringFloat float64

StringFloat handles JSON marshaling of floats that are encoded as strings on the wire.

func (StringFloat) MarshalJSON

func (v StringFloat) MarshalJSON() ([]byte, error)

func (*StringFloat) UnmarshalJSON

func (v *StringFloat) UnmarshalJSON(b []byte) error

type URLs

type URLs struct {
	Price        string
	Stats        string
	Depth        string
	Candlesticks map[candlestickKey]string
	Websocket    string
}

URLs is a set of endpoints for an exchange's various datasets.

type UpdateChannels

type UpdateChannels struct {
	Exchange chan *ExchangeUpdate
	Index    chan *IndexUpdate
	Quit     chan struct{}
}

UpdateChannels are requested by the user with ExchangeBot.UpdateChannels.

type WebsocketProcessor

type WebsocketProcessor func([]byte)

WebsocketProcessor is a callback for new websocket messages from the server.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL