/** * This object is used in both the browser and server side code. */ exports.newOrderMessage = function newOrderMessage() { const MESSAGE_ENTITY = { SimulationExecutor: 'EX', TradingCokpit: 'CO', SimulationEngine: 'EN', TradingAssistant: 'AS' } const MESSAGE_TYPE = { HeartBeat: 'HBT', OrderAuthorizationRequest: 'REQ', OrderAuthorizationResponse: 'RES', Order: 'ORD', OrderUpdate: 'UPD', OrderClose: 'CLO' } const ORDER_CREATOR = { SimulationEngine: 'S', HumanTrader: 'H' } const ORDER_TYPE = { Market: 'M', Limit: 'L', Stop: 'S', } const ORDER_OWNER = { Node: 'N', Team: 'T', User: 'U', } const ORDER_DIRECTION = { Sell: 'Sell', Buy: 'Buy' } const ORDER_STATUS = { Signaled: 'SIG', ManualAuthorized: 'MAU', ManualNotAuthorized: 'MNA', AutoAuthorized: 'AAU', AutoNotAuthorized: 'ANA', Executing: 'EXE', Cancelled: 'CAN', Filled: 'FIL', PartiallyFilled: 'PRT', Discarded: 'DIS', Placed: 'PLA', Rejected:'REJ', Undeliverable:'UND' } const ORDER_EXIT_OUTCOME = { StopLoss: 'SL', TakeProfit: 'TP' } const ORDER_MARGIN_ENABLED = { True: 1, False: 0 } let thisObject = { MESSAGE_ENTITY: MESSAGE_ENTITY, MESSAGE_TYPE: MESSAGE_TYPE, ORDER_CREATOR: ORDER_CREATOR, ORDER_TYPE: ORDER_TYPE, ORDER_OWNER: ORDER_OWNER, ORDER_DIRECTION: ORDER_DIRECTION, ORDER_STATUS: ORDER_STATUS, ORDER_EXIT_OUTCOME: ORDER_EXIT_OUTCOME, ORDER_MARGIN_ENABLED: ORDER_MARGIN_ENABLED, createMessage: createMessage, getMessage: getMessage, getExpandedMessage: getExpandedMessage, createMessageFromObject: createMessageFromObject } return thisObject function createMessage(messageId, from, to, messageType, messageDateTime, orderId, creator, orderDateTime, owner, exchange, market, marginEnabled, type, rate, stop, takeProfit, direction, size, status, sizeFilled, exitOutcome, statusDetails) { return [ messageId, from, to, messageType, messageDateTime, [ orderId, creator, orderDateTime, owner, exchange, market, marginEnabled, type, rate, stop, takeProfit, direction, size, status, sizeFilled, exitOutcome, statusDetails ] ] } function createMessageFromObject(object) { return createMessage(object.id, object.from, object.to, object.messageType, object.dateTime, object.order.id, object.order.creator, object.order.dateTime, object.order.owner, object.order.exchange, object.order.market, object.order.marginEnabled, object.order.type, object.order.rate, object.order.stop, object.order.takeProfit, object.order.direction, object.order.size, object.order.status, object.order.sizeFilled, object.order.exitOutcome, object.order.statusDetails) } function getMessage(fileContent) { let parsedFileContent = JSON.parse(JSON.stringify(fileContent)) return { id: parsedFileContent[0], from: parsedFileContent[1], to: parsedFileContent[2], messageType: parsedFileContent[3], dateTime: parsedFileContent[4], order: { id: parsedFileContent[5][0], creator: parsedFileContent[5][1], dateTime: parsedFileContent[5][2], owner: parsedFileContent[5][3], exchange: parsedFileContent[5][4], market: parsedFileContent[5][5], marginEnabled: parsedFileContent[5][6], type: parsedFileContent[5][7], rate: parsedFileContent[5][8], stop: parsedFileContent[5][9], takeProfit: parsedFileContent[5][10], direction: parsedFileContent[5][11], size: parsedFileContent[5][12], status: parsedFileContent[5][13], sizeFilled: parsedFileContent[5][14], exitOutcome: parsedFileContent[5][15], statusDetails: parsedFileContent[5][16], } } } function getExpandedMessage(fileContent) { let parsedFileContent = JSON.parse(fileContent) return { id: parsedFileContent[0], from: getKeyByValue(MESSAGE_ENTITY, parsedFileContent[1]), to: getKeyByValue(MESSAGE_ENTITY, parsedFileContent[2]), messageType: getKeyByValue(MESSAGE_TYPE, parsedFileContent[3]), dateTime: parsedFileContent[4], order: { id: parsedFileContent[5][0], creator: getKeyByValue(ORDER_CREATOR, parsedFileContent[5][1]), dateTime: parsedFileContent[5][2], owner: getKeyByValue(ORDER_OWNER, parsedFileContent[5][3]), exchange: parsedFileContent[5][4], market: parsedFileContent[5][5], marginEnabled: getKeyByValue(ORDER_MARGIN_ENABLED, parsedFileContent[5][6]), type: getKeyByValue(ORDER_TYPE, parsedFileContent[5][7]), rate: parsedFileContent[5][8], stop: parsedFileContent[5][9], takeProfit: parsedFileContent[5][10], direction: getKeyByValue(ORDER_DIRECTION, parsedFileContent[5][11]), size: parsedFileContent[5][12], status: getKeyByValue(ORDER_STATUS, parsedFileContent[5][13]), sizeFilled: parsedFileContent[5][14], exitOutcome: getKeyByValue(ORDER_EXIT_OUTCOME, parsedFileContent[5][15]), statusDetails: parsedFileContent[5][16] } } } function getKeyByValue(object, value) { let retrievedValue = Object.keys(object).find(key => object[key] === value) if (retrievedValue !== undefined) { retrievedValue = retrievedValue.replace(/([A-Z])/g, ' $1').trim() } else { throw new Error("The property is not valid: " + value + ". Available values: " + JSON.stringify(Object.values(object))) } return retrievedValue } }