goanda

package module
v0.0.0-...-93bee60 Latest Latest
Warning

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

Go to latest
Published: Aug 29, 2024 License: MIT Imports: 13 Imported by: 14

README

goanda

A Golang wrapper for the OANDA v20 API. Currently OANDA has wrappers for Python, Javascript and Java. Goanda exists to extend upon those languages because of the increasing popularity of Go.

Features

Goanda can perform the following actions on your OANDA brokerage accounts:

  • Get candlesticks of all instruments
  • Create and update orders with comprehensive order properties
  • Get data on current and past trades on OANDA
  • Close/scale out of trades you have open
  • Close positions (not just trades)
  • Get data on your account
    • NAV
    • Current % of used margin
    • Balance
    • And more!
  • Get data on all your transactions
  • Get all pricing data (bid/ask spread) on specific instruments
  • Stream real-time data for prices, transactions, account changes, and candles

Requirements

  • Go v1.9+

Note: This package was created by a third party, and was not created by anyone affiliated with OANDA

Usage

To use this package run go get github.com/awoldes/goanda then import it into your program and set it up following the snippets below.

Basic Example

I suggest creating a .env file for your project to keep your secrets safe! Make sure you add a .gitignore file.

~/project/.env

OANDA_API_KEY=
OANDA_ACCOUNT=

~/project/main.go

package main

import (
	"log"
	"os"

	"github.com/awoldes/goanda"
	"github.com/davecgh/go-spew/spew"
	"github.com/joho/godotenv"
)

func main() {
	err := godotenv.Load()
	if err != nil {
		log.Fatal("Error loading .env file")
	}

	config := &goanda.ConnectionConfig{
		UserAgent: "goanda",
		Timeout: 10 * time.Second,
		Live: false,
	}

	granularity := goanda.GranularityFiveSeconds

	key := os.Getenv("OANDA_API_KEY")
	accountID := os.Getenv("OANDA_ACCOUNT_ID")

	oanda, err := goanda.NewConnection(accountID, key, config)
	if err != nil {
		log.Fatalf("Error creating connection: %v", err)
	}

	history, err := oanda.GetCandles("EUR_USD", 10, granularity)
	if err != nil {
		log.Fatalf("Error getting candles: %v", err)
	}

	spew.Dump(history)
}

Look at the /examples directory for more!

Contributing

For now if you'd like to contribute create an Issue and/or submit a PR!

Testing

The project now includes comprehensive test coverage. To run the tests, use the following command:

go test -v ./...

TODO

API (in order of priority)
  • Instrument endpoints (to get prices and the order book)
  • Order endpoints (to create, get or update orders for an account)
  • Trade endpoints (to get information on current trades)
  • Position endpoints (to get information on current positions)
  • Account endpoints (to get information on the account)
  • Transaction endpoints (to get information on account transactions)
  • Pricing endpoints (to get pricing of instruments)
  • Streaming endpoints for Pricing & Transactions
Docs
  • Write docs on how to use goanda
  • Write example programs for goanda
  • Write tests for goanda

Supporting Projects

Thank you to the following projects, they really helped me while I was developing this API

License

This project was created under the MIT license

Documentation

Index

Constants

View Source
const (
	GranularityFiveSeconds    = Granularity(time.Second * 5)
	GranularityTenSeconds     = Granularity(time.Second * 10)
	GranularityFifteenSeconds = Granularity(time.Second * 15)
	GranularityThirtySeconds  = Granularity(time.Second * 30)
	GranularityMinute         = Granularity(time.Minute)
	GranularityTwoMinutes     = Granularity(time.Minute * 2)
	GranularityFourMinutes    = Granularity(time.Minute * 4)
	GranularityFiveMinutes    = Granularity(time.Minute * 5)
	GranularityTenMinutes     = Granularity(time.Minute * 10)
	GranularityFifteenMinutes = Granularity(time.Minute * 15)
	GranularityThirtyMinutes  = Granularity(time.Minute * 30)
	GranularityHour           = Granularity(time.Hour)
	GranularityTwoHours       = Granularity(time.Hour * 2)
	GranularityThreeHours     = Granularity(time.Hour * 3)
	GranularityFourHours      = Granularity(time.Hour * 4)
	GranularitySixHours       = Granularity(time.Hour * 6)
	GranularityEightHours     = Granularity(time.Hour * 8)
	GranularityTwelveHours    = Granularity(time.Hour * 12)
	GranularityDay            = Granularity(time.Hour * 24)
	GranularityWeek           = Granularity(time.Hour * 24 * 7)
	GranularityMonth          = Granularity(time.Hour * 24 * 7 * 30)
)

Granularities available to the API

Variables

This section is empty.

Functions

This section is empty.

Types

type APIError

type APIError struct {
	Request  *http.Request
	Response *http.Response
	Message  string
}

APIError is returned when the Oanda server responds with an error

Message is the returned error message from the server if possible to unmarshal, otherwise it is simply the entire body of the response

func (APIError) Error

func (a APIError) Error() string

APIError implements error

type AccountChanges

type AccountChanges struct {
	Changes struct {
		OrdersCancelled []interface{} `json:"ordersCancelled"`
		OrdersCreated   []interface{} `json:"ordersCreated"`
		OrdersFilled    []struct {
			CreateTime           time.Time `json:"createTime"`
			FilledTime           time.Time `json:"filledTime"`
			FillingTransactionID string    `json:"fillingTransactionID"`
			ID                   string    `json:"id"`
			Instrument           string    `json:"instrument"`
			PositionFill         string    `json:"positionFill"`
			State                string    `json:"state"`
			TimeInForce          string    `json:"timeInForce"`
			TradeOpenedID        string    `json:"tradeOpenedID"`
			Type                 string    `json:"type"`
			Units                string    `json:"units"`
		} `json:"ordersFilled"`
		OrdersTriggered []interface{} `json:"ordersTriggered"`
		Positions       []struct {
			Instrument string `json:"instrument"`
			Long       struct {
				Pl           string `json:"pl"`
				ResettablePL string `json:"resettablePL"`
				Units        string `json:"units"`
			} `json:"long"`
			Pl           string `json:"pl"`
			ResettablePL string `json:"resettablePL"`
			Short        struct {
				AveragePrice string   `json:"averagePrice"`
				Pl           string   `json:"pl"`
				ResettablePL string   `json:"resettablePL"`
				TradeIDs     []string `json:"tradeIDs"`
				Units        string   `json:"units"`
			} `json:"short"`
		} `json:"positions"`
		TradesClosed []interface{} `json:"tradesClosed"`
		TradesOpened []struct {
			CurrentUnits string    `json:"currentUnits"`
			Financing    string    `json:"financing"`
			ID           string    `json:"id"`
			InitialUnits string    `json:"initialUnits"`
			Instrument   string    `json:"instrument"`
			OpenTime     time.Time `json:"openTime"`
			Price        string    `json:"price"`
			RealizedPL   string    `json:"realizedPL"`
			State        string    `json:"state"`
		} `json:"tradesOpened"`
		TradesReduced []interface{} `json:"tradesReduced"`
		Transactions  []struct {
			AccountID      string    `json:"accountID"`
			BatchID        string    `json:"batchID"`
			ID             string    `json:"id"`
			Instrument     string    `json:"instrument"`
			PositionFill   string    `json:"positionFill,omitempty"`
			Reason         string    `json:"reason"`
			Time           time.Time `json:"time"`
			TimeInForce    string    `json:"timeInForce,omitempty"`
			Type           string    `json:"type"`
			Units          string    `json:"units"`
			UserID         int       `json:"userID"`
			AccountBalance string    `json:"accountBalance,omitempty"`
			Financing      string    `json:"financing,omitempty"`
			OrderID        string    `json:"orderID,omitempty"`
			Pl             string    `json:"pl,omitempty"`
			Price          string    `json:"price,omitempty"`
			TradeOpened    struct {
				TradeID string `json:"tradeID"`
				Units   string `json:"units"`
			} `json:"tradeOpened,omitempty"`
		} `json:"transactions"`
	} `json:"changes"`
	LastTransactionID string `json:"lastTransactionID"`
	State             struct {
		NAV                        string        `json:"NAV"`
		MarginAvailable            string        `json:"marginAvailable"`
		MarginCloseoutMarginUsed   string        `json:"marginCloseoutMarginUsed"`
		MarginCloseoutNAV          string        `json:"marginCloseoutNAV"`
		MarginCloseoutPercent      string        `json:"marginCloseoutPercent"`
		MarginCloseoutUnrealizedPL string        `json:"marginCloseoutUnrealizedPL"`
		MarginUsed                 string        `json:"marginUsed"`
		Orders                     []interface{} `json:"orders"`
		PositionValue              string        `json:"positionValue"`
		Positions                  []struct {
			Instrument        string `json:"instrument"`
			LongUnrealizedPL  string `json:"longUnrealizedPL"`
			NetUnrealizedPL   string `json:"netUnrealizedPL"`
			ShortUnrealizedPL string `json:"shortUnrealizedPL"`
		} `json:"positions"`
		Trades []struct {
			ID           string `json:"id"`
			UnrealizedPL string `json:"unrealizedPL"`
		} `json:"trades"`
		UnrealizedPL    string `json:"unrealizedPL"`
		WithdrawalLimit string `json:"withdrawalLimit"`
	} `json:"state"`
}

type AccountInfo

type AccountInfo struct {
	Account struct {
		NAV                         string        `json:"NAV"`
		Alias                       string        `json:"alias"`
		Balance                     string        `json:"balance"`
		CreatedByUserID             int           `json:"createdByUserID"`
		CreatedTime                 time.Time     `json:"createdTime"`
		Currency                    string        `json:"currency"`
		HedgingEnabled              bool          `json:"hedgingEnabled"`
		ID                          string        `json:"id"`
		LastTransactionID           string        `json:"lastTransactionID"`
		MarginAvailable             string        `json:"marginAvailable"`
		MarginCloseoutMarginUsed    string        `json:"marginCloseoutMarginUsed"`
		MarginCloseoutNAV           string        `json:"marginCloseoutNAV"`
		MarginCloseoutPercent       string        `json:"marginCloseoutPercent"`
		MarginCloseoutPositionValue string        `json:"marginCloseoutPositionValue"`
		MarginCloseoutUnrealizedPL  string        `json:"marginCloseoutUnrealizedPL"`
		MarginRate                  string        `json:"marginRate"`
		MarginUsed                  string        `json:"marginUsed"`
		OpenPositionCount           int           `json:"openPositionCount"`
		OpenTradeCount              int           `json:"openTradeCount"`
		Orders                      []interface{} `json:"orders"`
		PendingOrderCount           int           `json:"pendingOrderCount"`
		Pl                          string        `json:"pl"`
		PositionValue               string        `json:"positionValue"`
		Positions                   []struct {
			Instrument string `json:"instrument"`
			Long       struct {
				Pl           string `json:"pl"`
				ResettablePL string `json:"resettablePL"`
				Units        string `json:"units"`
				UnrealizedPL string `json:"unrealizedPL"`
			} `json:"long"`
			Pl           string `json:"pl"`
			ResettablePL string `json:"resettablePL"`
			Short        struct {
				Pl           string `json:"pl"`
				ResettablePL string `json:"resettablePL"`
				Units        string `json:"units"`
				UnrealizedPL string `json:"unrealizedPL"`
			} `json:"short"`
			UnrealizedPL string `json:"unrealizedPL"`
		} `json:"positions"`
		ResettablePL    string        `json:"resettablePL"`
		Trades          []interface{} `json:"trades"`
		UnrealizedPL    string        `json:"unrealizedPL"`
		WithdrawalLimit string        `json:"withdrawalLimit"`
	} `json:"account"`
	LastTransactionID string `json:"lastTransactionID"`
}

type AccountProperties

type AccountProperties struct {
	ID           string `json:"id"`
	Mt4AccountID int    `json:"mt4AccountID"`
	Tags         []string
}

type AccountSummary

type AccountSummary struct {
	Account struct {
		NAV                         string    `json:"NAV"`
		Alias                       string    `json:"alias"`
		Balance                     float64   `json:"balance,string"`
		CreatedByUserID             int       `json:"createdByUserID"`
		CreatedTime                 time.Time `json:"createdTime"`
		Currency                    string    `json:"currency"`
		HedgingEnabled              bool      `json:"hedgingEnabled"`
		ID                          string    `json:"id"`
		LastTransactionID           string    `json:"lastTransactionID"`
		MarginAvailable             float64   `json:"marginAvailable,string"`
		MarginCloseoutMarginUsed    string    `json:"marginCloseoutMarginUsed"`
		MarginCloseoutNAV           string    `json:"marginCloseoutNAV"`
		MarginCloseoutPercent       string    `json:"marginCloseoutPercent"`
		MarginCloseoutPositionValue string    `json:"marginCloseoutPositionValue"`
		MarginCloseoutUnrealizedPL  string    `json:"marginCloseoutUnrealizedPL"`
		MarginRate                  string    `json:"marginRate"`
		MarginUsed                  string    `json:"marginUsed"`
		OpenPositionCount           int       `json:"openPositionCount"`
		OpenTradeCount              int       `json:"openTradeCount"`
		PendingOrderCount           int       `json:"pendingOrderCount"`
		Pl                          string    `json:"pl"`
		PositionValue               string    `json:"positionValue"`
		ResettablePL                string    `json:"resettablePL"`
		UnrealizedPL                string    `json:"unrealizedPL"`
		WithdrawalLimit             string    `json:"withdrawalLimit"`
	} `json:"account"`
	LastTransactionID string `json:"lastTransactionID"`
}

type BidAskCandles

type BidAskCandles struct {
	Candles []struct {
		Ask struct {
			C float64 `json:"c,string"`
			H float64 `json:"h,string"`
			L float64 `json:"l,string"`
			O float64 `json:"o,string"`
		} `json:"ask"`
		Bid struct {
			C float64 `json:"c,string"`
			H float64 `json:"h,string"`
			L float64 `json:"l,string"`
			O float64 `json:"o,string"`
		} `json:"bid"`
		Complete bool      `json:"complete"`
		Time     time.Time `json:"time"`
		Volume   int       `json:"volume"`
	} `json:"candles"`
}

type BrokerBook

type BrokerBook struct {
	Instrument  string    `json:"instrument"`
	Time        time.Time `json:"time"`
	Price       string    `json:"price"`
	BucketWidth string    `json:"bucketWidth"`
	Buckets     []Bucket  `json:"buckets"`
}

type Bucket

type Bucket struct {
	Price             string `json:"price"`
	LongCountPercent  string `json:"longCountPercent"`
	ShortCountPercent string `json:"shortCountPercent"`
}

type CancelledOrder

type CancelledOrder struct {
	OrderCancelTransaction struct {
		ID                string    `json:"id"`
		Time              time.Time `json:"time"`
		UserID            int       `json:"userID"`
		AccountID         string    `json:"accountID"`
		BatchID           string    `json:"batchID"`
		RequestID         string    `json:"requestID"`
		Type              string    `json:"type"`
		OrderID           string    `json:"orderID"`
		ClientOrderID     string    `json:"clientOrderID"`
		Reason            string    `json:"reason"`
		ReplacedByOrderID string    `json:"replacedByOrderID"`
	} `json:"orderCancelTransaction"`
	RelatedTransactionIDs []string `json:"relatedTransactionIDs"`
	LastTransactionID     string   `json:"lastTransactionID"`
}

type Candle

type Candle struct {
	Open  float64 `json:"o,string"`
	Close float64 `json:"c,string"`
	Low   float64 `json:"l,string"`
	High  float64 `json:"h,string"`
}

type Candles

type Candles struct {
	Complete bool      `json:"complete"`
	Volume   int       `json:"volume"`
	Time     time.Time `json:"time"`
	Mid      Candle    `json:"mid"`
}

type ClosePositionPayload

type ClosePositionPayload struct {
	LongUnits  string `json:"longUnits"`
	ShortUnits string `json:"shortUnits"`
}

type CloseTradePayload

type CloseTradePayload struct {
	Units string `json:"units"`
}

type Connection

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

Connection describes a connection to the Oanda v20 API It is thread safe

func NewConnection

func NewConnection(accountID string, token string, config *ConnectionConfig) (*Connection, error)

NewConnection creates a new connection This function calls Connection.CheckConnection(), returning any errors Supplying a config is optional, with sane defaults (paper trading) being used otherwise.

func (*Connection) Accounts

func (c *Connection) Accounts() ([]AccountProperties, error)

Accounts returns a slice of information on accounts authorized for the token.

func (*Connection) CancelOrder

func (c *Connection) CancelOrder(orderSpecifier string) (CancelledOrder, error)

func (*Connection) CheckConnection

func (c *Connection) CheckConnection() error

CheckConnection performs a request, returning any errors encountered

func (*Connection) ClosePosition

func (c *Connection) ClosePosition(instrument string, body ClosePositionPayload) (ModifiedTrade, error)

func (*Connection) CreateOrder

func (c *Connection) CreateOrder(body OrderPayload) (OrderResponse, error)

func (*Connection) Get

func (c *Connection) Get(endpoint string) ([]byte, error)

Get performs a generic http get on the api

func (*Connection) GetAccount

func (c *Connection) GetAccount(id string) (AccountInfo, error)

GetAccount returns information on the account.

func (*Connection) GetAccountChanges

func (c *Connection) GetAccountChanges(id string, transactionId string) (AccountChanges, error)

func (*Connection) GetAccountInstruments

func (c *Connection) GetAccountInstruments(id string) (Instruments, error)

func (*Connection) GetAccountSummary

func (c *Connection) GetAccountSummary() (AccountSummary, error)

func (*Connection) GetBidAskCandles

func (c *Connection) GetBidAskCandles(instrument string, count string, g Granularity) (BidAskCandles, error)

func (*Connection) GetCandles

func (c *Connection) GetCandles(instrument string, count int, g Granularity) (InstrumentHistory, error)

func (*Connection) GetInstrumentPrice

func (c *Connection) GetInstrumentPrice(instrument string) (InstrumentPricing, error)

func (*Connection) GetOpenPositions

func (c *Connection) GetOpenPositions() (OpenPositions, error)

func (*Connection) GetOpenTrades

func (c *Connection) GetOpenTrades() (ReceivedTrades, error)

func (*Connection) GetOrder

func (c *Connection) GetOrder(orderSpecifier string) (RetrievedOrder, error)

func (*Connection) GetOrderDetails

func (c *Connection) GetOrderDetails(instrument string, units string) (OrderDetails, error)

func (*Connection) GetOrders

func (c *Connection) GetOrders(instrument string) (RetrievedOrders, error)

func (*Connection) GetPendingOrders

func (c *Connection) GetPendingOrders() (RetrievedOrders, error)

func (*Connection) GetPricingForInstruments

func (c *Connection) GetPricingForInstruments(instruments []string) (Pricings, error)

func (*Connection) GetTimeFromCandles

func (c *Connection) GetTimeFromCandles(instrument string, count int, g Granularity, from time.Time) (InstrumentHistory, error)

func (*Connection) GetTimeToCandles

func (c *Connection) GetTimeToCandles(instrument string, count int, g Granularity, to time.Time) (InstrumentHistory, error)

func (*Connection) GetTrade

func (c *Connection) GetTrade(ticket string) (ReceivedTrade, error)

func (*Connection) GetTradesForInstrument

func (c *Connection) GetTradesForInstrument(instrument string) (ReceivedTrades, error)

func (*Connection) GetTransaction

func (c *Connection) GetTransaction(ticket string) (Transaction, error)

func (*Connection) GetTransactionsSinceId

func (c *Connection) GetTransactionsSinceId(id string) (Transactions, error)

func (*Connection) NewStreamingConnection

func (c *Connection) NewStreamingConnection() *StreamingConnection

func (*Connection) OrderBook

func (c *Connection) OrderBook(instrument string) (BrokerBook, error)

func (*Connection) PositionBook

func (c *Connection) PositionBook(instrument string) (BrokerBook, error)

func (*Connection) Post

func (c *Connection) Post(endpoint string, data []byte) ([]byte, error)

Post performs a generic http post on the api

func (*Connection) Put

func (c *Connection) Put(endpoint string, data []byte) ([]byte, error)

Put performs a generic http put on the api

func (*Connection) ReduceTradeSize

func (c *Connection) ReduceTradeSize(ticket string, body CloseTradePayload) (ModifiedTrade, error)

Default is close the whole position using the string "ALL" in body.units

func (*Connection) UpdateOrder

func (c *Connection) UpdateOrder(orderSpecifier string, body OrderPayload) (RetrievedOrder, error)

type ConnectionConfig

type ConnectionConfig struct {
	UserAgent string
	Timeout   time.Duration
	Live      bool
}

ConnectionConfig is used to configure new connections Defaults;

UserAgent	= v20-golang/0.0.1
Timeout		= 5 seconds
Live		= False

type FullPrice

type FullPrice struct {
	CloseoutBid string       `json:"closeoutBid"`
	CloseoutAsk string       `json:"closeoutAsk"`
	Timestamp   string       `json:"timestamp"`
	Bids        []PriceLevel `json:"bids"`
	Asks        []PriceLevel `json:"asks"`
}

type Granularity

type Granularity time.Duration

Granularity defines a candle's time period

func GranularityFromDuration

func GranularityFromDuration(d time.Duration) (Granularity, error)

GranularityFromDuration tries to find a granularity for the given duration

func (Granularity) Duration

func (g Granularity) Duration() time.Duration

Duration returns the granularity as a time.Duration

func (Granularity) String

func (g Granularity) String() string

String returns the granularity as a string, formatted to the oanda standard

type HeartbeatResponse

type HeartbeatResponse struct {
	Type string `json:"type"`
	Time string `json:"time"`
}

type InstrumentHistory

type InstrumentHistory struct {
	Instrument  string    `json:"instrument"`
	Granularity string    `json:"granularity"`
	Candles     []Candles `json:"candles"`
}

type InstrumentPricing

type InstrumentPricing struct {
	Time   time.Time `json:"time"`
	Prices []struct {
		Type string    `json:"type"`
		Time time.Time `json:"time"`
		Bids []struct {
			Price     float64 `json:"price,string"`
			Liquidity int     `json:"liquidity"`
		} `json:"bids"`
		Asks []struct {
			Price     float64 `json:"price,string"`
			Liquidity int     `json:"liquidity"`
		} `json:"asks"`
		CloseoutBid    float64 `json:"closeoutBid,string"`
		CloseoutAsk    float64 `json:"closeoutAsk,string"`
		Status         string  `json:"status"`
		Tradeable      bool    `json:"tradeable"`
		UnitsAvailable struct {
			Default struct {
				Long  string `json:"long"`
				Short string `json:"short"`
			} `json:"default"`
			OpenOnly struct {
				Long  string `json:"long"`
				Short string `json:"short"`
			} `json:"openOnly"`
			ReduceFirst struct {
				Long  string `json:"long"`
				Short string `json:"short"`
			} `json:"reduceFirst"`
			ReduceOnly struct {
				Long  string `json:"long"`
				Short string `json:"short"`
			} `json:"reduceOnly"`
		} `json:"unitsAvailable"`
		QuoteHomeConversionFactors struct {
			PositiveUnits string `json:"positiveUnits"`
			NegativeUnits string `json:"negativeUnits"`
		} `json:"quoteHomeConversionFactors"`
		Instrument string `json:"instrument"`
	} `json:"prices"`
}

type Instruments

type Instruments []struct {
	DisplayName                 string `json:"displayName"`
	DisplayPrecision            int    `json:"displayPrecision"`
	MarginRate                  string `json:"marginRate"`
	MaximumOrderUnits           string `json:"maximumOrderUnits"`
	MaximumPositionSize         string `json:"maximumPositionSize"`
	MaximumTrailingStopDistance string `json:"maximumTrailingStopDistance"`
	MinimumTradeSize            string `json:"minimumTradeSize"`
	MinimumTrailingStopDistance string `json:"minimumTrailingStopDistance"`
	Name                        string `json:"name"`
	PipLocation                 int    `json:"pipLocation"`
	TradeUnitsPrecision         int    `json:"tradeUnitsPrecision"`
	Type                        string `json:"type"`
}

type ModifiedTrade

type ModifiedTrade struct {
	OrderCreateTransaction struct {
		Type         string `json:"type"`
		Instrument   string `json:"instrument"`
		Units        string `json:"units"`
		TimeInForce  string `json:"timeInForce"`
		PositionFill string `json:"positionFill"`
		Reason       string `json:"reason"`
		TradeClose   struct {
			Units   string `json:"units"`
			TradeID string `json:"tradeID"`
		} `json:"tradeClose"`
		ID        string    `json:"id"`
		UserID    int       `json:"userID"`
		AccountID string    `json:"accountID"`
		BatchID   string    `json:"batchID"`
		RequestID string    `json:"requestID"`
		Time      time.Time `json:"time"`
	} `json:"orderCreateTransaction"`
	OrderFillTransaction struct {
		Type           string    `json:"type"`
		Instrument     string    `json:"instrument"`
		Units          string    `json:"units"`
		Price          string    `json:"price"`
		FullPrice      FullPrice `json:"fullPrice"`
		PL             string    `json:"pl"`
		Financing      string    `json:"financing"`
		Commission     string    `json:"commission"`
		AccountBalance string    `json:"accountBalance"`
		TradeOpened    string    `json:"tradeOpened"`
		TimeInForce    string    `json:"timeInForce"`
		PositionFill   string    `json:"positionFill"`
		Reason         string    `json:"reason"`
		TradesClosed   []struct {
			TradeID    string `json:"tradeID"`
			Units      string `json:"units"`
			RealizedPL string `json:"realizedPL"`
			Financing  string `json:"financing"`
		} `json:"tradesClosed"`
		TradeReduced struct {
			TradeID    string `json:"tradeID"`
			Units      string `json:"units"`
			RealizedPL string `json:"realizedPL"`
			Financing  string `json:"financing"`
		} `json:"tradeReduced"`
		ID            string    `json:"id"`
		UserID        int       `json:"userID"`
		AccountID     string    `json:"accountID"`
		BatchID       string    `json:"batchID"`
		RequestID     string    `json:"requestID"`
		OrderID       string    `json:"orderId"`
		ClientOrderID string    `json:"clientOrderId"`
		Time          time.Time `json:"time"`
	} `json:"orderFillTransaction"`
	OrderCancelTransaction struct {
		Type      string    `json:"type"`
		OrderID   string    `json:"orderID"`
		Reason    string    `json:"reason"`
		ID        string    `json:"id"`
		UserID    int       `json:"userID"`
		AccountID string    `json:"accountID"`
		BatchID   string    `json:"batchID"`
		RequestID string    `json:"requestID"`
		Time      time.Time `json:"time"`
	} `json:"orderCancelTransaction"`
	RelatedTransactionIDs []string `json:"relatedTransactionIDs"`
	LastTransactionID     string   `json:"lastTransactionID"`
}

type OnFill

type OnFill struct {
	TimeInForce      string           `json:"timeInForce,omitempty"`
	Price            string           `json:"price,omitempty"` // must be a string for float precision
	Distance         string           `json:"distance,omitempty"`
	GtdTime          string           `json:"gtdTime,omitempty"`
	ClientExtensions *OrderExtensions `json:"clientExtensions,omitempty"`
}

type OpenPositions

type OpenPositions struct {
	LastTransactionID string `json:"lastTransactionID"`
	Positions         []struct {
		Instrument string `json:"instrument"`
		Long       struct {
			AveragePrice string   `json:"averagePrice"`
			Pl           string   `json:"pl"`
			ResettablePL string   `json:"resettablePL"`
			TradeIDs     []string `json:"tradeIDs"`
			Units        string   `json:"units"`
			UnrealizedPL string   `json:"unrealizedPL"`
		} `json:"long"`
		Pl           string `json:"pl"`
		ResettablePL string `json:"resettablePL"`
		Short        struct {
			AveragePrice string   `json:"averagePrice"`
			Pl           string   `json:"pl"`
			ResettablePL string   `json:"resettablePL"`
			TradeIDs     []string `json:"tradeIDs"`
			Units        string   `json:"units"`
			UnrealizedPL string   `json:"unrealizedPL"`
		} `json:"short"`
		UnrealizedPL string `json:"unrealizedPL"`
	} `json:"positions"`
}

type OrderBody

type OrderBody struct {
	ID                       string           `json:"id,omitempty"`
	CreateTime               time.Time        `json:"createTime,omitempty"`
	State                    string           `json:"state,omitempty"`
	ClientExtensions         *OrderExtensions `json:"clientExtensions,omitempty"`
	Instrument               string           `json:"instrument"`
	Units                    int              `json:"units"`
	TimeInForce              string           `json:"timeInForce"`
	PriceBound               string           `json:"priceBound,omitempty"`
	Type                     string           `json:"type"`
	PositionFill             string           `json:"positionFill,omitempty"`
	Price                    string           `json:"price,omitempty"`
	TakeProfitOnFill         *OnFill          `json:"takeProfitOnFill,omitempty"`
	StopLossOnFill           *OnFill          `json:"stopLossOnFill,omitempty"`
	GuaranteedStopLossOnFill *OnFill          `json:"guaranteedStopLossOnFill,omitempty"`
	TrailingStopLossOnFill   *OnFill          `json:"trailingStopLossOnFill,omitempty"`
	TradeClientExtensions    *OrderExtensions `json:"tradeClientExtensions,omitempty"`
	FillingTransactionID     string           `json:"fillingTransactionID,omitempty"`
	FilledTime               time.Time        `json:"filledTime,omitempty"`
	TradeOpenedID            string           `json:"tradeOpenedID,omitempty"`
	TradeID                  string           `json:"tradeID,omitempty"`
	TradeReducedID           string           `json:"tradeReducedID,omitempty"`
	TradeClosedIDs           []string         `json:"tradeClosedIDs,omitempty"`
	CancellingTransactionID  string           `json:"cancellingTransactionID,omitempty"`
	CancelledTime            time.Time        `json:"cancelledTime,omitempty"`
	ReplacesOrderID          string           `json:"replacesOrderID,omitempty"`
	ReplacedByOrderID        string           `json:"replacedByOrderID,omitempty"`
	TriggerCondition         string           `json:"triggerCondition,omitempty"`
	GTDTime                  time.Time        `json:"gtdTime,omitempty"`
	Distance                 string           `json:"distance,omitempty"`
}

type OrderDetails

type OrderDetails struct {
	GainPerPipPerMillionUnits float64 `json:"gainPerPipPerMillionUnits,string"`
	LossPerPipPerMillionUnits float64 `json:"lossPerPipPerMillionUnits,string"`
	UnitsAvailable            struct {
		Default struct {
			Long  float64 `json:"long,string"`
			Short float64 `json:"short,string"`
		} `json:"default"`
		OpenOnly struct {
			Long  float64 `json:"long,string"`
			Short float64 `json:"short,string"`
		} `json:"openOnly"`
		ReduceFirst struct {
			Long  float64 `json:"long,string"`
			Short float64 `json:"short,string"`
		} `json:"reduceFirst"`
		ReduceOnly struct {
			Long  float64 `json:"long,string"`
			Short float64 `json:"short,string"`
		} `json:"reduceOnly"`
	} `json:"unitsAvailable"`
	UnitValues struct {
		Isolation struct {
			Units               float64 `json:"units,string"`
			Commission          float64 `json:"commission,string"`
			PositionValueChange float64 `json:"positionValueChange,string"`
			PositionValue       float64 `json:"positionValue,string"`
			MarginRequired      float64 `json:"marginRequired,string"`
			MarginUsed          float64 `json:"marginUsed,string"`
		} `json:"isolation"`
		PositionDefault struct {
			Units               float64 `json:"units,string"`
			Commission          float64 `json:"commission,string"`
			PositionValueChange float64 `json:"positionValueChange,string"`
			PositionValue       float64 `json:"positionValue,string"`
			MarginRequired      float64 `json:"marginRequired,string"`
			MarginUsed          float64 `json:"marginUsed,string"`
		} `json:"positionDefault"`
		PositionOpenOnly struct {
			Units               float64 `json:"units,string"`
			Commission          float64 `json:"commission,string"`
			PositionValueChange float64 `json:"positionValueChange,string"`
			PositionValue       float64 `json:"positionValue,string"`
			MarginRequired      float64 `json:"marginRequired,string"`
			MarginUsed          float64 `json:"marginUsed,string"`
		} `json:"positionOpenOnly"`
		PositionReduceFirst struct {
			Units               float64 `json:"units,string"`
			Commission          float64 `json:"commission,string"`
			PositionValueChange float64 `json:"positionValueChange,string"`
			PositionValue       float64 `json:"positionValue,string"`
			MarginRequired      float64 `json:"marginRequired,string"`
			MarginUsed          float64 `json:"marginUsed,string"`
		} `json:"positionReduceFirst"`
		PositionReduceOnly struct {
			Units               float64 `json:"units,string"`
			Commission          float64 `json:"commission,string"`
			PositionValueChange float64 `json:"positionValueChange,string"`
			PositionValue       float64 `json:"positionValue,string"`
			MarginRequired      float64 `json:"marginRequired,string"`
			MarginUsed          float64 `json:"marginUsed,string"`
		} `json:"positionReduceOnly"`
	} `json:"unitValues"`
	ValueTables struct {
		CommissionTable []struct {
			Units string `json:"units"`
			Value string `json:"value"`
		} `json:"commissionTable"`
	} `json:"valueTables"`
	LastTransactionID string `json:"lastTransactionID"`
}

type OrderExtensions

type OrderExtensions struct {
	Comment string `json:"comment,omitempty"`
	ID      string `json:"id,omitempty"`
	Tag     string `json:"tag,omitempty"`
}

type OrderInfo

type OrderInfo struct {
	ID                       string           `json:"id"`
	CreateTime               time.Time        `json:"createTime"`
	State                    string           `json:"state"`
	ClientExtensions         *OrderExtensions `json:"clientExtensions,omitempty"`
	Instrument               string           `json:"instrument"`
	Units                    string           `json:"units"` // Keep as string for API response
	TimeInForce              string           `json:"timeInForce"`
	PriceBound               string           `json:"priceBound,omitempty"`
	Type                     string           `json:"type"`
	PositionFill             string           `json:"positionFill"`
	Price                    string           `json:"price,omitempty"`
	TakeProfitOnFill         *OnFill          `json:"takeProfitOnFill,omitempty"`
	StopLossOnFill           *OnFill          `json:"stopLossOnFill,omitempty"`
	GuaranteedStopLossOnFill *OnFill          `json:"guaranteedStopLossOnFill,omitempty"`
	TrailingStopLossOnFill   *OnFill          `json:"trailingStopLossOnFill,omitempty"`
	TradeClientExtensions    *OrderExtensions `json:"tradeClientExtensions,omitempty"`
	FillingTransactionID     string           `json:"fillingTransactionID,omitempty"`
	FilledTime               time.Time        `json:"filledTime,omitempty"`
	TradeOpenedID            string           `json:"tradeOpenedID,omitempty"`
	TradeID                  string           `json:"tradeID,omitempty"`
	TradeReducedID           string           `json:"tradeReducedID,omitempty"`
	CancellingTransactionID  string           `json:"cancellingTransactionID,omitempty"`
	CancelledTime            time.Time        `json:"cancelledTime,omitempty"`
	ReplacesOrderID          string           `json:"replacesOrderID,omitempty"`
	ReplacedByOrderID        string           `json:"replacedByOrderID,omitempty"`
	TriggerCondition         string           `json:"triggerCondition,omitempty"`
	GTDTime                  time.Time        `json:"gtdTime,omitempty"`
	PartialFill              string           `json:"partialFill,omitempty"`
	Distance                 string           `json:"distance,omitempty"`
}

type OrderPayload

type OrderPayload struct {
	Order OrderBody `json:"order"`
}

type OrderResponse

type OrderResponse struct {
	LastTransactionID      string `json:"lastTransactionID"`
	OrderCreateTransaction struct {
		AccountID                string           `json:"accountID"`
		BatchID                  string           `json:"batchID"`
		ID                       string           `json:"id"`
		Instrument               string           `json:"instrument"`
		PositionFill             string           `json:"positionFill"`
		Reason                   string           `json:"reason"`
		Time                     time.Time        `json:"time"`
		TimeInForce              string           `json:"timeInForce"`
		Type                     string           `json:"type"`
		Units                    string           `json:"units"`
		UserID                   int              `json:"userID"`
		Price                    string           `json:"price,omitempty"`
		PriceBound               string           `json:"priceBound,omitempty"`
		Extensions               *OrderExtensions `json:"clientExtensions,omitempty"`
		TakeProfitOnFill         *OnFill          `json:"takeProfitOnFill,omitempty"`
		StopLossOnFill           *OnFill          `json:"stopLossOnFill,omitempty"`
		GuaranteedStopLossOnFill *OnFill          `json:"guaranteedStopLossOnFill,omitempty"`
		TrailingStopLossOnFill   *OnFill          `json:"trailingStopLossOnFill,omitempty"`
		TradeClientExtensions    *OrderExtensions `json:"tradeClientExtensions,omitempty"`
		TriggerCondition         string           `json:"triggerCondition,omitempty"`
		GTDTime                  time.Time        `json:"gtdTime,omitempty"`
		Distance                 string           `json:"distance,omitempty"`
	} `json:"orderCreateTransaction,omitempty"`
	OrderFillTransaction struct {
		AccountBalance string    `json:"accountBalance"`
		AccountID      string    `json:"accountID"`
		BatchID        string    `json:"batchID"`
		Financing      string    `json:"financing"`
		ID             string    `json:"id"`
		Instrument     string    `json:"instrument"`
		OrderID        string    `json:"orderID"`
		Pl             string    `json:"pl"`
		Price          string    `json:"price"`
		Reason         string    `json:"reason"`
		Time           time.Time `json:"time"`
		TradeOpened    struct {
			TradeID string `json:"tradeID"`
			Units   string `json:"units"`
		} `json:"tradeOpened"`
		Type         string    `json:"type"`
		Units        string    `json:"units"`
		UserID       int       `json:"userID"`
		FullPrice    FullPrice `json:"fullPrice,omitempty"`
		TradesClosed []struct {
			TradeID    string `json:"tradeID"`
			Units      string `json:"units"`
			Financing  string `json:"financing"`
			RealizedPL string `json:"realizedPL"`
			Price      string `json:"price"`
		} `json:"tradesClosed,omitempty"`
		TradeReduced struct {
			TradeID    string `json:"tradeID"`
			Units      string `json:"units"`
			Financing  string `json:"financing"`
			RealizedPL string `json:"realizedPL"`
			Price      string `json:"price"`
		} `json:"tradeReduced,omitempty"`
	} `json:"orderFillTransaction,omitempty"`
	OrderCancelTransaction struct {
		ID     string    `json:"id"`
		Time   time.Time `json:"time"`
		Reason string    `json:"reason"`
	} `json:"orderCancelTransaction,omitempty"`
	RelatedTransactionIDs []string         `json:"relatedTransactionIDs"`
	OrderClientExtensions *OrderExtensions `json:"orderClientExtensions,omitempty"`
	TradeClientExtensions *OrderExtensions `json:"tradeClientExtensions,omitempty"`
}

func (*OrderResponse) GetOrderState

func (or *OrderResponse) GetOrderState() string

GetOrderState returns the state of the order based on the transactions in the response

type PriceLevel

type PriceLevel struct {
	Price     string `json:"price"`
	Liquidity string `json:"liquidity"`
}

type PricingStreamResponse

type PricingStreamResponse struct {
	Type       string `json:"type"`
	Time       string `json:"time"`
	Instrument string `json:"instrument,omitempty"`
	Bids       []struct {
		Price     string `json:"price"`
		Liquidity int    `json:"liquidity"`
	} `json:"bids,omitempty"`
	Asks []struct {
		Price     string `json:"price"`
		Liquidity int    `json:"liquidity"`
	} `json:"asks,omitempty"`
	CloseoutBid string `json:"closeoutBid,omitempty"`
	CloseoutAsk string `json:"closeoutAsk,omitempty"`
	Status      string `json:"status,omitempty"`
	Tradeable   bool   `json:"tradeable,omitempty"`
}

type Pricings

type Pricings struct {
	Prices []struct {
		Asks []struct {
			Liquidity int    `json:"liquidity"`
			Price     string `json:"price"`
		} `json:"asks"`
		Bids []struct {
			Liquidity int    `json:"liquidity"`
			Price     string `json:"price"`
		} `json:"bids"`
		CloseoutAsk                string `json:"closeoutAsk"`
		CloseoutBid                string `json:"closeoutBid"`
		Instrument                 string `json:"instrument"`
		QuoteHomeConversionFactors struct {
			NegativeUnits string `json:"negativeUnits"`
			PositiveUnits string `json:"positiveUnits"`
		} `json:"quoteHomeConversionFactors"`
		Status         string    `json:"status"`
		Time           time.Time `json:"time"`
		UnitsAvailable struct {
			Default struct {
				Long  string `json:"long"`
				Short string `json:"short"`
			} `json:"default"`
			OpenOnly struct {
				Long  string `json:"long"`
				Short string `json:"short"`
			} `json:"openOnly"`
			ReduceFirst struct {
				Long  string `json:"long"`
				Short string `json:"short"`
			} `json:"reduceFirst"`
			ReduceOnly struct {
				Long  string `json:"long"`
				Short string `json:"short"`
			} `json:"reduceOnly"`
		} `json:"unitsAvailable"`
	} `json:"prices"`
}

type ReceivedTrade

type ReceivedTrade struct {
	LastTransactionID string `json:"lastTransactionID"`
	Trade             Trade  `json:"trade"`
}

type ReceivedTrades

type ReceivedTrades struct {
	LastTransactionID string  `json:"lastTransactionID"`
	Trades            []Trade `json:"trades"`
}

type RetrievedOrder

type RetrievedOrder struct {
	Order OrderInfo `json:"order"`
}

type RetrievedOrders

type RetrievedOrders struct {
	LastTransactionID string      `json:"lastTransactionID"`
	Orders            []OrderInfo `json:"orders,omitempty"`
}

type StopLossOrder

type StopLossOrder struct {
	ID               string           `json:"id"`
	CreateTime       time.Time        `json:"createTime"`
	Type             string           `json:"type"`
	TradeID          string           `json:"tradeID"`
	ClientTradeID    string           `json:"clientTradeID,omitempty"`
	Price            string           `json:"price"`
	TimeInForce      string           `json:"timeInForce"`
	TriggerCondition string           `json:"triggerCondition"`
	State            string           `json:"state"`
	ClientExtensions *OrderExtensions `json:"clientExtensions,omitempty"`
	Guaranteed       bool             `json:"guaranteed"`
}

type StreamingConnection

type StreamingConnection struct {
	*Connection
	// contains filtered or unexported fields
}

func NewStreamingConnection

func NewStreamingConnection(c *Connection) *StreamingConnection

func (*StreamingConnection) StreamPrices

func (sc *StreamingConnection) StreamPrices(instruments []string, callback func(PricingStreamResponse)) error

func (*StreamingConnection) StreamTransactions

func (sc *StreamingConnection) StreamTransactions(callback func(TransactionStreamResponse)) error

type TakeProfitOrder

type TakeProfitOrder struct {
	ID               string           `json:"id"`
	CreateTime       time.Time        `json:"createTime"`
	Type             string           `json:"type"`
	TradeID          string           `json:"tradeID"`
	ClientTradeID    string           `json:"clientTradeID,omitempty"`
	Price            string           `json:"price"`
	TimeInForce      string           `json:"timeInForce"`
	TriggerCondition string           `json:"triggerCondition"`
	State            string           `json:"state"`
	ClientExtensions *OrderExtensions `json:"clientExtensions,omitempty"`
}

type Trade

type Trade struct {
	ID                    string                 `json:"id"`
	Instrument            string                 `json:"instrument"`
	Price                 string                 `json:"price"`
	OpenTime              time.Time              `json:"openTime"`
	State                 string                 `json:"state"`
	InitialUnits          string                 `json:"initialUnits"`
	InitialMarginRequired string                 `json:"initialMarginRequired"`
	CurrentUnits          string                 `json:"currentUnits"`
	RealizedPL            string                 `json:"realizedPL"`
	UnrealizedPL          string                 `json:"unrealizedPL"`
	MarginUsed            string                 `json:"marginUsed"`
	AverageClosePrice     string                 `json:"averageClosePrice,omitempty"`
	ClosingTransactionIDs []string               `json:"closingTransactionIDs,omitempty"`
	Financing             string                 `json:"financing"`
	CloseTime             time.Time              `json:"closeTime,omitempty"`
	ClientExtensions      *OrderExtensions       `json:"clientExtensions,omitempty"`
	TakeProfitOrder       *TakeProfitOrder       `json:"takeProfitOrder,omitempty"`
	StopLossOrder         *StopLossOrder         `json:"stopLossOrder,omitempty"`
	TrailingStopLossOrder *TrailingStopLossOrder `json:"trailingStopLossOrder,omitempty"`
}

type TrailingStopLossOrder

type TrailingStopLossOrder struct {
	ID               string           `json:"id"`
	CreateTime       time.Time        `json:"createTime"`
	Type             string           `json:"type"`
	TradeID          string           `json:"tradeID"`
	ClientTradeID    string           `json:"clientTradeID,omitempty"`
	Distance         string           `json:"distance"`
	TimeInForce      string           `json:"timeInForce"`
	TriggerCondition string           `json:"triggerCondition"`
	State            string           `json:"state"`
	ClientExtensions *OrderExtensions `json:"clientExtensions,omitempty"`
}

type Transaction

type Transaction struct {
	LastTransactionID string `json:"lastTransactionID"`
	Transaction       struct {
		AccountBalance string    `json:"accountBalance"`
		AccountID      string    `json:"accountID"`
		BatchID        string    `json:"batchID"`
		Financing      string    `json:"financing"`
		ID             string    `json:"id"`
		Instrument     string    `json:"instrument"`
		OrderID        string    `json:"orderID"`
		Pl             string    `json:"pl"`
		Price          string    `json:"price"`
		Reason         string    `json:"reason"`
		Time           time.Time `json:"time"`
		TradeOpened    struct {
			TradeID string `json:"tradeID"`
			Units   string `json:"units"`
		} `json:"tradeOpened"`
		Type   string `json:"type"`
		Units  string `json:"units"`
		UserID int    `json:"userID"`
	} `json:"transaction"`
}

type TransactionPages

type TransactionPages struct {
	Count             int       `json:"count"`
	From              time.Time `json:"from"`
	LastTransactionID string    `json:"lastTransactionID"`
	PageSize          int       `json:"pageSize"`
	Pages             []string  `json:"pages"`
	To                time.Time `json:"to"`
}

type TransactionStreamResponse

type TransactionStreamResponse struct {
	Type          string          `json:"type"`
	Time          string          `json:"time"`
	TransactionID string          `json:"transactionID,omitempty"`
	AccountID     string          `json:"accountID,omitempty"`
	BatchID       string          `json:"batchID,omitempty"`
	RequestID     string          `json:"requestID,omitempty"`
	Transaction   json.RawMessage `json:"transaction,omitempty"`
}

type Transactions

type Transactions struct {
	LastTransactionID string `json:"lastTransactionID"`
	Transactions      []struct {
		AccountBalance string    `json:"accountBalance"`
		AccountID      string    `json:"accountID"`
		BatchID        string    `json:"batchID"`
		Financing      string    `json:"financing"`
		ID             string    `json:"id"`
		Instrument     string    `json:"instrument"`
		OrderID        string    `json:"orderID"`
		Pl             string    `json:"pl"`
		Price          string    `json:"price"`
		Reason         string    `json:"reason"`
		Time           time.Time `json:"time"`
		TradeOpened    struct {
			TradeID string `json:"tradeID"`
			Units   string `json:"units"`
		} `json:"tradeOpened"`
		Type   string `json:"type"`
		Units  string `json:"units"`
		UserID int    `json:"userID"`
	} `json:"transactions"`
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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