Help us shape the future of Go! Take the 2026 Go Developer Survey

gofix

package module
v0.1.0-beta Latest Latest
Warning

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

Go to latest
Published: Oct 19, 2026 License: Apache-1.1 Imports: 29 Imported by: 0

README

gofix

Build Status GoDoc Go Report Card

A FIX Protocol engine for Go, maintained by Appital.

⚠️ Warning
gofix is an experimental fork built for Appital's own use. We do not support it for any other use. Its API and behaviour may change without notice, and we do not plan to accept outside feature requests or provide help with integration. For most projects we strongly recommend the upstream QuickFIX/Go library instead.

Why a fork?

gofix is a direct fork of QuickFIX/Go, taken at v0.9.12. QuickFIX/Go is a mature, well-tested engine and remains the base of this one; nearly all of the session, store, log and data-dictionary code here is theirs.

We forked to drop QuickFIX/Go's compatibility constraints. As a widely used library, upstream has to keep its public API, its behaviour and its generated-code layout stable. That limits which changes it can accept, especially changes for performance and for running many sessions in one process. gofix does not make those guarantees, so we can:

  • Change the API and behaviour when it helps. For example, ReuseIncomingMessages shortens how long a received *Message is valid, and UseTCPProxy=Y now requires a PROXY protocol header on every connection.
  • Cut allocations and syscalls on the hot path. Parsing, validating and building messages, field lookup and repeating groups have been reworked to allocate little or nothing per message. The write loop now batches outbound messages.
  • Scale to many sessions. We fixed write-loop busy-waiting that saturated the CPU once there were more sessions than spare cores.
  • Add settings we need in production. These include MaxMessagesPerSecond rate limiting, LogoutTimeout on acceptor sessions and a Metrics interface for connection metrics, with an optional Prometheus implementation.
  • Keep generated code alongside the engine. The FIX 4.0 to 5.0SP2 packages are generated into gen/ from spec/ under the github.com/appital/gofix/gen module path. They are not published as separate repositories.

gofix is not a drop-in replacement for QuickFIX/Go. The package is named gofix, the import paths are different, and breaking changes are listed under BREAKING CHANGES in CHANGELOG.md. When upstream fixes are relevant, we port them by hand.

Features

Inherited from QuickFIX/Go:

  • FIX versions 4.0 to 5.0SP2
  • Spec-driven run-time message validation
  • Spec-driven code generation of type-safe FIX messages, fields and repeating groups
  • Session state storage: SQL, on-disk or in-memory
  • Logging: file, screen, SQL or composite
  • Daily and weekly session scheduling
  • TLS support
  • The QuickFIX acceptance test suite

Installation

go get github.com/appital/gofix
import "github.com/appital/gofix"

Generated Code

The generated message, field, tag and enum packages are not checked in. To generate them into gen/, run:

make generate             # or: make generate-udecimal

Then import them from github.com/appital/gofix/gen/..., for example github.com/appital/gofix/gen/fix44/newordersingle.

Generated code has the .generated.go suffix. To change it, edit the generator in cmd/generate-fix. For applications with a custom FIX spec, run go run ./cmd/generate-fix --help to see how to generate code from your own XML.

Metrics

gofix does not record metrics itself. To count the messages and bytes each session sends and receives, implement gofix.MetricsFactory and pass it to NewAcceptor or NewInitiator with gofix.WithMetrics. See docs/METRICS.md for an example.

For Prometheus, use the separate github.com/appital/gofix/metrics/prometheus module, which keeps the Prometheus client out of the core module:

import (
	gofixprom "github.com/appital/gofix/metrics/prometheus"
	"github.com/prometheus/client_golang/prometheus"
)

metrics, err := gofixprom.NewMetricsFactory(prometheus.DefaultRegisterer)
...
acceptor, err := gofix.NewAcceptor(app, storeFactory, settings, logFactory, gofix.WithMetrics(metrics))

It records gofix_outgoing_message_count, gofix_outgoing_message_bytes, gofix_incoming_message_count and gofix_incoming_message_bytes, labelled by sessionID.

Documentation

Development

Build and Test

The default make target runs go vet and the unit tests:

make

A VS Code dev container config is in .devcontainer/ if you want a ready-made environment.

Acceptance Tests

The acceptance suite is the same one used across all QuickFIX implementations, and it needs Ruby on your PATH:

make generate
make build-test-srv
make accept
Benchmarking

Performance changes should come with measurements. The repository includes a benchmark corpus, per-layer micro-benchmarks and a full-stack load generator:

# record a baseline, make a change, then compare
make bench-baseline
make bench
make bench-compare

# profile one benchmark
make bench-profile BENCH=BenchmarkRoundTrip

# full-stack load test over loopback TCP, with profiles
make generate
make loadtest

For details, see docs/BENCHMARKING.md.

Licensing

gofix is derived from QuickFIX/Go and is distributed under the QuickFIX Software License. For its terms, see LICENSE.

This product includes software developed by quickfixengine.org (https://www.quickfixengine.org/).

Documentation

Overview

Package gofix is a full featured messaging engine for the FIX protocol. It is based on the open source QuickFIX/Go engine, with some performance improvements and breaking API changes from the original library. The original QuickFIX/Go library is a 100% Go open source implementation of the popular C++ QuickFIX engine (http://quickfixengine.org).

Warning

gofix is an experimental fork built for Appital's own use. We do not support it for any other use. Its API and behaviour may change without notice, and we do not plan to accept outside feature requests or provide help with integration. For most projects we strongly recommend the upstream QuickFIX/Go library instead.

The QuickFIX/Go user manual at https://quickfixengine.org/go/documentation/ still covers most configuration and concepts. Where gofix differs, see CHANGELOG.md and the config package.

Index

Constants

View Source
const (
	BeginStringFIX40  = "FIX.4.0"
	BeginStringFIX41  = "FIX.4.1"
	BeginStringFIX42  = "FIX.4.2"
	BeginStringFIX43  = "FIX.4.3"
	BeginStringFIX44  = "FIX.4.4"
	BeginStringFIXT11 = "FIXT.1.1"
)

FIX BeginString string values.

View Source
const (
	ApplVerIDFIX27    = "0"
	ApplVerIDFIX30    = "1"
	ApplVerIDFIX40    = "2"
	ApplVerIDFIX41    = "3"
	ApplVerIDFIX42    = "4"
	ApplVerIDFIX43    = "5"
	ApplVerIDFIX44    = "6"
	ApplVerIDFIX50    = "7"
	ApplVerIDFIX50SP1 = "8"
	ApplVerIDFIX50SP2 = "9"
)

FIX ApplVerID string values.

View Source
const (
	UserDefinedTagMin int = 5000
)

Variables

View Source
var ErrDoNotSend = errors.New("Do Not Send") //nolint:staticcheck // ST1005: exported message kept for compatibility.

ErrDoNotSend is a convenience error to indicate a DoNotSend in ToApp.

Functions

func GetExpectedSenderNum

func GetExpectedSenderNum(sessionID SessionID) (int, error)

GetExpectedSenderNum retrieves the expected sender sequence number for the session matching the session id. It uses the DefaultRegistry.

func GetExpectedTargetNum

func GetExpectedTargetNum(sessionID SessionID) (int, error)

GetExpectedTargetNum retrieves the next target sequence number for the session matching the session id. It uses the DefaultRegistry.

func ParseMessage

func ParseMessage(msg *Message, rawMessage *bytes.Buffer) (err error)

ParseMessage constructs a Message from a byte slice wrapping a FIX message.

func ParseMessageWithDataDictionary

func ParseMessageWithDataDictionary(
	msg *Message,
	rawMessage *bytes.Buffer,
	transportDataDictionary *datadictionary.DataDictionary,
	appDataDictionary *datadictionary.DataDictionary,
) (err error)

ParseMessageWithDataDictionary constructs a Message from a byte slice wrapping a FIX message using an optional session and application DataDictionary for reference.

func ResetSession

func ResetSession(sessionID SessionID) error

ResetSession resets session's sequence numbers. It uses the DefaultRegistry.

func Send

func Send(m Messagable) (err error)

Send determines the session to send Messagable using header fields BeginString, TargetCompID, SenderCompID. It uses the DefaultRegistry.

func SendToTarget

func SendToTarget(m Messagable, sessionID SessionID) error

SendToTarget sends a message based on the sessionID. Convenient for use in FromApp since it provides a session ID for incoming messages. It uses the DefaultRegistry.

func SetNextSenderMsgSeqNum

func SetNextSenderMsgSeqNum(sessionID SessionID, seqNum int) error

SetNextSenderMsgSeqNum sets the next outgoing message sequence number for the session matching the session id. It uses the DefaultRegistry.

func SetNextTargetMsgSeqNum

func SetNextTargetMsgSeqNum(sessionID SessionID, seqNum int) error

SetNextTargetMsgSeqNum set the next expected target message sequence number for the session matching the session id. It uses the DefaultRegistry.

func UnregisterSession

func UnregisterSession(sessionID SessionID) error

UnregisterSession removes a session from the set of known sessions. It uses the DefaultRegistry.

Types

type Acceptor

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

Acceptor accepts connections from FIX clients and manages the associated sessions.

func NewAcceptor

func NewAcceptor(app Application, storeFactory MessageStoreFactory, settings *Settings, logFactory LogFactory, opts ...Option) (a *Acceptor, err error)

NewAcceptor creates and initializes a new Acceptor.

func (*Acceptor) Registry

func (a *Acceptor) Registry() *Registry

Registry returns the Registry the Acceptor's sessions are registered in.

func (*Acceptor) RemoteAddr

func (a *Acceptor) RemoteAddr(sessionID SessionID) (net.Addr, bool)

RemoteAddr gets remote IP address for a given session.

func (*Acceptor) SetConnectionValidator

func (a *Acceptor) SetConnectionValidator(validator ConnectionValidator)

SetConnectionValidator sets an optional connection validator. Use it when you need a custom authentication logic that includes lower level interactions, like mTLS auth or IP whitelistening. To remove a previously set validator call it with a nil value:

a.SetConnectionValidator(nil)

func (*Acceptor) SetNewListenerCallback

func (a *Acceptor) SetNewListenerCallback(cb NewListenerCallback)

SetNewListenerCallback allows the creator of the Acceptor to specify the callback used to create each net.Listener which will be used in the Start() method.

func (*Acceptor) SetTLSConfig

func (a *Acceptor) SetTLSConfig(tlsConfig *tls.Config)

SetTLSConfig allows the creator of the Acceptor to specify a fully customizable tls.Config of their choice, which will be used in the Start() method.

Note: when the caller explicitly provides a tls.Config with this function, it takes precendent over TLS settings specified in the acceptor's settings.GlobalSettings(), meaning that the `settings.GlobalSettings()` object is not inspected or used for the creation of the tls.Config.

func (*Acceptor) Start

func (a *Acceptor) Start() (err error)

Start accepting connections.

func (*Acceptor) Stop

func (a *Acceptor) Stop()

Stop logs out existing sessions, close their connections, and stop accepting new connections.

type Application

type Application interface {
	// OnCreate notification of a session begin created.
	OnCreate(sessionID SessionID)

	// OnLogon notification of a session successfully logging on.
	OnLogon(sessionID SessionID)

	// OnLogout notification of a session logging off or disconnecting.
	OnLogout(sessionID SessionID)

	// ToAdmin notification of admin message being sent to target.
	ToAdmin(message *Message, sessionID SessionID)

	// ToApp notification of app message being sent to target.
	ToApp(message *Message, sessionID SessionID) error

	// FromAdmin notification of admin message being received from target.
	FromAdmin(message *Message, sessionID SessionID) MessageRejectError

	// FromApp notification of app message being received from target.
	FromApp(message *Message, sessionID SessionID) MessageRejectError
}

Application interface should be implemented by FIX Applications. This is the primary interface for processing messages from a FIX Session.

type Body

type Body struct{ FieldMap }

Body is the primary application section of a FIX message.

func (*Body) Init

func (b *Body) Init()

Init initializes the FIX message.

func (Body) Len

func (t Body) Len() int

func (Body) Less

func (t Body) Less(i, j int) bool

func (Body) Swap

func (t Body) Swap(i, j int)

type ConditionallyRequiredSetting

type ConditionallyRequiredSetting struct {
	Setting string
}

ConditionallyRequiredSetting indicates a missing setting.

func (ConditionallyRequiredSetting) Error

type ConnectionValidator

type ConnectionValidator interface {
	// Validate the connection for validity. This can be a part of authentication process.
	// For example, you may tie up a SenderCompID to an IP range, or to a specific TLS certificate as a part of mTLS.
	Validate(netConn net.Conn, session SessionID) error
}

ConnectionValidator is an interface allowing to implement a custom authentication logic.

type FIXBoolean

type FIXBoolean bool

FIXBoolean is a FIX Boolean value, implements FieldValue.

func (FIXBoolean) Bool

func (f FIXBoolean) Bool() bool

Bool converts the FIXBoolean value to bool.

func (*FIXBoolean) Read

func (f *FIXBoolean) Read(bytes []byte) error

func (FIXBoolean) Write

func (f FIXBoolean) Write() []byte

type FIXBytes

type FIXBytes []byte

FIXBytes is a generic FIX field value, implements FieldValue. Enables zero copy read from a FieldMap.

func (*FIXBytes) Read

func (f *FIXBytes) Read(bytes []byte) (err error)

func (FIXBytes) Write

func (f FIXBytes) Write() []byte

type FIXDecimal

type FIXDecimal struct {
	decimal.Decimal

	// Scale is the number of digits after the decimal point when Writing the field value as a FIX value.
	Scale int32
}

FIXDecimal is a FIX Float Value that implements an arbitrary precision fixed-point decimal. Implements FieldValue.

func (*FIXDecimal) Read

func (d *FIXDecimal) Read(bytes []byte) (err error)

func (FIXDecimal) Write

func (d FIXDecimal) Write() []byte

type FIXFloat

type FIXFloat float64

FIXFloat is a FIX Float Value, implements FieldValue.

func (FIXFloat) Float64

func (f FIXFloat) Float64() float64

Float64 converts the FIXFloat value to float64.

func (*FIXFloat) Read

func (f *FIXFloat) Read(bytes []byte) error

func (FIXFloat) Write

func (f FIXFloat) Write() []byte

type FIXInt

type FIXInt int

FIXInt is a FIX Int Value, implements FieldValue.

func (FIXInt) Int

func (f FIXInt) Int() int

Int converts the FIXInt value to int.

func (*FIXInt) Read

func (f *FIXInt) Read(bytes []byte) error

func (FIXInt) Write

func (f FIXInt) Write() []byte

type FIXString

type FIXString string

FIXString is a FIX String Value, implements FieldValue.

func (*FIXString) Read

func (f *FIXString) Read(bytes []byte) (err error)

func (FIXString) String

func (f FIXString) String() string

func (FIXString) Write

func (f FIXString) Write() []byte

type FIXUDecimal

type FIXUDecimal struct {
	udecimal.Decimal

	// Scale is the number of digits after the decimal point when Writing the field value as a FIX value.
	Scale uint8
}

FIXUDecimal is a FIX Float Value that implements an arbitrary precision fixed-point udecimal. Implements FieldValue.

func (*FIXUDecimal) Read

func (d *FIXUDecimal) Read(bytes []byte) (err error)

func (FIXUDecimal) Write

func (d FIXUDecimal) Write() []byte

type FIXUTCTimestamp

type FIXUTCTimestamp struct {
	time.Time
	Precision TimestampPrecision
}

FIXUTCTimestamp is a FIX UTC Timestamp value, implements FieldValue.

func (*FIXUTCTimestamp) Read

func (f *FIXUTCTimestamp) Read(bytes []byte) (err error)

func (FIXUTCTimestamp) Write

func (f FIXUTCTimestamp) Write() []byte

type Field

type Field interface {
	FieldWriter
	FieldValueReader
}

Field is the interface implemented by all typed Fields in a Message.

type FieldGroup

type FieldGroup interface {
	Tag() Tag
	Write() []TagValue
	Read([]TagValue) ([]TagValue, error)
}

FieldGroup is the interface implemented by all typed Groups in a Message.

type FieldGroupReader

type FieldGroupReader interface {
	Tag() Tag
	Read([]TagValue) ([]TagValue, error)
}

FieldGroupReader is an interface for reading a FieldGroup.

type FieldGroupWriter

type FieldGroupWriter interface {
	Tag() Tag
	Write() []TagValue
}

FieldGroupWriter is an interface for writing a FieldGroup.

type FieldMap

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

FieldMap is a collection of fix fields that make up a fix message.

func (*FieldMap) Clear

func (m *FieldMap) Clear()

Clear purges all fields from field map.

func (*FieldMap) CopyInto

func (m *FieldMap) CopyInto(to *FieldMap)

CopyInto overwrites the given FieldMap with this one.

func (FieldMap) Get

func (m FieldMap) Get(parser Field) MessageRejectError

Get parses out a field in this FieldMap. Returned reject may indicate the field is not present, or the field value is invalid.

func (FieldMap) GetBool

func (m FieldMap) GetBool(tag Tag) (bool, MessageRejectError)

GetBool is a GetField wrapper for bool fields.

func (FieldMap) GetBytes

func (m FieldMap) GetBytes(tag Tag) ([]byte, MessageRejectError)

GetBytes is a zero-copy GetField wrapper for []bytes fields.

func (FieldMap) GetField

func (m FieldMap) GetField(tag Tag, parser FieldValueReader) MessageRejectError

GetField parses of a field with Tag tag. Returned reject may indicate the field is not present, or the field value is invalid.

func (FieldMap) GetGroup

func (m FieldMap) GetGroup(parser FieldGroupReader) MessageRejectError

GetGroup is a Get function specific to Group Fields.

func (FieldMap) GetInt

func (m FieldMap) GetInt(tag Tag) (int, MessageRejectError)

GetInt is a GetField wrapper for int fields.

func (FieldMap) GetString

func (m FieldMap) GetString(tag Tag) (string, MessageRejectError)

GetString is a GetField wrapper for string fields.

func (FieldMap) GetTime

func (m FieldMap) GetTime(tag Tag) (t time.Time, err MessageRejectError)

GetTime is a GetField wrapper for utc timestamp fields.

func (FieldMap) Has

func (m FieldMap) Has(tag Tag) bool

Has returns true if the Tag is present in this FieldMap.

func (FieldMap) Len

func (t FieldMap) Len() int

func (FieldMap) Less

func (t FieldMap) Less(i, j int) bool

func (*FieldMap) Remove

func (m *FieldMap) Remove(tag Tag)

Remove removes a tag from field map.

func (*FieldMap) Set

func (m *FieldMap) Set(field FieldWriter) *FieldMap

Set is a setter for fields.

func (*FieldMap) SetBool

func (m *FieldMap) SetBool(tag Tag, value bool) *FieldMap

SetBool is a SetField wrapper for bool fields.

func (*FieldMap) SetBytes

func (m *FieldMap) SetBytes(tag Tag, value []byte) *FieldMap

SetBytes sets bytes.

func (*FieldMap) SetField

func (m *FieldMap) SetField(tag Tag, field FieldValueWriter) *FieldMap

SetField sets the field with Tag tag.

func (*FieldMap) SetGroup

func (m *FieldMap) SetGroup(field FieldGroupWriter) *FieldMap

SetGroup is a setter specific to group fields.

func (*FieldMap) SetInt

func (m *FieldMap) SetInt(tag Tag, value int) *FieldMap

SetInt is a SetField wrapper for int fields.

func (*FieldMap) SetString

func (m *FieldMap) SetString(tag Tag, value string) *FieldMap

SetString is a SetField wrapper for string fields.

func (FieldMap) Swap

func (t FieldMap) Swap(i, j int)

func (FieldMap) Tags

func (m FieldMap) Tags() []Tag

Tags returns all of the Field Tags in this FieldMap.

type FieldValue

type FieldValue interface {
	FieldValueWriter
	FieldValueReader
}

The FieldValue interface is used to write/extract typed field values to/from raw bytes.

type FieldValueReader

type FieldValueReader interface {
	// Read reads the contents of the `[]byte` into FieldValue.
	// Returns an error if there are issues in the data processing.
	Read([]byte) error
}

FieldValueReader is an interface for reading field values.

type FieldValueWriter

type FieldValueWriter interface {
	// Write writes out the contents of the FieldValue to a `[]byte`.
	Write() []byte
}

FieldValueWriter is an interface for writing field values.

type FieldWriter

type FieldWriter interface {
	Tag() Tag
	FieldValueWriter
}

FieldWriter is an interface for a writing a field.

type Group

type Group struct{ FieldMap }

Group is a group of fields occurring in a repeating group.

func (Group) Len

func (t Group) Len() int

func (Group) Less

func (t Group) Less(i, j int) bool

func (Group) Swap

func (t Group) Swap(i, j int)

type GroupItem

type GroupItem interface {
	// Tag returns the tag identifying this GroupItem.
	Tag() Tag

	// Read Parameter to Read is tagValues.  For most fields, only the first tagValue will be required.
	// The length of the slice extends from the tagValue mapped to the field to be read through the
	// following fields. This can be useful for GroupItems made up of repeating groups.
	//
	// The Read function returns the remaining tagValues not processed by the GroupItem. If there was a
	// problem reading the field, an error may be returned.
	Read([]TagValue) ([]TagValue, error)

	// Clone makes a copy of this GroupItem.
	Clone() GroupItem
}

GroupItem interface is used to construct repeating group templates.

func GroupElement

func GroupElement(tag Tag) GroupItem

GroupElement returns a GroupItem made up of a single field.

type GroupTemplate

type GroupTemplate []GroupItem

GroupTemplate specifies the group item order for a RepeatingGroup.

func (GroupTemplate) Clone

func (gt GroupTemplate) Clone() GroupTemplate

Clone makes a copy of this GroupTemplate.

type Header struct{ FieldMap }

Header is first section of a FIX Message.

func (*Header) Init

func (h *Header) Init()

Init initializes the Header instance.

func (Header) Len

func (t Header) Len() int

func (Header) Less

func (t Header) Less(i, j int) bool

func (Header) Swap

func (t Header) Swap(i, j int)

type IncorrectFormatForSetting

type IncorrectFormatForSetting struct {
	Setting string
	Value   []byte
	Err     error
}

IncorrectFormatForSetting indicates a setting that is incorrectly formatted.

func (IncorrectFormatForSetting) Error

type Initiator

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

Initiator initiates connections and processes messages for all sessions.

func NewInitiator

func NewInitiator(app Application, storeFactory MessageStoreFactory, appSettings *Settings, logFactory LogFactory, opts ...Option) (*Initiator, error)

NewInitiator creates and initializes a new Initiator.

func (*Initiator) Registry

func (i *Initiator) Registry() *Registry

Registry returns the Registry the Initiator's sessions are registered in.

func (*Initiator) Start

func (i *Initiator) Start() (err error)

Start Initiator.

func (*Initiator) Stop

func (i *Initiator) Stop()

Stop Initiator.

type Log

type Log interface {
	// OnIncoming log incoming fix message.
	OnIncoming([]byte)

	// OnOutgoing log outgoing fix message.
	OnOutgoing([]byte)

	// OnEvent log fix event.
	OnEvent(string)

	// OnEventf log fix event according to format specifier.
	OnEventf(string, ...any)
}

Log is a generic interface for logging FIX messages and events.

func GetLog

func GetLog(sessionID SessionID) (Log, error)

GetLog returns the Log interface for session matching the session id. It uses the DefaultRegistry.

type LogFactory

type LogFactory interface {
	// Create global log.
	Create() (Log, error)

	// CreateSessionLog session specific log.
	CreateSessionLog(sessionID SessionID) (Log, error)
}

The LogFactory interface creates global and session specific Log instances.

func NewNullLogFactory

func NewNullLogFactory() LogFactory

NewNullLogFactory creates an instance of LogFactory that returns no-op loggers.

type Messagable

type Messagable interface {
	ToMessage() *Message
}

Messagable is a Message or something that can be converted to a Message.

type Message

type Message struct {
	Header  Header
	Trailer Trailer
	Body    Body

	// ReceiveTime is the time that this message was read from the socket connection.
	ReceiveTime time.Time
	// contains filtered or unexported fields
}

Message is a FIX Message abstraction.

func NewMessage

func NewMessage() *Message

NewMessage returns a newly initialized Message instance.

func (*Message) Bytes

func (m *Message) Bytes() []byte

func (*Message) CopyInto

func (m *Message) CopyInto(to *Message)

CopyInto erases the dest messages and copies the currency message content into it.

func (*Message) IsMsgTypeOf

func (m *Message) IsMsgTypeOf(msgType string) bool

IsMsgTypeOf returns true if the Header contains MsgType (tag 35) field and its value is the specified one.

func (*Message) MsgType

func (m *Message) MsgType() (string, MessageRejectError)

MsgType returns MsgType (tag 35) field's value.

func (*Message) String

func (m *Message) String() string

func (*Message) ToMessage

func (m *Message) ToMessage() *Message

ToMessage returns the message itself.

type MessageRejectError

type MessageRejectError interface {
	error

	// RejectReason, tag 373 for session rejects, tag 380 for business rejects.
	RejectReason() int
	BusinessRejectRefID() string
	RefTagID() *Tag
	IsBusinessReject() bool
}

MessageRejectError is a type of error that can correlate to a message reject.

func ConditionallyRequiredFieldMissing

func ConditionallyRequiredFieldMissing(tag Tag) MessageRejectError

ConditionallyRequiredFieldMissing indicates that the requested field could not be found in the FIX message.

func IncorrectDataFormatForValue

func IncorrectDataFormatForValue(tag Tag) MessageRejectError

IncorrectDataFormatForValue returns an error indicating a field that cannot be parsed as the type required.

func InvalidMessageType

func InvalidMessageType() MessageRejectError

InvalidMessageType returns an error to indicate an invalid message type.

func InvalidTagNumber

func InvalidTagNumber(tag Tag) MessageRejectError

InvalidTagNumber returns a validation error for messages with invalid tags.

func NewBusinessMessageRejectError

func NewBusinessMessageRejectError(err string, rejectReason int, refTagID *Tag) MessageRejectError

NewBusinessMessageRejectError returns a MessageRejectError with the given error mesage, reject reason, and optional reftagid. Reject is treated as a business level reject.

func NewBusinessMessageRejectErrorWithRefID

func NewBusinessMessageRejectErrorWithRefID(err string, rejectReason int, businessRejectRefID string, refTagID *Tag) MessageRejectError

NewBusinessMessageRejectErrorWithRefID returns a MessageRejectError with the given error mesage, reject reason, refID, and optional reftagid. Reject is treated as a business level reject.

func NewMessageRejectError

func NewMessageRejectError(err string, rejectReason int, refTagID *Tag) MessageRejectError

NewMessageRejectError returns a MessageRejectError with the given error message, reject reason, and optional reftagid.

func RequiredTagMissing

func RequiredTagMissing(tag Tag) MessageRejectError

RequiredTagMissing returns a validation error when a required field cannot be found in a message.

func TagNotDefinedForThisMessageType

func TagNotDefinedForThisMessageType(tag Tag) MessageRejectError

TagNotDefinedForThisMessageType returns an error for an invalid tag appearing in a message.

func TagSpecifiedWithoutAValue

func TagSpecifiedWithoutAValue(tag Tag) MessageRejectError

TagSpecifiedWithoutAValue returns a validation error for when a field has no value.

func UnsupportedMessageType

func UnsupportedMessageType() MessageRejectError

UnsupportedMessageType returns an error to indicate an unhandled message.

func ValueIsIncorrect

func ValueIsIncorrect(tag Tag) MessageRejectError

ValueIsIncorrect returns an error indicating a field with value that is not valid.

type MessageRoute

type MessageRoute func(msg *Message, sessionID SessionID) MessageRejectError

A MessageRoute is a function that can process a fromApp/fromAdmin callback.

type MessageRouter

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

A MessageRouter is a mutex for MessageRoutes.

func NewMessageRouter

func NewMessageRouter(opts ...Option) *MessageRouter

NewMessageRouter returns an initialized MessageRouter instance. Pass WithRegistry when the router serves sessions registered in a Registry other than the DefaultRegistry.

func (MessageRouter) AddRoute

func (c MessageRouter) AddRoute(beginString string, msgType string, router MessageRoute)

AddRoute adds a route to the MessageRouter instance keyed to begin string and msgType.

func (MessageRouter) Route

func (c MessageRouter) Route(msg *Message, sessionID SessionID) MessageRejectError

Route may be called from the fromApp/fromAdmin callbacks. Messages that cannot be routed will be rejected with UnsupportedMessageType.

type MessageStore

type MessageStore interface {
	NextSenderMsgSeqNum() int
	NextTargetMsgSeqNum() int

	IncrNextSenderMsgSeqNum() error
	IncrNextTargetMsgSeqNum() error

	SetNextSenderMsgSeqNum(next int) error
	SetNextTargetMsgSeqNum(next int) error

	CreationTime() time.Time
	SetCreationTime(time.Time)

	SaveMessage(seqNum int, msg []byte) error
	SaveMessageAndIncrNextSenderMsgSeqNum(seqNum int, msg []byte) error
	GetMessages(beginSeqNum, endSeqNum int) ([][]byte, error)
	IterateMessages(beginSeqNum, endSeqNum int, cb func([]byte) error) error

	Refresh() error
	Reset() error

	Close() error
}

The MessageStore interface provides methods to record and retrieve messages for resend purposes.

func GetMessageStore

func GetMessageStore(sessionID SessionID) (MessageStore, error)

GetMessageStore returns the MessageStore interface for session matching the session id. It uses the DefaultRegistry.

type MessageStoreFactory

type MessageStoreFactory interface {
	Create(sessionID SessionID) (MessageStore, error)
}

The MessageStoreFactory interface is used by session to create a session specific message store.

func NewMemoryStoreFactory

func NewMemoryStoreFactory() MessageStoreFactory

NewMemoryStoreFactory returns a MessageStoreFactory instance that created in-memory MessageStores.

type Metrics

type Metrics interface {
	// MessageSent is called for each message the write loop writes, with its
	// length in bytes.
	MessageSent(bytes int)

	// MessageReceived is called for each message the read loop parses, with
	// its length in bytes.
	MessageReceived(bytes int)
}

Metrics records connection activity for one session. Its methods are called from the read and write loops for every message, so they should be cheap and must be safe to call from different goroutines.

type MetricsFactory

type MetricsFactory interface {
	CreateSessionMetrics(sessionID SessionID) Metrics
}

MetricsFactory creates the Metrics for each session. It is called once per session, including dynamic sessions, when the session is created.

type NewListenerCallback

type NewListenerCallback func(address string, tlsConfig *tls.Config) (net.Listener, error)

NewListenerCallback is a function that returns a net.Listener for the given address and tls.Config struct.

type Option

type Option func(*options)

Option configures an Acceptor, Initiator or MessageRouter.

func WithMetrics

func WithMetrics(f MetricsFactory) Option

WithMetrics sets the MetricsFactory that creates the Metrics each session records connection activity to. Without it nothing is recorded. It has no effect on a MessageRouter.

func WithRegistry

func WithRegistry(r *Registry) Option

WithRegistry sets the Registry that sessions are registered in and looked up from. Without it the shared DefaultRegistry is used.

type Registry

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

Registry is a set of sessions keyed by SessionID. Acceptors and Initiators register their sessions in a Registry, which is the shared DefaultRegistry unless WithRegistry is supplied.

func DefaultRegistry

func DefaultRegistry() *Registry

DefaultRegistry returns the shared Registry used by Acceptors, Initiators and MessageRouters created without WithRegistry, and by the package level functions such as SendToTarget.

func NewRegistry

func NewRegistry() *Registry

NewRegistry returns an empty Registry.

func (*Registry) GetExpectedSenderNum

func (r *Registry) GetExpectedSenderNum(sessionID SessionID) (int, error)

GetExpectedSenderNum retrieves the expected sender sequence number for the session matching the session id.

func (*Registry) GetExpectedTargetNum

func (r *Registry) GetExpectedTargetNum(sessionID SessionID) (int, error)

GetExpectedTargetNum retrieves the next target sequence number for the session matching the session id.

func (*Registry) GetLog

func (r *Registry) GetLog(sessionID SessionID) (Log, error)

GetLog returns the Log interface for session matching the session id.

func (*Registry) GetMessageStore

func (r *Registry) GetMessageStore(sessionID SessionID) (MessageStore, error)

GetMessageStore returns the MessageStore interface for session matching the session id.

func (*Registry) ResetSession

func (r *Registry) ResetSession(sessionID SessionID) error

ResetSession resets session's sequence numbers.

func (*Registry) Send

func (r *Registry) Send(m Messagable) (err error)

Send determines the session to send Messagable using header fields BeginString, TargetCompID, SenderCompID.

func (*Registry) SendToTarget

func (r *Registry) SendToTarget(m Messagable, sessionID SessionID) error

SendToTarget sends a message based on the sessionID. Convenient for use in FromApp since it provides a session ID for incoming messages.

func (*Registry) SetNextSenderMsgSeqNum

func (r *Registry) SetNextSenderMsgSeqNum(sessionID SessionID, seqNum int) error

SetNextSenderMsgSeqNum sets the next outgoing message sequence number for the session matching the session id.

func (*Registry) SetNextTargetMsgSeqNum

func (r *Registry) SetNextTargetMsgSeqNum(sessionID SessionID, seqNum int) error

SetNextTargetMsgSeqNum set the next expected target message sequence number for the session matching the session id.

func (*Registry) UnregisterSession

func (r *Registry) UnregisterSession(sessionID SessionID) error

UnregisterSession removes a session from the set of known sessions.

type RejectLogon

type RejectLogon struct {
	Text string
}

RejectLogon indicates the application is rejecting permission to logon. Implements MessageRejectError.

func (RejectLogon) BusinessRejectRefID

func (RejectLogon) BusinessRejectRefID() string

BusinessRejectRefID implements MessageRejectError.

func (RejectLogon) Error

func (e RejectLogon) Error() string

func (RejectLogon) IsBusinessReject

func (RejectLogon) IsBusinessReject() bool

IsBusinessReject implements MessageRejectError.

func (RejectLogon) RefTagID

func (RejectLogon) RefTagID() *Tag

RefTagID implements MessageRejectError.

func (RejectLogon) RejectReason

func (RejectLogon) RejectReason() int

RejectReason implements MessageRejectError.

type RepeatingGroup

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

RepeatingGroup is a FIX Repeating Group type.

func NewRepeatingGroup

func NewRepeatingGroup(tag Tag, template GroupTemplate) *RepeatingGroup

NewRepeatingGroup returns an initilized RepeatingGroup instance.

func (*RepeatingGroup) Add

func (f *RepeatingGroup) Add() *Group

Add appends a new group to the RepeatingGroup and returns the new Group.

func (RepeatingGroup) Clone

func (f RepeatingGroup) Clone() GroupItem

Clone makes a copy of this RepeatingGroup (tag, template).

func (RepeatingGroup) Get

func (f RepeatingGroup) Get(i int) *Group

Get returns the ith group in this RepeatingGroup.

func (RepeatingGroup) Len

func (f RepeatingGroup) Len() int

Len returns the number of Groups in this RepeatingGroup.

func (*RepeatingGroup) Read

func (f *RepeatingGroup) Read(tv []TagValue) ([]TagValue, error)

func (*RepeatingGroup) Reset

func (f *RepeatingGroup) Reset()

Reset clears all groups from this RepeatingGroup, allowing the instance to be reused for a new message parse without reallocating the template and struct. This avoids the allocation overhead of calling NewRepeatingGroup for each parse.

func (RepeatingGroup) Tag

func (f RepeatingGroup) Tag() Tag

Tag returns the Tag for this repeating Group.

func (RepeatingGroup) Write

func (f RepeatingGroup) Write() []TagValue

Write returns tagValues for all Items in the repeating group ordered by Group sequence and Group template order.

type SessionID

type SessionID struct {
	BeginString, TargetCompID, TargetSubID, TargetLocationID, SenderCompID, SenderSubID, SenderLocationID, Qualifier string
}

SessionID is a unique identifier of a Session.

func (SessionID) IsFIXT

func (s SessionID) IsFIXT() bool

IsFIXT returns true if the SessionID has a FIXT BeginString.

func (SessionID) String

func (s SessionID) String() string

type SessionSettings

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

SessionSettings maps session settings to values with typed accessors.

func NewSessionSettings

func NewSessionSettings() *SessionSettings

NewSessionSettings returns a newly initialized SessionSettings instance.

func (SessionSettings) BoolSetting

func (s SessionSettings) BoolSetting(setting string) (bool, error)

BoolSetting returns the requested setting parsed as a boolean. Returns an error if the setting is not set or cannot be parsed as a bool.

func (*SessionSettings) DurationSetting

func (s *SessionSettings) DurationSetting(setting string) (time.Duration, error)

DurationSetting returns the requested setting parsed as a time.Duration. Returns an error if the setting is not set or cannot be parsed as a time.Duration.

func (*SessionSettings) HasSetting

func (s *SessionSettings) HasSetting(setting string) bool

HasSetting returns true if a setting is set, false if not.

func (*SessionSettings) Init

func (s *SessionSettings) Init()

Init initializes or resets SessionSettings.

func (*SessionSettings) IntSetting

func (s *SessionSettings) IntSetting(setting string) (int, error)

IntSetting returns the requested setting parsed as an int. Returns an errror if the setting is not set or cannot be parsed as an int.

func (*SessionSettings) RawSetting

func (s *SessionSettings) RawSetting(setting string) ([]byte, error)

RawSetting is a settings accessor that returns the raw byte slice value of the setting. Returns an error if the setting is missing.

func (*SessionSettings) Set

func (s *SessionSettings) Set(setting string, val string)

Set assigns a string value to a setting on SessionSettings.

func (*SessionSettings) SetRaw

func (s *SessionSettings) SetRaw(setting string, val []byte)

SetRaw assigns a value to a setting on SessionSettings.

func (*SessionSettings) Setting

func (s *SessionSettings) Setting(setting string) (string, error)

Setting is a settings string accessor. Returns an error if the setting is missing.

type Settings

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

The Settings type represents a collection of global and session settings.

func NewSettings

func NewSettings() *Settings

NewSettings creates a Settings instance.

func ParseSettings

func ParseSettings(reader io.Reader) (*Settings, error)

ParseSettings creates and initializes a Settings instance with config parsed from a Reader. Returns error if the config is has parse errors.

func (*Settings) AddSession

func (s *Settings) AddSession(sessionSettings *SessionSettings) (SessionID, error)

AddSession adds Session Settings to Settings instance. Returns an error if session settings with duplicate sessionID has already been added.

func (*Settings) GlobalSettings

func (s *Settings) GlobalSettings() *SessionSettings

GlobalSettings are default setting inherited by all session settings.

func (*Settings) Init

func (s *Settings) Init()

Init initializes or resets a Settings instance.

func (*Settings) SessionSettings

func (s *Settings) SessionSettings() map[SessionID]*SessionSettings

SessionSettings return all session settings overlaying globalsettings.

type Tag

type Tag int

Tag is a typed int representing a FIX tag.

func (Tag) IsHeader

func (t Tag) IsHeader() bool

IsHeader returns true if tag belongs in the message header.

func (Tag) IsTrailer

func (t Tag) IsTrailer() bool

IsTrailer returns true if tag belongs in the message trailer.

type TagValue

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

TagValue is a low-level FIX field abstraction.

func (TagValue) String

func (tv TagValue) String() string

type TimestampPrecision

type TimestampPrecision int

TimestampPrecision defines the precision used by FIXUTCTimestamp.

const (
	Millis TimestampPrecision = iota
	Seconds
	Micros
	Nanos
)

All TimestampPrecisions supported by FIX.

type Trailer

type Trailer struct{ FieldMap }

Trailer is the last section of a FIX message.

func (*Trailer) Init

func (t *Trailer) Init()

Init initializes the FIX message.

func (Trailer) Len

func (t Trailer) Len() int

func (Trailer) Less

func (t Trailer) Less(i, j int) bool

func (Trailer) Swap

func (t Trailer) Swap(i, j int)

type Validator

type Validator interface {
	Validate(*Message) MessageRejectError
}

Validator validates a FIX message.

func NewValidator

func NewValidator(settings ValidatorSettings, appDataDictionary, transportDataDictionary *datadictionary.DataDictionary) Validator

NewValidator creates a FIX message validator from the given data dictionaries.

type ValidatorSettings

type ValidatorSettings struct {
	CheckFieldsOutOfOrder     bool
	RejectInvalidMessage      bool
	AllowUnknownMessageFields bool
	CheckUserDefinedFields    bool
	CheckFieldsHaveValues     bool
}

ValidatorSettings describe validation behavior.

Directories

Path Synopsis
_test
loadgen command
Command loadgen drives a gofix acceptor and initiator against each other over loopback TCP at a controlled rate, and reports throughput, latency and allocation per message.
Command loadgen drives a gofix acceptor and initiator against each other over loopback TCP at a controlled rate, and reports throughput, latency and allocation per message.
test-server command
cmd
generate-fix command
generate-fix/internal
Package internal in the cmd/generate-fix binary entrypoint proviodes the tooling for generating FIX bindings from XML spec files.
Package internal in the cmd/generate-fix binary entrypoint proviodes the tooling for generating FIX bindings from XML spec files.
Package config declares settings for configuring QuickFIX/Go.
Package config declares settings for configuring QuickFIX/Go.
Package datadictionary provides support for parsing and organizing FIX Data Dictionaries
Package datadictionary provides support for parsing and organizing FIX Data Dictionaries
tape
Package tape generates a deterministic corpus ("tape") of representative FIX messages for benchmarking and load testing.
Package tape generates a deterministic corpus ("tape") of representative FIX messages for benchmarking and load testing.
log
sql
store
sql

Jump to

Keyboard shortcuts

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