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; }
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); }