portfolio

package
v1.0.1 Latest Latest
Warning

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

Go to latest
Published: Apr 24, 2022 License: MIT Imports: 18 Imported by: 0

README

GoCryptoTrader Backtester: Portfolio package

Build Status Software License GoDoc Coverage Status Go Report Card

This portfolio 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

Portfolio package overview

The portfolio is one of the most critical packages in the GoCryptoTrader Backtester. It is responsible for making sure that all orders, simulated or otherwise are within all defined risk and sizing rules defined in the config. The portfolio receives three kinds of events to be processed: OnSignal, OnFill and Update

The following steps are taken for the OnSignal function:

  • Retrieve previous iteration's holdings data
  • If a buy order signal is received, ensure there are enough funds
  • If a sell order signal is received, ensure there are any holdings to sell
  • If any other direction, return
  • The portfolio manager will then size the order according to the exchange asset currency pair's settings along with the portfolio manager's own sizing rules
    • In the event that the order is to large, the sizing package will reduce the order until it fits that limit, inclusive of fees.
    • When an order is sized under the limits, an order event cannot be raised an no order will be submitted by the exchange
    • The portfolio manager's sizing rules override any CurrencySettings' rules if the sizing is outside the portfolio manager's
  • The portfolio manager will then assess the risk of the order, it will compare existing holdings and ensures that if an order is placed, it will not go beyond risk rules as defined in the config
  • If the risk is too high, the order signal will be changed to CouldNotBuy, CouldNotSell or DoNothing
  • If the order is deemed appropriate, the order event will be returned and appended to the event queue for the exchange event handler to run and place the order

The following steps are taken for the OnFill function:

  • Previous holdings are retrieved and amended with new order information.
    • The stats for the exchange asset currency pair will be updated to reflect the order and pricing
  • The order will be added to the compliance manager for analysis in future events or the statistics package

The following steps are taken for the Update function:

  • The Update function is called when orders are not placed, this allows for the portfolio manager to still keep track of pricing and holding statistics, while not needing to process any orders
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

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Handler

type Handler interface {
	OnSignal(signal.Event, *exchange.Settings, funding.IPairReserver) (*order.Order, error)
	OnFill(fill.Event, funding.IPairReader) (*fill.Fill, error)

	GetLatestOrderSnapshotForEvent(common.EventHandler) (compliance.Snapshot, error)
	GetLatestOrderSnapshots() ([]compliance.Snapshot, error)

	ViewHoldingAtTimePeriod(common.EventHandler) (*holdings.Holding, error)

	UpdateHoldings(common.DataEventHandler, funding.IPairReader) error

	GetComplianceManager(string, asset.Item, currency.Pair) (*compliance.Manager, error)

	SetFee(string, asset.Item, currency.Pair, decimal.Decimal)
	GetFee(string, asset.Item, currency.Pair) decimal.Decimal

	Reset()
	// contains filtered or unexported methods
}

Handler contains all functions expected to operate a portfolio manager

type Portfolio

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

Portfolio stores all holdings and rules to assess orders, allowing the portfolio manager to modify, accept or reject strategy signals

func Setup

func Setup(sh SizeHandler, r risk.Handler, riskFreeRate decimal.Decimal) (*Portfolio, error)

Setup creates a portfolio manager instance and sets private fields

func (*Portfolio) GetComplianceManager

func (p *Portfolio) GetComplianceManager(exchangeName string, a asset.Item, cp currency.Pair) (*compliance.Manager, error)

GetComplianceManager returns the order snapshots for a given exchange, asset, pair

func (*Portfolio) GetFee

func (p *Portfolio) GetFee(exchangeName string, a asset.Item, cp currency.Pair) decimal.Decimal

GetFee can panic for bad requests, but why are you getting things that don't exist?

func (*Portfolio) GetLatestHoldingsForAllCurrencies

func (p *Portfolio) GetLatestHoldingsForAllCurrencies() []holdings.Holding

GetLatestHoldingsForAllCurrencies will return the current holdings for all loaded currencies this is useful to assess the position of your entire portfolio in order to help with risk decisions

func (*Portfolio) GetLatestOrderSnapshotForEvent

func (p *Portfolio) GetLatestOrderSnapshotForEvent(e common.EventHandler) (compliance.Snapshot, error)

GetLatestOrderSnapshotForEvent gets orders related to the event

func (*Portfolio) GetLatestOrderSnapshots

func (p *Portfolio) GetLatestOrderSnapshots() ([]compliance.Snapshot, error)

GetLatestOrderSnapshots returns the latest snapshots from all stored pair data

func (*Portfolio) OnFill

func (p *Portfolio) OnFill(ev fill.Event, funding funding.IPairReader) (*fill.Fill, error)

OnFill processes the event after an order has been placed by the exchange. Its purpose is to track holdings for future portfolio decisions.

func (*Portfolio) OnSignal

func (p *Portfolio) OnSignal(ev signal.Event, cs *exchange.Settings, funds funding.IPairReserver) (*order.Order, error)

OnSignal receives the event from the strategy on whether it has signalled to buy, do nothing or sell on buy/sell, the portfolio manager will size the order and assess the risk of the order if successful, it will pass on an order.Order to be used by the exchange event handler to place an order based on the portfolio manager's recommendations

func (*Portfolio) Reset

func (p *Portfolio) Reset()

Reset returns the portfolio manager to its default state

func (*Portfolio) SetFee

func (p *Portfolio) SetFee(exch string, a asset.Item, cp currency.Pair, fee decimal.Decimal)

SetFee sets the fee rate

func (*Portfolio) SetupCurrencySettingsMap

func (p *Portfolio) SetupCurrencySettingsMap(settings *exchange.Settings) (*Settings, error)

SetupCurrencySettingsMap ensures a map is created and no panics happen

func (*Portfolio) UpdateHoldings

func (p *Portfolio) UpdateHoldings(ev common.DataEventHandler, funds funding.IPairReader) error

UpdateHoldings updates the portfolio holdings for the data event

func (*Portfolio) ViewHoldingAtTimePeriod

func (p *Portfolio) ViewHoldingAtTimePeriod(ev common.EventHandler) (*holdings.Holding, error)

ViewHoldingAtTimePeriod retrieves a snapshot of holdings at a specific time period, returning empty when not found

type Settings

type Settings struct {
	Fee               decimal.Decimal
	BuySideSizing     exchange.MinMax
	SellSideSizing    exchange.MinMax
	Leverage          exchange.Leverage
	HoldingsSnapshots []holdings.Holding
	ComplianceManager compliance.Manager
}

Settings holds all important information for the portfolio manager to assess purchasing decisions

func (*Settings) GetHoldingsForTime

func (e *Settings) GetHoldingsForTime(t time.Time) holdings.Holding

GetHoldingsForTime returns the holdings for a time period, or an empty holding if not found

func (*Settings) GetLatestHoldings

func (e *Settings) GetLatestHoldings() holdings.Holding

GetLatestHoldings returns the latest holdings after being sorted by time

type SizeHandler

type SizeHandler interface {
	SizeOrder(order.Event, decimal.Decimal, *exchange.Settings) (*order.Order, error)
}

SizeHandler is the interface to help size orders

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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