示例#1
0
        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;

        }