Example #1
0
        public static FixMessage ParseMessage(string logEntry, Dictionary<string, FixTag> msgDic)
        {
            // 2012-04-06 10:58:30,601 [3] INFO  MTS.Live [(null)] - toAdmin(8=FIX.4.49=12935=A34=149=FOREXINVEST
            // 52=20120406-06:58:30.60156=CfhDemoPrices57=6877565098=0108=30141=Y553=FOREXINVEST554=FOREXINVEST
            // 10=123, FIX.4.4:FOREXINVEST->CfhDemoPrices:CHFDN)
            var match = regTime.Match(logEntry);
            if (!match.Success) return null;
            var timeStr = match.Value;
            DateTime time;
            try
            {
                time = DateTime.ParseExact(timeStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
            }
            catch (Exception)
            {
                return null;
            }

            const string fixPreffix = "(8=FIX";
            var start = logEntry.IndexOf(fixPreffix);
            if (start < 0) return null;

            // получить поле Direction
            var sbDir = new StringBuilder();
            for (var i = start - 1; i > 0; i--)
            {
                if (logEntry[i] == ' ') break;
                sbDir.Insert(0, logEntry[i]);
            }

            // создать объект сообщения
            var msg = new FixMessage {Time = time, Direction = sbDir.ToString()};

            // получить тип
            var typeString = GetMessageFromString(logEntry, start, msgDic, "35=", true);
            if (string.IsNullOrEmpty(typeString)) return null;
            msg.Type = typeString;

            // результат исполнения ордера
            msg.Result = GetMessageFromString(logEntry, start, msgDic, "39=", false);
            if (msg.Result == "2" && msg.Type.Contains("Execution Report"))
            {
                // показать проданный/купленный объем и инструмент
                var smb = GetMessageFromString(logEntry, start, msgDic, "55=", false);
                var sideStr = GetMessageFromString(logEntry, start, msgDic, "54=", false);
                var volumeStr = GetMessageFromString(logEntry, start, msgDic, "38=", false);
                var side = sideStr == "1" ? "BUY" : sideStr == "2" ? "SELL" : sideStr;
                if (!string.IsNullOrEmpty(side) && !string.IsNullOrEmpty(smb) && !string.IsNullOrEmpty(volumeStr))
                {
                    msg.Result = string.Format("{0} {1} {2}: OK", side, volumeStr, smb);
                    msg.ResultSymbol = smb;
                    int volm;
                    int.TryParse(volumeStr, out volm);
                    var sign = sideStr == "1" ? 1 : sideStr == "2" ? -1 : 0;
                    msg.ResultVolume = volm * sign;
                }
            }

            // строка сообщения
            start++;
            const string msgEnd = ", FIX.";
            var end = logEntry.IndexOf(msgEnd, start);
            if (end > 0)
                msg.sourceMessage = logEntry.Substring(start, end - start - 1);

            return msg;
        }
Example #2
0
        public static FixMessage ParseMessage(string logEntry, Dictionary <string, FixTag> msgDic)
        {
            // 2012-04-06 10:58:30,601 [3] INFO  MTS.Live [(null)] - toAdmin(8=FIX.4.49=12935=A34=149=FOREXINVEST
            // 52=20120406-06:58:30.60156=CfhDemoPrices57=6877565098=0108=30141=Y553=FOREXINVEST554=FOREXINVEST
            // 10=123, FIX.4.4:FOREXINVEST->CfhDemoPrices:CHFDN)
            var match = regTime.Match(logEntry);

            if (!match.Success)
            {
                return(null);
            }
            var      timeStr = match.Value;
            DateTime time;

            try
            {
                time = DateTime.ParseExact(timeStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
            }
            catch (Exception)
            {
                return(null);
            }

            const string fixPreffix = "(8=FIX";
            var          start      = logEntry.IndexOf(fixPreffix);

            if (start < 0)
            {
                return(null);
            }

            // получить поле Direction
            var sbDir = new StringBuilder();

            for (var i = start - 1; i > 0; i--)
            {
                if (logEntry[i] == ' ')
                {
                    break;
                }
                sbDir.Insert(0, logEntry[i]);
            }

            // создать объект сообщения
            var msg = new FixMessage {
                Time = time, Direction = sbDir.ToString()
            };

            // получить тип
            var typeString = GetMessageFromString(logEntry, start, msgDic, "35=", true);

            if (string.IsNullOrEmpty(typeString))
            {
                return(null);
            }
            msg.Type = typeString;

            // результат исполнения ордера
            msg.Result = GetMessageFromString(logEntry, start, msgDic, "39=", false);
            if (msg.Result == "2" && msg.Type.Contains("Execution Report"))
            {
                // показать проданный/купленный объем и инструмент
                var smb       = GetMessageFromString(logEntry, start, msgDic, "55=", false);
                var sideStr   = GetMessageFromString(logEntry, start, msgDic, "54=", false);
                var volumeStr = GetMessageFromString(logEntry, start, msgDic, "38=", false);
                var side      = sideStr == "1" ? "BUY" : sideStr == "2" ? "SELL" : sideStr;
                if (!string.IsNullOrEmpty(side) && !string.IsNullOrEmpty(smb) && !string.IsNullOrEmpty(volumeStr))
                {
                    msg.Result       = string.Format("{0} {1} {2}: OK", side, volumeStr, smb);
                    msg.ResultSymbol = smb;
                    int volm;
                    int.TryParse(volumeStr, out volm);
                    var sign = sideStr == "1" ? 1 : sideStr == "2" ? -1 : 0;
                    msg.ResultVolume = volm * sign;
                }
            }


            // строка сообщения
            start++;
            const string msgEnd = ", FIX.";
            var          end    = logEntry.IndexOf(msgEnd, start);

            if (end > 0)
            {
                msg.sourceMessage = logEntry.Substring(start, end - start - 1);
            }

            return(msg);
        }