public IList<Trade> Import(Market market, Feed feed, StringBuilder sb, FilterData filterData) { var trades = new List<Trade>(); var infos = filterData.Data ?? TradeImportHelper.ReadData(FilterInfo, filterData, sb); var dict = new Dictionary<TradeInfo, Trade>(); var symbols = new Dictionary<string, Product>(); if (filterData.Progress != null) filterData.Progress.AnalysisInit(infos.Count, "Building Products"); int count = 0; foreach (var info in infos) { count++; if (filterData.Progress != null) filterData.Progress.AnalysisProgress(count, ""); if (filterData.Progress != null && filterData.Progress.IsCanceled) return new List<Trade>(); if (FilterInfo(info)) continue; var trade = new Trade(); if (!TradeImportHelper.InitTrade(trade, info, filterData, sb)) continue; dict[info] = trade; var symbol = info.Symbol; // symbol is cusip/isin/sedol if (symbol != null) symbol = symbol.Trim(); if (!string.IsNullOrEmpty(symbol)) { var p = Env.Current.Trade.GetProductByCode(Product.CusipProductCode, symbol) ?? Env.Current.Trade.GetProductByCode(Product.IsinProductCode, symbol) ?? Env.Current.Trade.GetProductByCode(Product.SedolProductCode, symbol); if (p == null) { if (symbols.Count < MaxEqs) { symbols[symbol] = null; } else dict[info] = null; //Remove it } else info.Security = p; } else sb.Append(TradeImportHelper.FormatErrorMessage("Symbol is null", info.HoldingID, info.TradeID, info.Instrument)); } if (filterData.Progress != null && filterData.Progress.IsCanceled) return new List<Trade>(); if (filterData.Progress != null) filterData.Progress.AnalysisDone(); // snapping equities by cusip, isin or sedol var snapped = new List<Product>(); var exceptions = new List<Exception>(); if (symbols.Count > 0 && feed != null) { var prodcs = new List<Product>(); foreach (var s in symbols.Keys) { var eq = new Equity(); eq.SetProperty(Product.DefaultTicker, s); prodcs.Add(eq); } sb.Append("Snapping Equities By Symbol " + symbols.Count + " " + Utilities.ToString(new List<string>(symbols.Keys)) + "\n"); try { FeedImportSecurityTaskExecutor.SnapProducts("Equity.FeedMapping.xml", prodcs, feed, exceptions, true, snapped); // might need other equity type snapping } catch (Exception x) { sb.Append(x.ToString()); } } foreach (var p in snapped) { var isin = p.Isin; var cusip = p.Cusip; var sedol = p.Sedol; if (p.Id > 0) { if (symbols.ContainsKey(cusip)) symbols[cusip] = p; else if (symbols.ContainsKey(isin)) symbols[isin] = p; else if (symbols.ContainsKey(sedol)) symbols[sedol] = p; } } if (snapped.Count > 0) sb.Append("Snapped " + snapped.Count + " equities by Symbol\n"); var tempEquityProvider = new EquityTemplateProvider(); if (filterData.Progress != null) filterData.Progress.AnalysisInit(dict.Count, "Initializing Trades"); count = 0; foreach (var kvp in dict) { if (filterData.Progress != null && filterData.Progress.IsCanceled) return new List<Trade>(); count++; if (filterData.Progress != null) filterData.Progress.AnalysisProgress(count, ""); var info = kvp.Key; var trade = kvp.Value; if (trade == null) continue; if (info.Security == null) { if (!string.IsNullOrEmpty(info.Symbol) && symbols.ContainsKey(info.Symbol)) info.Security = symbols[info.Symbol]; } if (info.Security != null) { if (info.Security.Currency == null) { sb.Append(TradeImportHelper.FormatErrorMessage("Bad Security currency is NULL", info.HoldingID, info.TradeID, info.Instrument)); continue; } if (filterData.Currencies != null && filterData.Currencies.Count > 0 && !filterData.Currencies.Contains(info.Security.Currency)) { continue; } var equity = info.Security as Equity; if (CreateEquity(trade, info, market, sb, tempEquityProvider)) { trades.Add(trade); } } else sb.Append(TradeImportHelper.FormatErrorMessage("Security not found", info.HoldingID, info.TradeID, info.Symbol)); } if (exceptions.Count > 0) { sb.Append("Exceptions snapping equities:\n"); foreach (var ex in exceptions) sb.Append(ex.Message + " " + ex + "\n"); } if (filterData.Progress != null) filterData.Progress.AnalysisDone(); sb.Append("Imported " + trades.Count + " Equities\n"); return trades; }