orderbook

package
v0.0.0-...-0658b27 Latest Latest
Warning

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

Go to latest
Published: May 1, 2024 License: MIT Imports: 16 Imported by: 182

README

GoCryptoTrader package Orderbook

Build Status Software License GoDoc Coverage Status Go Report Card

This orderbook package is part of the GoCryptoTrader codebase.

This is still in active development

You can track ideas, planned features and what's in progress on this Trello board: https://trello.com/b/ZAhMhpOy/gocryptotrader.

Join our slack to discuss all things related to GoCryptoTrader! GoCryptoTrader Slack

Current Features for orderbook

  • This package facilitates orderbook generation.

  • Attaches methods to an orderbook

    • To Return total Bids
    • To Return total Asks
    • Update orderbooks
  • Gets a loaded orderbook by exchange, asset type and currency pair.

  • This package is primarily used in conjunction with but not limited to the exchange interface system set by exchange wrapper orderbook functions in "exchange"_wrapper.go.

Examples below:

ob, err := yobitExchange.FetchOrderbook()
if err != nil {
	// Handle error
}

// Find total asks which also returns total orderbook value
totalAsks, totalOrderbookVal := ob.CalculateTotalAsks()
  • or if you have a routine setting an exchange orderbook you can access it via the package itself.
ob, err := orderbook.Get(...)
if err != nil {
	// Handle error
}
Please click GoDocs chevron above to view current GoDoc information for this package

Contribution

Please feel free to submit any pull requests or suggest any desired features to be added.

When submitting a PR, please abide by our coding guidelines:

  • Code must adhere to the official Go formatting guidelines (i.e. uses gofmt).
  • Code must be documented adhering to the official Go commentary guidelines.
  • Code must adhere to our coding style.
  • Pull requests need to be based on and opened against the master branch.

Donations

If this framework helped you in any way, or you would like to support the developers working on it, please donate Bitcoin to:

bc1qk0jareu4jytc0cfrhr5wgshsq8282awpavfahc

Documentation

Index

Constants

View Source
const FullLiquidityExhaustedPercentage = -100

FullLiquidityExhaustedPercentage defines when a book has been completely wiped out of potential liquidity.

Variables

View Source
var (
	// ErrOrderbookInvalid defines an error for when the orderbook is invalid and
	// should not be trusted
	ErrOrderbookInvalid = errors.New("orderbook data integrity compromised")
	// ErrInvalidAction defines and error when an action is invalid
	ErrInvalidAction = errors.New("invalid action")
)

Functions

func SubscribeToExchangeOrderbooks

func SubscribeToExchangeOrderbooks(exchange string) (dispatch.Pipe, error)

SubscribeToExchangeOrderbooks returns a pipe to an exchange feed

Types

type Action

type Action uint8

Action defines a set of differing states required to implement an incoming orderbook update used in conjunction with UpdateEntriesByID

const (
	// Amend applies amount adjustment by ID
	Amend Action = iota + 1
	// Delete removes price level from book by ID
	Delete
	// Insert adds price level to book
	Insert
	// UpdateInsert on conflict applies amount adjustment or appends new amount
	// to book
	UpdateInsert
)

type Base

type Base struct {
	Bids Items
	Asks Items

	Exchange string
	Pair     currency.Pair
	Asset    asset.Item

	LastUpdated  time.Time
	LastUpdateID int64
	// PriceDuplication defines whether an orderbook can contain duplicate
	// prices in a payload
	PriceDuplication bool
	IsFundingRate    bool
	// VerifyOrderbook allows for a toggle between orderbook verification set by
	// user configuration, this allows for a potential processing boost but
	// a potential for orderbook integrity being deminished.
	VerifyOrderbook bool `json:"-"`
	// RestSnapshot defines if the depth was applied via the REST protocol thus
	// an update cannot be applied via websocket mechanics and a resubscription
	// would need to take place to maintain book integrity
	RestSnapshot bool
	// Checks if the orderbook needs ID alignment as well as price alignment
	IDAlignment bool
	// Determines if there is a max depth of orderbooks and after an append we
	// should remove any items that are outside of this scope. Kraken utilises
	// this field.
	MaxDepth int
	// ChecksumStringRequired defines if the checksum is built from the raw
	// string representations of the price and amount. This helps alleviate any
	// potential rounding issues.
	ChecksumStringRequired bool
}

Base holds the fields for the orderbook base

func Get

func Get(exchange string, p currency.Pair, a asset.Item) (*Base, error)

Get checks and returns the orderbook given an exchange name and currency pair

func (*Base) GetAveragePrice

func (b *Base) GetAveragePrice(buy bool, amount float64) (float64, error)

GetAveragePrice finds the average buy or sell price of a specified amount. It finds the nominal amount spent on the total purchase or sell and uses it to find the average price for an individual unit bought or sold

func (*Base) GetDepth

func (b *Base) GetDepth() (*Depth, error)

GetDepth returns the concrete book allowing the caller to stream orderbook changes

func (*Base) Process

func (b *Base) Process() error

Process processes incoming orderbooks, creating or updating the orderbook list

func (*Base) SimulateOrder

func (b *Base) SimulateOrder(amount float64, buy bool) (*WhaleBombResult, error)

SimulateOrder simulates an order

func (*Base) TotalAsksAmount

func (b *Base) TotalAsksAmount() (amountCollated, total float64)

TotalAsksAmount returns the total amount of asks and the total orderbook asks value

func (*Base) TotalBidsAmount

func (b *Base) TotalBidsAmount() (amountCollated, total float64)

TotalBidsAmount returns the total amount of bids and the total orderbook bids value

func (*Base) Verify

func (b *Base) Verify() error

Verify ensures that the orderbook items are correctly sorted prior to being set and will reject any book with incorrect values. Bids should always go from a high price to a low price and Asks should always go from a low price to a higher price

func (*Base) WhaleBomb

func (b *Base) WhaleBomb(priceTarget float64, buy bool) (*WhaleBombResult, error)

WhaleBomb finds the amount required to target a price

type DeploymentAction

type DeploymentAction struct {
	ReferencePrice       float64
	TranchePositionPrice float64
	BaseAmount           float64
	QuoteAmount          float64
	Tranches             Items
	FullLiquidityUsed    bool
}

DeploymentAction defines deployment information on a liquidity side.

type Depth

type Depth struct {
	alert.Notice
	// contains filtered or unexported fields
}

Depth defines a linked list of orderbook items

func DeployDepth

func DeployDepth(exchange string, p currency.Pair, a asset.Item) (*Depth, error)

DeployDepth sets a depth struct and returns a depth pointer. This allows for the loading of a new orderbook snapshot and incremental updates via the streaming package.

func GetDepth

func GetDepth(exchange string, p currency.Pair, a asset.Item) (*Depth, error)

GetDepth returns a Depth pointer allowing the caller to stream orderbook changes

func NewDepth

func NewDepth(id uuid.UUID) *Depth

NewDepth returns a new depth item

func (*Depth) AssignOptions

func (d *Depth) AssignOptions(b *Base)

AssignOptions assigns the initial options for the depth instance

func (*Depth) DeleteBidAskByID

func (d *Depth) DeleteBidAskByID(update *Update, bypassErr bool) error

DeleteBidAskByID deletes a price level by ID

func (*Depth) GetAskLength

func (d *Depth) GetAskLength() (int, error)

GetAskLength returns length of asks

func (*Depth) GetBestAsk

func (d *Depth) GetBestAsk() (float64, error)

GetBestAsk returns the best ask price

func (*Depth) GetBestBid

func (d *Depth) GetBestBid() (float64, error)

GetBestBid returns the best bid price

func (*Depth) GetBidLength

func (d *Depth) GetBidLength() (int, error)

GetBidLength returns length of bids

func (*Depth) GetImbalance

func (d *Depth) GetImbalance() (float64, error)

GetImbalance returns top orderbook imbalance

func (*Depth) GetMidPrice

func (d *Depth) GetMidPrice() (float64, error)

GetMidPrice returns the mid price between the ask and bid spread

func (*Depth) GetName

func (d *Depth) GetName() string

GetName returns name of exchange

func (*Depth) GetPair

func (d *Depth) GetPair() (currency.Pair, error)

GetPair returns the pair associated with the depth

func (*Depth) GetSpreadAmount

func (d *Depth) GetSpreadAmount() (float64, error)

GetSpreadAmount returns the spread as a quotation amount

func (*Depth) GetSpreadPercentage

func (d *Depth) GetSpreadPercentage() (float64, error)

GetSpreadPercentage returns the spread as a percentage

func (*Depth) GetTranches

func (d *Depth) GetTranches(count int) (ask, bid []Item, err error)

GetTranches returns the desired tranche for the required depth count. If count is 0, it will return the entire orderbook. Count == 1 will retrieve the best bid and ask. If the required count exceeds the orderbook depth, it will return the entire orderbook.

func (*Depth) GetUnsafe

func (d *Depth) GetUnsafe() *Unsafe

GetUnsafe returns an unsafe orderbook with pointers to the linked list heads.

func (*Depth) HitTheBids

func (d *Depth) HitTheBids(amount, refPrice float64, purchase bool) (*Movement, error)

HitTheBids derives full orderbook slippage information from reference price using an amount. Purchase refers to how much quote currency is desired else the amount would refer to base currency deployed to orderbook bid side.

func (*Depth) HitTheBidsByImpactSlippage

func (d *Depth) HitTheBidsByImpactSlippage(maxSlippage, refPrice float64) (*Movement, error)

HitTheBidsByImpactSlippage hits the bids by the required impact slippage percentage, calculated from the reference price and returns orderbook movement details for the bid side.

func (*Depth) HitTheBidsByImpactSlippageFromBest

func (d *Depth) HitTheBidsByImpactSlippageFromBest(maxSlippage float64) (*Movement, error)

HitTheBidsByImpactSlippageFromBest hits the bids by the required impact slippage percentage, calculated from the best bid price and returns orderbook movement details for the bid side.

func (*Depth) HitTheBidsByImpactSlippageFromMid

func (d *Depth) HitTheBidsByImpactSlippageFromMid(maxSlippage float64) (*Movement, error)

HitTheBidsByImpactSlippageFromMid hits the bids by the required impact slippage percentage, calculated from the mid price and returns orderbook movement details for the bid side.

func (*Depth) HitTheBidsByNominalSlippage

func (d *Depth) HitTheBidsByNominalSlippage(maxSlippage, refPrice float64) (*Movement, error)

HitTheBidsByNominalSlippage hits the bids by the required nominal slippage percentage, calculated from the reference price and returns orderbook movement details for the bid side.

func (*Depth) HitTheBidsByNominalSlippageFromBest

func (d *Depth) HitTheBidsByNominalSlippageFromBest(maxSlippage float64) (*Movement, error)

HitTheBidsByNominalSlippageFromBest hits the bids by the required nominal slippage percentage, calculated from the best bid price and returns orderbook movement details for the bid side.

func (*Depth) HitTheBidsByNominalSlippageFromMid

func (d *Depth) HitTheBidsByNominalSlippageFromMid(maxSlippage float64) (*Movement, error)

HitTheBidsByNominalSlippageFromMid hits the bids by the required nominal slippage percentage, calculated from the mid price and returns orderbook movement details for the bid side.

func (*Depth) HitTheBidsFromBest

func (d *Depth) HitTheBidsFromBest(amount float64, purchase bool) (*Movement, error)

HitTheBidsFromBest derives full orderbook slippage information from best bid price using an amount. Purchase refers to how much quote currency is desired else the amount would refer to base currency deployed to orderbook bid side.

func (*Depth) HitTheBidsFromMid

func (d *Depth) HitTheBidsFromMid(amount float64, purchase bool) (*Movement, error)

HitTheBidsFromMid derives full orderbook slippage information from mid price using an amount. Purchase refers to how much quote currency is desired else the amount would refer to base currency deployed to orderbook bid side.

func (*Depth) InsertBidAskByID

func (d *Depth) InsertBidAskByID(update *Update) error

InsertBidAskByID inserts new updates

func (*Depth) Invalidate

func (d *Depth) Invalidate(withReason error) error

Invalidate flushes all values back to zero so as to not allow strategy traversal on compromised data.

func (*Depth) IsFundingRate

func (d *Depth) IsFundingRate() bool

IsFundingRate returns if the depth is a funding rate

func (*Depth) IsRESTSnapshot

func (d *Depth) IsRESTSnapshot() (bool, error)

IsRESTSnapshot returns if the depth item was updated via REST

func (*Depth) IsValid

func (d *Depth) IsValid() bool

IsValid returns if the underlying book is valid.

func (*Depth) LastUpdateID

func (d *Depth) LastUpdateID() (int64, error)

LastUpdateID returns the last Update ID

func (*Depth) LiftTheAsks

func (d *Depth) LiftTheAsks(amount, refPrice float64, purchase bool) (*Movement, error)

LiftTheAsks derives full orderbook slippage information from reference price using an amount. Purchase refers to how much base currency is desired else the amount would refer to quote currency deployed to orderbook ask side.

func (*Depth) LiftTheAsksByImpactSlippage

func (d *Depth) LiftTheAsksByImpactSlippage(maxSlippage, refPrice float64) (*Movement, error)

LiftTheAsksByImpactSlippage lifts the asks by the required impact slippage percentage, calculated from the reference price and returns orderbook movement details for the ask side.

func (*Depth) LiftTheAsksByImpactSlippageFromBest

func (d *Depth) LiftTheAsksByImpactSlippageFromBest(maxSlippage float64) (*Movement, error)

LiftTheAsksByImpactSlippageFromBest lifts the asks by the required impact slippage percentage, calculated from the best ask price and returns orderbook movement details for the ask side.

func (*Depth) LiftTheAsksByImpactSlippageFromMid

func (d *Depth) LiftTheAsksByImpactSlippageFromMid(maxSlippage float64) (*Movement, error)

LiftTheAsksByImpactSlippageFromMid lifts the asks by the required impact slippage percentage, calculated from the mid price and returns orderbook movement details for the ask side.

func (*Depth) LiftTheAsksByNominalSlippage

func (d *Depth) LiftTheAsksByNominalSlippage(maxSlippage, refPrice float64) (*Movement, error)

LiftTheAsksByNominalSlippage lifts the asks by the required nominal slippage percentage, calculated from the reference price and returns orderbook movement details for the ask side.

func (*Depth) LiftTheAsksByNominalSlippageFromBest

func (d *Depth) LiftTheAsksByNominalSlippageFromBest(maxSlippage float64) (*Movement, error)

LiftTheAsksByNominalSlippageFromBest lifts the asks by the required nominal slippage percentage, calculated from the best ask price and returns orderbook movement details for the ask side.

func (*Depth) LiftTheAsksByNominalSlippageFromMid

func (d *Depth) LiftTheAsksByNominalSlippageFromMid(maxSlippage float64) (*Movement, error)

LiftTheAsksByNominalSlippageFromMid lifts the asks by the required nominal slippage percentage, calculated from the mid price and returns orderbook movement details for the ask side.

func (*Depth) LiftTheAsksFromBest

func (d *Depth) LiftTheAsksFromBest(amount float64, purchase bool) (*Movement, error)

LiftTheAsksFromBest derives full orderbook slippage information from best ask price using an amount. Purchase refers to how much base currency is desired else the amount would refer to quote currency deployed to orderbook ask side.

func (*Depth) LiftTheAsksFromMid

func (d *Depth) LiftTheAsksFromMid(amount float64, purchase bool) (*Movement, error)

LiftTheAsksFromMid derives full orderbook slippage information from mid price using an amount. Purchase refers to how much base currency is desired else the amount would refer to quote currency deployed to orderbook ask side.

func (*Depth) LoadSnapshot

func (d *Depth) LoadSnapshot(bids, asks []Item, lastUpdateID int64, lastUpdated time.Time, updateByREST bool) error

LoadSnapshot flushes the bids and asks with a snapshot

func (*Depth) Publish

func (d *Depth) Publish()

Publish alerts any subscribed routines using a dispatch mux

func (*Depth) Retrieve

func (d *Depth) Retrieve() (*Base, error)

Retrieve returns the orderbook base a copy of the underlying linked list spread

func (*Depth) TotalAskAmounts

func (d *Depth) TotalAskAmounts() (liquidity, value float64, err error)

TotalAskAmounts returns the total amount of asks and the total orderbook asks value

func (*Depth) TotalBidAmounts

func (d *Depth) TotalBidAmounts() (liquidity, value float64, err error)

TotalBidAmounts returns the total amount of bids and the total orderbook bids value

func (*Depth) UpdateBidAskByID

func (d *Depth) UpdateBidAskByID(update *Update) error

UpdateBidAskByID amends details by ID

func (*Depth) UpdateBidAskByPrice

func (d *Depth) UpdateBidAskByPrice(update *Update) error

UpdateBidAskByPrice updates the bid and ask spread by supplied updates, this will trim total length of depth level to a specified supplied number

func (*Depth) UpdateInsertByID

func (d *Depth) UpdateInsertByID(update *Update) error

UpdateInsertByID updates or inserts by ID at current price level.

type Exchange

type Exchange struct {
	ID uuid.UUID
	// contains filtered or unexported fields
}

Exchange defines a holder for the exchange specific depth items with a specific ID associated with that exchange

type Item

type Item struct {
	Amount float64
	// StrAmount is a string representation of the amount. e.g. 0.00000100 this
	// parsed as a float will constrict comparison to 1e-6 not 1e-8 or
	// potentially will round value which is not ideal.
	StrAmount string
	Price     float64
	// StrPrice is a string representation of the price. e.g. 0.00000100 this
	// parsed as a float will constrict comparison to 1e-6 not 1e-8 or
	// potentially will round value which is not ideal.
	StrPrice string
	ID       int64

	// Funding rate field
	Period int64

	// Contract variables
	LiquidationOrders int64
	OrderCount        int64
}

Item stores the amount and price values

type Items

type Items []Item

Items defines a slice of orderbook items

func (Items) FindNominalAmount

func (elem Items) FindNominalAmount(amount float64) (aggNominalAmount, remainingAmount float64)

FindNominalAmount finds the nominal amount spent in terms of the quote If the orderbook doesn't have enough liquidity it returns a non zero remaining amount value

func (*Items) Reverse

func (elem *Items) Reverse()

Reverse reverses the order of orderbook items; some bid/asks are returned in either ascending or descending order. One bid or ask slice depending on what's received can be reversed. This is usually faster than using a sort algorithm as the algorithm could be impeded by a worst case time complexity when elements are shifted as opposed to just swapping element values.

func (*Items) SortAsks

func (elem *Items) SortAsks()

SortAsks sorts ask items to the correct ascending order if pricing values are scattered. If order from exchange is descending consider using the Reverse function.

func (*Items) SortBids

func (elem *Items) SortBids()

SortBids sorts bid items to the correct descending order if pricing values are scattered. If order from exchange is ascending consider using the Reverse function.

type Movement

type Movement struct {
	// NominalPercentage (real-world) defines how far in percentage terms is
	// your average order price away from the reference price.
	NominalPercentage float64
	// ImpactPercentage defines how far the price has moved on the order book
	// from the reference price.
	ImpactPercentage float64
	// SlippageCost is the cost of the slippage. This is priced in quotation.
	SlippageCost float64
	// StartPrice defines the reference price or the head of the orderbook side.
	StartPrice float64
	// EndPrice defines where the price has ended on the orderbook side.
	EndPrice float64
	// Sold defines the amount of currency sold.
	Sold float64
	// Purchases defines the amount of currency purchased.
	Purchased float64
	// AverageOrderCost defines the average order cost of position as it slips
	// through the orderbook tranches.
	AverageOrderCost float64
	// FullBookSideConsumed defines if the orderbook liquidty has been consumed
	// by the requested amount. This might not represent the actual book on the
	// exchange as they might restrict the amount of information being passed
	// back from either a REST request or websocket stream.
	FullBookSideConsumed bool
}

Movement defines orderbook traversal details from either hitting the bids or lifting the asks.

type Node

type Node struct {
	Value Item
	Next  *Node
	Prev  *Node
	// contains filtered or unexported fields
}

Node defines a linked list node for an orderbook item

type Outbound

type Outbound interface {
	Retrieve() (*Base, error)
}

Outbound restricts outbound usage of depth. NOTE: Type assert to *orderbook.Depth or alternatively retrieve orderbook.Unsafe type to access underlying linked list.

type Service

type Service struct {
	*dispatch.Mux
	// contains filtered or unexported fields
}

Service provides a store for difference exchange orderbooks

func (*Service) DeployDepth

func (s *Service) DeployDepth(exchange string, p currency.Pair, a asset.Item) (*Depth, error)

DeployDepth used for subsystem deployment creates a depth item in the struct then returns a ptr to that Depth item

func (*Service) GetDepth

func (s *Service) GetDepth(exchange string, p currency.Pair, a asset.Item) (*Depth, error)

GetDepth returns the actual depth struct for potential subsystems and strategies to interact with

func (*Service) Retrieve

func (s *Service) Retrieve(exchange string, p currency.Pair, a asset.Item) (*Base, error)

Retrieve gets orderbook depth data from the associated linked list and returns the base equivalent copy

func (*Service) Update

func (s *Service) Update(b *Base) error

Update stores orderbook data

type SideAmounts

type SideAmounts struct {
	Tranches   int64
	QuoteValue float64
	BaseAmount float64
}

SideAmounts define the amounts total for the tranches, total value in quotation and the cumulative base amounts.

type Unsafe

type Unsafe struct {
	BidHead **Node
	AskHead **Node

	// UpdatedViaREST defines if sync manager is updating this book via the REST
	// protocol then this book is not considered live and cannot be trusted.
	UpdatedViaREST *bool
	LastUpdated    *time.Time
	*alert.Notice
	// contains filtered or unexported fields
}

Unsafe is an exported linked list reference to the current bid/ask heads and a reference to the underlying depth mutex. This allows for the exposure of the internal list to an external strategy or subsystem. The bid and ask fields point to the actual head fields contained on both linked list structs, so that this struct can be reusable and not needed to be called on each inspection.

func (*Unsafe) CheckAskLiquidity

func (src *Unsafe) CheckAskLiquidity() error

CheckAskLiquidity determines if the liquidity is sufficient for usage

func (*Unsafe) CheckBidLiquidity

func (src *Unsafe) CheckBidLiquidity() error

CheckBidLiquidity determines if the liquidity is sufficient for usage

func (*Unsafe) GetAskLiquidity

func (src *Unsafe) GetAskLiquidity() (*Node, error)

GetAskLiquidity gets the head node for the ask liquidity

func (*Unsafe) GetBestAsk

func (src *Unsafe) GetBestAsk() (float64, error)

GetBestAsk returns the top ask price

func (*Unsafe) GetBestBid

func (src *Unsafe) GetBestBid() (float64, error)

GetBestBid returns the top bid price

func (*Unsafe) GetBidLiquidity

func (src *Unsafe) GetBidLiquidity() (*Node, error)

GetBidLiquidity gets the head node for the bid liquidity

func (*Unsafe) GetImbalance

func (src *Unsafe) GetImbalance() (float64, error)

GetImbalance returns difference between the top bid and top ask amounts divided by its sum.

func (*Unsafe) GetLiquidity

func (src *Unsafe) GetLiquidity() (ask, bid *Node, err error)

GetLiquidity checks and returns nodes to the top bids and asks

func (*Unsafe) GetMidPrice

func (src *Unsafe) GetMidPrice() (float64, error)

GetMidPrice returns the average between the top bid and top ask.

func (*Unsafe) GetSpread

func (src *Unsafe) GetSpread() (float64, error)

GetSpread returns the spread between the top bid and top asks.

func (*Unsafe) IsStreaming

func (src *Unsafe) IsStreaming() bool

IsStreaming returns if the orderbook is updated by a streaming protocol and is most likely more up to date than that of a REST protocol update.

func (*Unsafe) Lock

func (src *Unsafe) Lock()

Lock locks down the underlying linked list which inhibits all pending updates for strategy inspection.

func (*Unsafe) LockWith

func (src *Unsafe) LockWith(dst sync.Locker)

LockWith locks both books for the context of cross orderbook inspection. WARNING: When inspecting diametrically opposed books a higher order mutex MUST be used or a dead lock will occur.

func (*Unsafe) Unlock

func (src *Unsafe) Unlock()

Unlock unlocks the underlying linked list after inspection by a strategy to resume normal operations

func (*Unsafe) UnlockWith

func (src *Unsafe) UnlockWith(dst sync.Locker)

UnlockWith unlocks both books for the context of cross orderbook inspection

type Update

type Update struct {
	UpdateID   int64 // Used when no time is provided
	UpdateTime time.Time
	Asset      asset.Item
	Action
	Bids []Item
	Asks []Item
	Pair currency.Pair
	// Checksum defines the expected value when the books have been verified
	Checksum uint32
}

Update and things and stuff

type WhaleBombResult

type WhaleBombResult struct {
	Amount               float64
	MinimumPrice         float64
	MaximumPrice         float64
	PercentageGainOrLoss float64
	Orders               Items
	Status               string
}

WhaleBombResult returns the whale bomb result

Jump to

Keyboard shortcuts

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