techan

package module
v1.0.1 Latest Latest
Warning

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

Go to latest
Published: Aug 23, 2024 License: MIT Imports: 10 Imported by: 1

README

Techan

TechAn is a technical analysis library for Go! It provides a suite of tools and frameworks to analyze financial data and make trading decisions.

NOTE: This is my fork of the original techan library found at https://github.com/sdcoffey/techan. My fork preserves the structure of the timeseries and inidicator calculation while completely overhauling the strategy and trade simulation to make it more functional for my real use.

Features

  • Basic and advanced technical analysis indicators
  • Strategy building
  • Backtesting and account simulation

Installation

$ go get github.com/schmidthole/techan

Examples

Quickstart
series := techan.NewTimeSeries()

// fetch this from your preferred exchange
dataset := [][]string{
	// Timestamp, Open, Close, High, Low, volume
	{"1234567", "1", "2", "3", "5", "6"},
}

for _, datum := range dataset {
	start, _ := strconv.ParseInt(datum[0], 10, 64)
	period := techan.NewTimePeriod(time.Unix(start, 0), time.Hour*24)

	candle := techan.NewCandle(period)
	candle.OpenPrice = big.NewFromString(datum[1])
	candle.ClosePrice = big.NewFromString(datum[2])
	candle.MaxPrice = big.NewFromString(datum[3])
	candle.MinPrice = big.NewFromString(datum[4])

	series.AddCandle(candle)
}

closePrices := techan.NewClosePriceIndicator(series)
movingAverage := techan.NewEMAIndicator(closePrices, 10) // Create an exponential moving average with a window of 10

fmt.Println(movingAverage.Calculate(0).FormattedString(2))
Creating trading strategies

A Strategy in Techan is the application of a Rule against a particular security/asset. For ease of reference, the Strategy struct contains the original Timeseries, all Indicators used to calculate the Rule, and the rull itself.

// using the timeseries and indicators from above...

// we simply create a rule that is satisfied if the price is above the moving average.
rule := OverIndicatorRule {
    First: movingAverage,
    Second: closePrices
}

strategy := Strategy{
    Security: "TEST",
    Timeseries: series,
    Indicators: map[string]Indicator{
        "ema10": movingAverage,
    },
    Rule: rule,
}

Strategies against individual securities/assets can be combined into a more comprehensive strategy using an Allocator. An allocator is simply an interface that accepts a list of strategies and outputs a portfolio allocation. This can be as simple or as complex as needed.

// again using the strategy defined above...

// we create a naive allocator which allows a single position to be 50% of a portfolio and 100% of a portfoliio
// to be allocated.
allocator := NewNaiveAllocator(big.NewDecimal(0.5), big.NewDecimal(1.0))

allocations := allocator.Allocate(0, []Strategy{strategy})

Using the outputted portfolio Allocations, we can then create a TradePlan by combining information from an Account. The TradePlan will use the current security prices, open positions in the account, and the allocations provided to identify the orders which can be placed to achieve the desired allocation. This can be used to calculate orders to execute with a broker based on the strategy results.

account := NewAccount()
account.Deposit(big.NewDecimal(10000.00))

// create pricing data from timeseries candles above.
pricing := Pricing{
    "ONE": big.NewDecimal(2.0)
}

tradePlan, _ := CreateTradePlan(allocations, pricing, account)

Putting it all together, we can use all of the components to run a full backtest of a strategy against the historical Timeseries data. Combining multiple Strategy objects along with the Allocator allow for complex strategies to be modelled over time.

// we are still using everuyting defined above...

backtest := NewBacktest([]Strategy{strategy}, allocator, account)
history, _ := backtest.Run()

Running a backtest will about an AccountHistory object, which contains all of the relevant backtest snapshots/results over time. The account history can be used to perform analysis of the strategy's performance metrics.

profit := history.TotalProfit()
Credits

Techan is heavily influenced by the great ta4j. Many of the ideas and frameworks in this library owe their genesis to the great work done over there.

License

Techan is released under the MIT license. See LICENSE for details.

Documentation

Index

Examples

Constants

View Source
const (
	SimpleDateTimeFormat = "01/02/2006T15:04:05"
	SimpleDateFormat     = "01/02/2006"

	SimpleTimeFormat   = "15:04:05"
	SimpleDateFormatV2 = "2006-01-02"
)

Constants representing basic, human-readable and writable date formats

Variables

View Source
var (
	SimpleTimeFomatRegex    = regexp.MustCompile(`T\d{2}:\d{2}:\d{2}`)
	SimpleDateFormatV2Regex = regexp.MustCompile(`\d{4}-\d{2}-\d{2}`)
)

Constants representing regexes for parsing datetimes

Functions

func Abs

func Abs(b int) int

Abs returns the absolute value of the passed-in integer

func CashToShares

func CashToShares(assetPrice big.Decimal, cash big.Decimal) big.Decimal

func Max

func Max(i, j int) int

Max returns the larger of the two integers passed in

func Min

func Min(i, j int) int

Min returns the smaller integer of the two integers passed in

func Pow

func Pow(i, j int) int

Pow returns the first integer to the power of the second integer

Types

type Account

type Account struct {
	Positions   map[string]*Position
	Cash        big.Decimal
	TradeRecord []*Order
}

Account is an object describing a trading account, including trading record, open positions and current cash on hand.

func NewAccount

func NewAccount() (a *Account)

NewAccount returns a new Account

func (*Account) Deposit

func (a *Account) Deposit(cash big.Decimal)

Enters a cash deposit into the account structure

func (*Account) Equity

func (a *Account) Equity() big.Decimal

Calculates the total equity of the account including unrealized equity for open positions

func (*Account) ExecuteOrder

func (a *Account) ExecuteOrder(order *Order) error

Execute an order against the account

func (*Account) ExportSnapshot

func (a *Account) ExportSnapshot(period TimePeriod) *AccountSnapshot

Exports a snapshot of the current account state to be used in the account history and analysis tooling.

func (*Account) HasSufficientFunds

func (a *Account) HasSufficientFunds(order *Order) bool

Checks whether the account has enough funds to execute an order. We assume there is always enough funds for a sell order since the system is currently long only.

func (*Account) OpenPosition

func (a *Account) OpenPosition(security string) (*Position, bool)

CurrentPosition returns the current position in this record

func (*Account) UpdatePrices

func (a *Account) UpdatePrices(prices Pricing)

Updates prices for all open positions. If a price is not provided for a given position its price is not updated

func (*Account) Withdraw

func (a *Account) Withdraw(cash big.Decimal) error

Withdraws a cash sum from the account structure

type AccountHistory

type AccountHistory struct {
	Benchmark  string
	Securities []string
	Prices     []*PricingSnapshot
	Snapshots  []*AccountSnapshot
}

The AccountHistory contains a record of point in time account snapshots as well as a list of all of the Securities tracked by the account over time.

func NewAccountHistory

func NewAccountHistory() *AccountHistory

func (*AccountHistory) ApplySnapshot

func (ah *AccountHistory) ApplySnapshot(accountSnapshot *AccountSnapshot, pricingSnapshot *PricingSnapshot) error

Add a new account and pricing snapshot to the history.

func (*AccountHistory) BenchmarkBuyHoldPercentGain

func (ah *AccountHistory) BenchmarkBuyHoldPercentGain() big.Decimal

func (*AccountHistory) BenchmarkBuyHoldTotalProfit

func (ah *AccountHistory) BenchmarkBuyHoldTotalProfit() big.Decimal

Get the total profit for a buy and hold of the benchmark security.

func (*AccountHistory) LastIndex

func (ah *AccountHistory) LastIndex() int

Helper function to return the last index of snapshot data.

func (*AccountHistory) PercentGain

func (ah *AccountHistory) PercentGain() big.Decimal

Total percent gain of the account history.

func (*AccountHistory) PriceAtIndex

func (ah *AccountHistory) PriceAtIndex(security string, index int) (big.Decimal, bool)

Helper function to return a price at a given snapshot index.

func (*AccountHistory) TotalProfit

func (ah *AccountHistory) TotalProfit() big.Decimal

Total profit of the account history.

type AccountSnapshot

type AccountSnapshot struct {
	Period    TimePeriod
	Equity    big.Decimal
	Cash      big.Decimal
	Positions []*PositionSnapshot
}

An AccountSnapshot provides the point in time state of an account and its positions.

type Allocations

type Allocations map[string]big.Decimal

Allocations are simply a map of securities and their fraction of allocation. All item's fraction in the map should add up to 1.0.

type Allocator

type Allocator interface {
	Allocate(index int, strategies []Strategy) Allocations
}

An allocator is a functional component which provides a portfolio allocation across many Securities. A list of strategy structures is passed in to calculate the allocations based on rule analysis or timeseries data. All outputted allocation fractions will add up to 1.0 (big.ONE).

type Backtest

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

The Backtest is a holder struct to run a simulated trading strategy against an account.

func NewBacktest

func NewBacktest(strategies []Strategy, allocator Allocator, account *Account) *Backtest

Create a new backtest with the provided strategies, allocator, and starting account. All strategies are assumed to be normalized and have the same length, indexes, and periods.

func (*Backtest) Run

func (b *Backtest) Run() (*AccountHistory, error)

Run the backtest from start to finish.

type Candle

type Candle struct {
	Period     TimePeriod
	OpenPrice  big.Decimal
	ClosePrice big.Decimal
	MaxPrice   big.Decimal
	MinPrice   big.Decimal
	Volume     big.Decimal
	TradeCount uint
}

Candle represents basic market information for a security over a given time period

func NewCandle

func NewCandle(period TimePeriod) (c *Candle)

NewCandle returns a new *Candle for a given time period

func (*Candle) AddTrade

func (c *Candle) AddTrade(tradeAmount, tradePrice big.Decimal)

AddTrade adds a trade to this candle. It will determine if the current price is higher or lower than the min or max price and increment the tradecount.

func (*Candle) String

func (c *Candle) String() string

type DecreaseRule

type DecreaseRule struct {
	Indicator
}

DecreaseRule is satisfied when the given Indicator at the given index is less than the value at the previous index.

func (DecreaseRule) IsSatisfied

func (dr DecreaseRule) IsSatisfied(index int) bool

IsSatisfied returns true when the given Indicator at the given index is less than the value at the previous index.

type DerivativeIndicator

type DerivativeIndicator struct {
	Indicator Indicator
}

DerivativeIndicator returns an indicator that calculates the derivative of the underlying Indicator. The derivative is defined as the difference between the value at the previous index and the value at the current index. Eg series [1, 1, 2, 3, 5, 8] -> [0, 0, 1, 1, 2, 3]

func (DerivativeIndicator) Calculate

func (di DerivativeIndicator) Calculate(index int) big.Decimal

Calculate returns the derivative of the underlying indicator. At index 0, it will always return 0.

type IncreaseRule

type IncreaseRule struct {
	Indicator
}

IncreaseRule is satisfied when the given Indicator at the given index is greater than the value at the previous index.

func (IncreaseRule) IsSatisfied

func (ir IncreaseRule) IsSatisfied(index int) bool

IsSatisfied returns true when the given Indicator at the given index is greater than the value at the previous index.

type Indicator

type Indicator interface {
	Calculate(int) big.Decimal
}

Indicator is an interface that describes a methodology by which to analyze a trading record for a specific property or trend. For example. MovingAverageIndicator implements the Indicator interface and, for a given index in the timeSeries, returns the current moving average of the prices in that series.

func NewAroonDownIndicator

func NewAroonDownIndicator(indicator Indicator, window int) Indicator

NewAroonDownIndicator returns a derivative indicator that will return a value based on the number of ticks since the lowest price in the window https://www.investopedia.com/terms/a/aroon.asp

Note: this indicator should be constructed with a either a LowPriceIndicator or a derivative thereof

func NewAroonUpIndicator

func NewAroonUpIndicator(indicator Indicator, window int) Indicator

NewAroonUpIndicator returns a derivative indicator that will return a value based on the number of ticks since the highest price in the window https://www.investopedia.com/terms/a/aroon.asp

Note: this indicator should be constructed with a either a HighPriceIndicator or a derivative thereof

func NewAverageGainsIndicator

func NewAverageGainsIndicator(indicator Indicator, window int) Indicator

NewAverageGainsIndicator Returns a new average gains indicator, which returns the average gains in the given window based on the given indicator.

func NewAverageLossesIndicator

func NewAverageLossesIndicator(indicator Indicator, window int) Indicator

NewAverageLossesIndicator Returns a new average losses indicator, which returns the average losses in the given window based on the given indicator.

func NewAverageTrueRangeIndicator

func NewAverageTrueRangeIndicator(series *TimeSeries, window int) Indicator

NewAverageTrueRangeIndicator returns a base indicator that calculates the average true range of the underlying over a window https://www.investopedia.com/terms/a/atr.asp

func NewBollingerLowerBandIndicator

func NewBollingerLowerBandIndicator(indicator Indicator, window int, sigma float64) Indicator

NewBollingerLowerBandIndicator returns a a derivative indicator which returns the lower bound of a bollinger band on the underlying indicator

func NewBollingerUpperBandIndicator

func NewBollingerUpperBandIndicator(indicator Indicator, window int, sigma float64) Indicator

NewBollingerUpperBandIndicator a a derivative indicator which returns the upper bound of a bollinger band on the underlying indicator

func NewCCIIndicator

func NewCCIIndicator(ts *TimeSeries, window int) Indicator

NewCCIIndicator Returns a new Commodity Channel Index Indicator http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:commodity_channel_index_cci

func NewClosePriceIndicator

func NewClosePriceIndicator(series *TimeSeries) Indicator

NewClosePriceIndicator returns an Indicator which returns the close price of a candle for a given index

func NewConstantIndicator

func NewConstantIndicator(constant float64) Indicator

NewConstantIndicator returns an indicator which always returns the same value for any index. It's useful when combined with other, fluxuating indicators to determine when an indicator has crossed a threshold.

func NewCumulativeGainsIndicator

func NewCumulativeGainsIndicator(indicator Indicator, window int) Indicator

NewCumulativeGainsIndicator returns a derivative indicator which returns all gains made in a base indicator for a given window.

func NewCumulativeLossesIndicator

func NewCumulativeLossesIndicator(indicator Indicator, window int) Indicator

NewCumulativeLossesIndicator returns a derivative indicator which returns all losses in a base indicator for a given window.

func NewDifferenceIndicator

func NewDifferenceIndicator(minuend, subtrahend Indicator) Indicator

NewDifferenceIndicator returns an indicator which returns the difference between one indicator (minuend) and a second indicator (subtrahend).

func NewEMAIndicator

func NewEMAIndicator(indicator Indicator, window int) Indicator

NewEMAIndicator returns a derivative indicator which returns the average of the current and preceding values in the given windowSize, with values closer to current index given more weight. A more in-depth explanation can be found here: http://www.investopedia.com/terms/e/ema.asp

func NewFastStochasticIndicator

func NewFastStochasticIndicator(series *TimeSeries, timeframe int) Indicator

NewFastStochasticIndicator returns a derivative Indicator which returns the fast stochastic indicator (%K) for the given window. https://www.investopedia.com/terms/s/stochasticoscillator.asp

func NewFixedIndicator

func NewFixedIndicator(vals ...float64) Indicator

NewFixedIndicator returns an indicator with a fixed set of values that are returned when an index is passed in

func NewGainIndicator

func NewGainIndicator(indicator Indicator) Indicator

NewGainIndicator returns a derivative indicator that returns the gains in the underlying indicator in the last bar, if any. If the delta is negative, zero is returned

func NewHighPriceIndicator

func NewHighPriceIndicator(series *TimeSeries) Indicator

NewHighPriceIndicator returns an Indicator which returns the high price of a candle for a given index

func NewKeltnerChannelLowerIndicator

func NewKeltnerChannelLowerIndicator(series *TimeSeries, window int) Indicator

func NewKeltnerChannelUpperIndicator

func NewKeltnerChannelUpperIndicator(series *TimeSeries, window int) Indicator

func NewLossIndicator

func NewLossIndicator(indicator Indicator) Indicator

NewLossIndicator returns a derivative indicator that returns the losses in the underlying indicator in the last bar, if any. If the delta is positive, zero is returned

func NewLowPriceIndicator

func NewLowPriceIndicator(series *TimeSeries) Indicator

NewLowPriceIndicator returns an Indicator which returns the low price of a candle for a given index

func NewMACDHistogramIndicator

func NewMACDHistogramIndicator(macdIdicator Indicator, signalLinewindow int) Indicator

NewMACDHistogramIndicator returns a derivative Indicator based on the MACDIndicator, the result of which is the macd indicator minus it's signalLinewindow EMA. A more in-depth explanation can be found here: http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:macd-histogram

func NewMACDIndicator

func NewMACDIndicator(baseIndicator Indicator, shortwindow, longwindow int) Indicator

NewMACDIndicator returns a derivative Indicator which returns the difference between two EMAIndicators with long and short windows. It's useful for gauging the strength of price movements. A more in-depth explanation can be found here: http://www.investopedia.com/terms/m/macd.asp

func NewMMAIndicator

func NewMMAIndicator(indicator Indicator, window int) Indicator

NewMMAIndicator returns a derivative indciator which returns the modified moving average of the underlying indictator. An in-depth explanation can be found here: https://en.wikipedia.org/wiki/Moving_average#Modified_moving_average

func NewMaximumDrawdownIndicator

func NewMaximumDrawdownIndicator(ind Indicator, window int) Indicator

NewMaximumDrawdownIndicator returns a derivative Indicator which returns the maximum drawdown of the underlying indicator over a window. Maximum drawdown is defined as the maximum observed loss from peak of an underlying indicator in a given timeframe. Maximum drawdown is given as a percentage of the peak. Use a window value of -1 to include all values present in the underlying indicator. See: https://www.investopedia.com/terms/m/maximum-drawdown-mdd.asp

func NewMaximumValueIndicator

func NewMaximumValueIndicator(ind Indicator, window int) Indicator

NewMaximumValueIndicator returns a derivative Indicator which returns the maximum value present in a given window. Use a window value of -1 to include all values in the underlying indicator.

func NewMeanDeviationIndicator

func NewMeanDeviationIndicator(indicator Indicator, window int) Indicator

NewMeanDeviationIndicator returns a derivative Indicator which returns the mean deviation of a base indicator in a given window. Mean deviation is an average of all values on the base indicator from the mean of that indicator.

func NewMinimumValueIndicator

func NewMinimumValueIndicator(ind Indicator, window int) Indicator

NewMinimumValueIndicator returns a derivative Indicator which returns the minimum value present in a given window. Use a window value of -1 to include all values in the underlying indicator.

func NewOpenPriceIndicator

func NewOpenPriceIndicator(series *TimeSeries) Indicator

NewOpenPriceIndicator returns an Indicator which returns the open price of a candle for a given index

func NewPercentChangeIndicator

func NewPercentChangeIndicator(indicator Indicator) Indicator

NewPercentChangeIndicator returns a derivative indicator which returns the percent change (positive or negative) made in a base indicator up until the given indicator

func NewRelativeStrengthIndexIndicator

func NewRelativeStrengthIndexIndicator(indicator Indicator, timeframe int) Indicator

NewRelativeStrengthIndexIndicator returns a derivative Indicator which returns the relative strength index of the base indicator in a given time frame. A more in-depth explanation of relative strength index can be found here: https://www.investopedia.com/terms/r/rsi.asp

func NewRelativeStrengthIndicator

func NewRelativeStrengthIndicator(indicator Indicator, timeframe int) Indicator

NewRelativeStrengthIndicator returns a derivative Indicator which returns the relative strength of the base indicator in a given time frame. Relative strength is the average again of up periods during the time frame divided by the average loss of down period during the same time frame

func NewRelativeVigorIndexIndicator

func NewRelativeVigorIndexIndicator(series *TimeSeries) Indicator

NewRelativeVigorIndexIndicator returns an Indicator which returns the index of the relative vigor of the prices of a sercurity. Relative Vigor Index is simply the difference of the previous four days' close and open prices divided by the difference between the previous four days high and low prices. A more in-depth explanation of relative vigor index can be found here: https://www.fidelity.com/learning-center/trading-investing/technical-analysis/technical-indicator-guide/relative-vigor-index

func NewRelativeVigorSignalLine

func NewRelativeVigorSignalLine(series *TimeSeries) Indicator

NewRelativeVigorSignalLine returns an Indicator intended to be used in conjunction with Relative vigor index, which returns the average value of the last 4 indices of the RVI indicator.

func NewSimpleMovingAverage

func NewSimpleMovingAverage(indicator Indicator, window int) Indicator

NewSimpleMovingAverage returns a derivative Indicator which returns the average of the current value and preceding values in the given windowSize.

func NewSlowStochasticIndicator

func NewSlowStochasticIndicator(k Indicator, window int) Indicator

NewSlowStochasticIndicator returns a derivative Indicator which returns the slow stochastic indicator (%D) for the given window. https://www.investopedia.com/terms/s/stochasticoscillator.asp

func NewStandardDeviationIndicator

func NewStandardDeviationIndicator(ind Indicator) Indicator

NewStandardDeviationIndicator calculates the standard deviation of a base indicator. See https://www.investopedia.com/terms/s/standarddeviation.asp

func NewSupertrendIndicator

func NewSupertrendIndicator(series *TimeSeries, window int, multiplier int) Indicator

NewSupertrendIndicator returns a derivative indicator which calculates the well-known supertrend indicator which is based on trend detection using a combination of the average true range (ATR) and the high/low prices of an asset over a defined window.

The typical accepted multipler value is 3.

https://www.investopedia.com/supertrend-indicator-7976167

func NewTrendlineIndicator

func NewTrendlineIndicator(indicator Indicator, window int) Indicator

NewTrendlineIndicator returns an indicator whose output is the slope of the trend line given by the values in the window.

func NewTrueRangeIndicator

func NewTrueRangeIndicator(series *TimeSeries) Indicator

NewTrueRangeIndicator returns a base indicator which calculates the true range at the current point in time for a series https://www.investopedia.com/terms/a/atr.asp

func NewTypicalPriceIndicator

func NewTypicalPriceIndicator(series *TimeSeries) Indicator

NewTypicalPriceIndicator returns an Indicator which returns the typical price of a candle for a given index. The typical price is an average of the high, low, and close prices for a given candle.

func NewVarianceIndicator

func NewVarianceIndicator(ind Indicator) Indicator

NewVarianceIndicator provides a way to find the variance in a base indicator, where variances is the sum of squared deviations from the mean at any given index in the time series.

func NewVolumeIndicator

func NewVolumeIndicator(series *TimeSeries) Indicator

NewVolumeIndicator returns an indicator which returns the volume of a candle for a given index

func NewWindowedStandardDeviationIndicator

func NewWindowedStandardDeviationIndicator(ind Indicator, window int) Indicator

NewWindowedStandardDeviationIndicator returns a indicator which calculates the standard deviation of the underlying indicator over a window

type NaiveAllocator

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

The naive allocator will proportionally allocate to all strategies which are triggered. A maximum position and total allocation can be provided in order to limit single position size and how much of a given portfolio is allocated.

func NewNaiveAllocator

func NewNaiveAllocator(maxSinglePositionFraction big.Decimal, maxTotalPositionFraction big.Decimal) *NaiveAllocator

Sets up a new naive allocator. if any of the maximum fractions exceed 1.0, then 1.0 will be used. If the max single fraction exceeds the total fraction, then it will be set at the total fraction.

func (*NaiveAllocator) Allocate

func (na *NaiveAllocator) Allocate(index int, strategies []Strategy) Allocations

Perform a naive allocation which simply gives an equal portion of allocation to all strategies whose rules are satisfied.

type Order

type Order struct {
	Side          OrderSide
	Security      string
	Price         big.Decimal
	Amount        big.Decimal
	ExecutionTime time.Time
}

Order represents a trade execution (buy or sell) with associated metadata.

func (*Order) CostBasis

func (o *Order) CostBasis() big.Decimal

Return the total cost to execute the order.

type OrderSide

type OrderSide int

OrderSide is a simple enumeration representing the side of an Order (buy or sell)

const (
	BUY OrderSide = iota
	SELL
)

BUY and SELL enumerations

type OverIndicatorRule

type OverIndicatorRule struct {
	First  Indicator
	Second Indicator
}

OverIndicatorRule is a rule where the First Indicator must be greater than the Second Indicator to be Satisfied

func (OverIndicatorRule) IsSatisfied

func (oir OverIndicatorRule) IsSatisfied(index int) bool

IsSatisfied returns true when the First Indicator is greater than the Second Indicator

type Position

type Position struct {
	Security      string
	Side          OrderSide
	Amount        big.Decimal
	AvgEntryPrice big.Decimal
	Price         big.Decimal
}

Positions holds iformation about an open position

func NewPosition

func NewPosition(order *Order) *Position

NewPosition returns a new Position with the passed-in order as the open order

func (*Position) ExecuteOrder

func (p *Position) ExecuteOrder(order *Order) error

ExecuteOrder takes a new order to apply to the position and inceases/deducts the amount from the current position. If a buy order is placed, it will also recalculate the average entry price for the position. In all cases, if the order results in a difference to the cash value of the account placing the order a positive (for sells) or negative (for buys) big.Decimal is returned to denote how the account's cash should be modified.

This function will also update the price of the position to that of the order. Prices can always be synced outside of this function using UpdatePrice.

Only long positions are supported currently.

func (*Position) ExportSnapshot

func (p *Position) ExportSnapshot() *PositionSnapshot

export a snapshot of this position at the current state.

func (*Position) IsClosed

func (p *Position) IsClosed() bool

Returns if the position is closed, meaning there is currently a zero amount.

func (*Position) UnrealizedEquity

func (p *Position) UnrealizedEquity() big.Decimal

Calculate the unrealized equity of an open position

func (*Position) UnrealizedGain

func (p *Position) UnrealizedGain() big.Decimal

Computes the unrealized gain since the posiion was entered.

func (*Position) UpdatePrice

func (p *Position) UpdatePrice(newPrice big.Decimal)

Update the current price to reflect realtime values and to calculate unrealized gains/equity

type PositionSnapshot

type PositionSnapshot struct {
	Security       string
	Side           OrderSide
	Amount         big.Decimal
	Price          big.Decimal
	UnrealizedGain big.Decimal
}

Snapshot of position used to document account history

type Pricing

type Pricing map[string]big.Decimal

The Pricing type is a simple alias for a map of the security symbol to a price.

type PricingSnapshot

type PricingSnapshot struct {
	Period TimePeriod
	Prices Pricing
}

The PricingSnapshot provides point in time pricing information for all tracked securities, including the bechmark if used. The period for each snapshot should match a period supplied in an account snapshot.

type Rule

type Rule interface {
	IsSatisfied(index int) bool
}

Rule is an interface describing an algorithm by which a set of criteria may be satisfied

func And

func And(r1, r2 Rule) Rule

And returns a new rule whereby BOTH of the passed-in rules must be satisfied for the rule to be satisfied

func NewCrossDownIndicatorRule

func NewCrossDownIndicatorRule(upper, lower Indicator) Rule

NewCrossDownIndicatorRule returns a new rule that is satisfied when the upper indicator has crossed below the lower indicator.

func NewCrossUpIndicatorRule

func NewCrossUpIndicatorRule(upper, lower Indicator) Rule

NewCrossUpIndicatorRule returns a new rule that is satisfied when the lower indicator has crossed above the upper indicator.

func NewPercentChangeRule

func NewPercentChangeRule(indicator Indicator, percent float64) Rule

NewPercentChangeRule returns a rule whereby the given Indicator must have changed by a given percentage to be satisfied. You should specify percent as a float value between -1 and 1

func Or

func Or(r1, r2 Rule) Rule

Or returns a new rule whereby ONE OF the passed-in rules must be satisfied for the rule to be satisfied

type Strategy

type Strategy struct {
	Security   string
	Timeseries TimeSeries
	Indicators map[string]Indicator
	Rule       Rule
}

A strategy is a holder struct which bundles the raw timeseries data, indicators, and rules used to make trading decisions for a given security. The strategy can be used to calculate allocations and map algo trading triggers over time.

func (*Strategy) LastIndex

func (s *Strategy) LastIndex() int

Helper function to get the last index of the strategy's data.

type TimePeriod

type TimePeriod struct {
	Start time.Time
	End   time.Time
}

TimePeriod is a simple struct that describes a period of time with a Start and End time

func NewTimePeriod

func NewTimePeriod(start time.Time, period time.Duration) TimePeriod

NewTimePeriod returns a TimePeriod starting at the given time and ending at the given time plus the given duration

func Parse deprecated

func Parse(timerange string) (tr TimePeriod, err error)

Parse takes a string in one of the following formats and returns a new TimePeriod, and optionally, an error

Deprecated: Please use ParseTimePeriod instead

func ParseTimePeriod

func ParseTimePeriod(period string) (TimePeriod, error)

ParseTimePeriod parses two datetimes as one string and returns it as a TimePeriod.

Note that if you were previously using Parse, the date format has changed to something more rfc3339-like (yyyy-mm-dd) Will accept any combination of date and time for either side. Omitting the right hand side will result in a time period ending in time.Now()

Example
// Any separator between two times is valid
parseable := "2009-01-20T12:00:00 -- 2017-01-20T12:00:00"
timePeriod, err := ParseTimePeriod(parseable)
if err != nil {
	return
}

fmt.Println(timePeriod.Start.Year(), timePeriod.End.Year())
Output:

2009 2017

func (TimePeriod) Advance

func (tp TimePeriod) Advance(iterations int) TimePeriod

Advance will return a new TimePeriod with the start and end periods moved forwards or backwards in time in accordance with the number of iterations given.

Example: A timePeriod that is one hour long, starting at unix time 0 and ending at unix time 3600, and advanced by one, will return a time period starting at unix time 3600 and ending at unix time 7200

func (TimePeriod) Format

func (tp TimePeriod) Format(layout string) string

Format returns the string representation of this timePeriod in the given format

func (TimePeriod) In

func (tp TimePeriod) In(location *time.Location) TimePeriod

In returns a copy of TimePeriod tp with both start and end times' location set to the specified location

func (TimePeriod) Length

func (tp TimePeriod) Length() time.Duration

Length returns the length of the period as a time.Duration value

func (TimePeriod) Since

func (tp TimePeriod) Since(other TimePeriod) time.Duration

Since returns the amount of time elapsed since the end of another TimePeriod as a time.Duration value

func (TimePeriod) String

func (tp TimePeriod) String() string

func (TimePeriod) UTC

func (tp TimePeriod) UTC() TimePeriod

UTC returns a copy of TimePeriod tp with both start and end times' location set to UTC

type TimeSeries

type TimeSeries struct {
	Candles []*Candle
}

TimeSeries represents an array of candles

func NewTimeSeries

func NewTimeSeries() (t *TimeSeries)

NewTimeSeries returns a new, empty, TimeSeries

func (*TimeSeries) AddCandle

func (ts *TimeSeries) AddCandle(candle *Candle) bool

AddCandle adds the given candle to this TimeSeries if it is not nil and after the last candle in this timeseries. If the candle is added, AddCandle will return true, otherwise it will return false.

func (*TimeSeries) LastCandle

func (ts *TimeSeries) LastCandle() *Candle

LastCandle will return the lastCandle in this series, or nil if this series is empty

func (*TimeSeries) LastIndex

func (ts *TimeSeries) LastIndex() int

LastIndex will return the index of the last candle in this series

type TradePlan

type TradePlan []Order

A trade plan is a list of orders to be executed in the order they appear.

func CreateTradePlan

func CreateTradePlan(allocations Allocations, pricing Pricing, account *Account) (*TradePlan, error)

A trade plan is created by calculating the diff between the current account positions and the desired allocations provided.

type UnderIndicatorRule

type UnderIndicatorRule struct {
	First  Indicator
	Second Indicator
}

UnderIndicatorRule is a rule where the First Indicator must be less than the Second Indicator to be Satisfied

func (UnderIndicatorRule) IsSatisfied

func (uir UnderIndicatorRule) IsSatisfied(index int) bool

IsSatisfied returns true when the First Indicator is less than the Second Indicator

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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