diff --git a/tradeclient/console.go b/tradeclient/console.go index 9b0ae59..434e7f9 100644 --- a/tradeclient/console.go +++ b/tradeclient/console.go @@ -21,6 +21,13 @@ import ( fix44nos "github.com/quickfixgo/quickfix/fix44/newordersingle" fix50nos "github.com/quickfixgo/quickfix/fix50/newordersingle" + fix42mdr "github.com/quickfixgo/quickfix/fix42/marketdatarequest" + fix43mdr "github.com/quickfixgo/quickfix/fix43/marketdatarequest" + fix44mdr "github.com/quickfixgo/quickfix/fix44/marketdatarequest" + "github.com/quickfixgo/quickfix/fix50/instrmtmdreqgrp" + fix50mdr "github.com/quickfixgo/quickfix/fix50/marketdatarequest" + "github.com/quickfixgo/quickfix/fix50/mdreqgrp" + "os" "strconv" "strings" @@ -31,6 +38,8 @@ func queryAction() (string, error) { fmt.Println() fmt.Println("1) Enter Order") fmt.Println("2) Cancel Order") + fmt.Println("3) Request Market Test") + fmt.Println("4) Quit") fmt.Print("Action: ") scanner := bufio.NewScanner(os.Stdin) scanner.Scan() @@ -854,6 +863,74 @@ func queryOrderCancelRequest50() (msg quickfix.Message, err error) { queryHeader(msg.Header) return } +func queryMarketDataRequest42() (msg quickfix.Message, err error) { + request := fix42mdr.Message{ + MDReqID: "MARKETDATAID", + SubscriptionRequestType: enum.SubscriptionRequestType_SNAPSHOT, + MarketDepth: 0, + NoMDEntryTypes: []fix42mdr.NoMDEntryTypes{fix42mdr.NoMDEntryTypes{MDEntryType: enum.MDEntryType_BID}}, + NoRelatedSym: []fix42mdr.NoRelatedSym{fix42mdr.NoRelatedSym{Symbol: "LNUX"}}, + } + + msg = request.Marshal() + queryHeader(msg.Header) + return +} + +func queryMarketDataRequest43() (msg quickfix.Message, err error) { + request := fix43mdr.Message{ + MDReqID: "MARKETDATAID", + SubscriptionRequestType: enum.SubscriptionRequestType_SNAPSHOT, + MarketDepth: 0, + NoMDEntryTypes: []fix43mdr.NoMDEntryTypes{fix43mdr.NoMDEntryTypes{MDEntryType: enum.MDEntryType_BID}}, + } + + symbol := "LNUX" + var relatedSym fix43mdr.NoRelatedSym + relatedSym.Instrument.Symbol = &symbol + request.NoRelatedSym = []fix43mdr.NoRelatedSym{relatedSym} + + msg = request.Marshal() + queryHeader(msg.Header) + return +} + +func queryMarketDataRequest44() (msg quickfix.Message, err error) { + request := fix44mdr.Message{ + MDReqID: "MARKETDATAID", + SubscriptionRequestType: enum.SubscriptionRequestType_SNAPSHOT, + MarketDepth: 0, + NoMDEntryTypes: []fix44mdr.NoMDEntryTypes{fix44mdr.NoMDEntryTypes{MDEntryType: enum.MDEntryType_BID}}, + } + + symbol := "LNUX" + var relatedSym fix44mdr.NoRelatedSym + relatedSym.Instrument.Symbol = &symbol + request.NoRelatedSym = []fix44mdr.NoRelatedSym{relatedSym} + + msg = request.Marshal() + queryHeader(msg.Header) + return +} + +func queryMarketDataRequest50() (msg quickfix.Message, err error) { + request := fix50mdr.Message{ + MDReqID: "MARKETDATAID", + SubscriptionRequestType: enum.SubscriptionRequestType_SNAPSHOT, + MarketDepth: 0, + } + + request.MDReqGrp.NoMDEntryTypes = []mdreqgrp.NoMDEntryTypes{mdreqgrp.NoMDEntryTypes{enum.MDEntryType_BID}} + + symbol := "LNUX" + var relatedSym instrmtmdreqgrp.NoRelatedSym + relatedSym.Instrument.Symbol = &symbol + request.InstrmtMDReqGrp.NoRelatedSym = []instrmtmdreqgrp.NoRelatedSym{relatedSym} + + msg = request.Marshal() + queryHeader(msg.Header) + return +} func queryEnterOrder() error { beginString, err := queryVersion() @@ -929,3 +1006,38 @@ func queryCancelOrder() error { return nil } + +func queryMarketDataRequest() error { + beginString, err := queryVersion() + if err != nil { + return err + } + + var req quickfix.Message + switch beginString { + case enum.BeginStringFIX42: + req, err = queryMarketDataRequest42() + + case enum.BeginStringFIX43: + req, err = queryMarketDataRequest43() + + case enum.BeginStringFIX44: + req, err = queryMarketDataRequest44() + + case enum.BeginStringFIXT11: + req, err = queryMarketDataRequest50() + + default: + return fmt.Errorf("No test for version %v", beginString) + } + + if err != nil { + return err + } + + if queryConfirm("Send MarketDataRequest") { + return quickfix.Send(req) + } + + return nil +} diff --git a/tradeclient/tradeclient.go b/tradeclient/tradeclient.go index 0a02a0b..7b3be0d 100644 --- a/tradeclient/tradeclient.go +++ b/tradeclient/tradeclient.go @@ -7,33 +7,41 @@ import ( "os" ) +//TradeClient implements the quickfix.Application interface type TradeClient struct { } +//OnCreate implemented as part of Application interface func (e TradeClient) OnCreate(sessionID quickfix.SessionID) { return } +//OnLogon implemented as part of Application interface func (e TradeClient) OnLogon(sessionID quickfix.SessionID) { return } +//OnLogout implemented as part of Application interface func (e TradeClient) OnLogout(sessionID quickfix.SessionID) { return } +//FromAdmin implemented as part of Application interface func (e TradeClient) FromAdmin(msg quickfix.Message, sessionID quickfix.SessionID) (reject quickfix.MessageRejectError) { return } +//ToAdmin implemented as part of Application interface func (e TradeClient) ToAdmin(msg quickfix.Message, sessionID quickfix.SessionID) { return } +//ToApp implemented as part of Application interface func (e TradeClient) ToApp(msg quickfix.Message, sessionID quickfix.SessionID) (err error) { return } +//FromApp implemented as part of Application interface. This is the callback for all Application level messages from the counter party. func (e TradeClient) FromApp(msg quickfix.Message, sessionID quickfix.SessionID) (reject quickfix.MessageRejectError) { fmt.Printf("FromApp: %s\n", msg.String()) return @@ -75,6 +83,7 @@ func main() { initiator.Start() +Loop: for { action, err := queryAction() if err != nil { @@ -88,13 +97,19 @@ func main() { case "2": err = queryCancelOrder() + case "3": + err = queryMarketDataRequest() + + case "4": + //quit + break Loop + default: err = fmt.Errorf("unknown action: '%v'", action) } if err != nil { fmt.Printf("%v\n", err) - break } }