UNPKG

fixparser

Version:

FIX.Latest / 5.0 SP2 Parser / AI Agent Trading

123 lines (112 loc) 4.9 kB
import { EncryptMethod, FIXParser, Field, Fields, // HandlInst, LicenseManager, MDEntryType, MDUpdateType, type Message, Messages, // OrdType, ResetSeqNumFlag, // Side, SubscriptionRequestType, // TimeInForce, } from 'fixparser'; const initializeConnection = async () => { const fixParser = new FIXParser({ logging: false }); const SENDER = process.env.FIXPARSER_SENDER; const TARGET = process.env.FIXPARSER_TARGET; // NOTE: This feature requires a FIXParser Pro license await LicenseManager.setLicenseKey(process.env.FIXPARSER_LICENSE_KEY); fixParser.connect({ host: '10.0.200.48', //process.env.FIXGW_SERVER, port: 5002, protocol: 'tcp', sender: SENDER, target: TARGET, fixVersion: 'FIX.4.4', onOpen: () => { console.log('Open'); sendLogon(); setTimeout(() => { sendMarketDataRequest(); }, 500); // setInterval(() => { // sendOrder(); // }, 10000); }, onMessage: (message: Message) => { const msgType = message.getField(Fields.MsgType); const symbol = message.getField(Fields.Symbol); if (msgType?.value === Messages.MarketDataIncrementalRefresh) { const price = message.getField(Fields.MDEntryPx); console.log(`${symbol?.value}: ${price?.value}`); } }, onClose: () => console.log('Disconnected'), }); const sendLogon = () => { const logon = fixParser.createMessage( new Field(Fields.MsgType, Messages.Logon), new Field(Fields.MsgSeqNum, fixParser.getNextTargetMsgSeqNum()), new Field(Fields.SenderCompID, SENDER), new Field(Fields.SendingTime, fixParser.getTimestamp()), new Field(Fields.TargetCompID, TARGET), new Field(Fields.ResetSeqNumFlag, ResetSeqNumFlag.Yes), new Field(Fields.EncryptMethod, EncryptMethod.None), new Field(Fields.HeartBtInt, 10), ); const messages = fixParser.parse(logon.encode()); console.log('sending message', messages[0].description, messages[0].messageString); fixParser.send(logon); }; const sendMarketDataRequest = () => { const mdr = fixParser.createMessage( new Field(Fields.MsgType, Messages.MarketDataRequest), new Field(Fields.SenderCompID, SENDER), new Field(Fields.MsgSeqNum, fixParser.getNextTargetMsgSeqNum()), new Field(Fields.TargetCompID, TARGET), new Field(Fields.SendingTime, fixParser.getTimestamp()), new Field(Fields.MDReqID, 'MDR001'), new Field(Fields.SubscriptionRequestType, SubscriptionRequestType.SnapshotAndUpdates), new Field(Fields.MarketDepth, 0), new Field(Fields.MDUpdateType, MDUpdateType.FullRefresh), new Field(Fields.NoRelatedSym, 5), new Field(Fields.Symbol, 'AAPL'), new Field(Fields.Symbol, 'MSFT'), new Field(Fields.Symbol, 'GOOGL'), new Field(Fields.Symbol, 'TSLA'), new Field(Fields.Symbol, 'AMZN'), new Field(Fields.NoMDEntryTypes, 2), new Field(Fields.MDEntryType, MDEntryType.Bid), new Field(Fields.MDEntryType, MDEntryType.Offer), ); const messages = fixParser.parse(mdr.encode()); console.log('sending message', messages[0].description, messages[0].messageString.replace(/\x01/g, '|')); fixParser.send(mdr); }; // const sendOrder = () => { // const order = fixParser.createMessage( // new Field(Fields.MsgType, Messages.NewOrderSingle), // new Field(Fields.MsgSeqNum, fixParser.getNextTargetMsgSeqNum()), // new Field(Fields.SenderCompID, SENDER), // new Field(Fields.SendingTime, fixParser.getTimestamp()), // new Field(Fields.TargetCompID, TARGET), // new Field(Fields.ClOrdID, '11223344'), // new Field(Fields.HandlInst, HandlInst.AutomatedExecutionNoIntervention), // new Field(Fields.OrderQty, '123'), // new Field(Fields.TransactTime, fixParser.getTimestamp()), // new Field(Fields.OrdType, OrdType.Market), // new Field(Fields.Side, Side.Buy), // new Field(Fields.Symbol, '700.HK'), // new Field(Fields.TimeInForce, TimeInForce.Day), // ); // const messages = fixParser.parse(order.encode()); // console.log('sending message', messages[0].description, messages[0].messageString.replace(/\x01/g, '|')); // fixParser.send(order); // }; }; initializeConnection().catch((err) => console.error('Error initializing connection:', err));