예제 #1
0
        /// <summary>
        /// obtain the raw data from SecurityMaster and initial cash from capital
        /// </summary>
        /// <param name="securityMaster">transfer security with name</param>
        /// <param name="capital">initial capital, here means the initial cash</param>
        /// <returns></returns>
        public static List <Order> Run(IStrategy Strategy, Dictionary <string, Security> securityMaster, double capital)
        {
            string             key      = securityMaster.First().Key;
            Security           security = securityMaster[key];
            List <PricingData> ps       = security.SecurityPricingData;
            double             Cash     = capital;

            // loop through the data read in
            for (int i = 1; i < ps.Count; i++)
            {
                // params for Strategy
                double   currentPrice = ps[i].ClosePrice;
                DateTime currentDate  = ps[i].Date;

                #region store info to AccountLevel
                // used to transfer data to Account Class and then show these infos to customer
                AccountLevelInfo currentAccountInfo = new AccountLevelInfo();
                currentAccountInfo.Date             = currentDate;
                currentAccountInfo.CurrentCash      = Cash;
                currentAccountInfo.CurrentPositions = GetCurrentPositions(/*currentPrice*/);
                accountInfos.Add(currentAccountInfo);
                #endregion store info to AccoutLevel

                #region Build DataContract
                StrategyDataContract dataContract = new StrategyDataContract();
                dataContract.CurrentCash = Cash;
                SecPosition secPosition = new SecPosition();
                secPosition.SecurityID   = key;
                secPosition.currentDate  = currentDate;
                secPosition.CurrentPrice = ps.Where(p => DateTime.Compare(p.Date, currentDate) <= 0)
                                           .Select(p => p.ClosePrice)
                                           .ToList();

                if (currentAccountInfo.CurrentPositions.Count > 0)
                {
                    secPosition.BuyPrice         = orders.Last().TransactionPrice;
                    secPosition.PositionQuantity = currentAccountInfo.CurrentPositions.First().Quantity;
                }

                //Fill the DataContract that will be sent to Allocation Engine
                dataContract.SecPositions.Add(secPosition);
                #endregion Build DataContract

                #region Run Strategy
                Dictionary <string, int> result = Strategy.ExecuteStrategy(dataContract);
                #endregion Run Strategy

                #region Create Order by the Quantity returned by the AllocationEngine
                int quantity = result.Count > 0 ? result.First().Value : 0;
                if (quantity > 0)
                {
                    Cash -= quantity * currentPrice;
                    orders.Add(new Order(security, quantity, currentPrice, currentDate, OrderType.BUY));
                    Console.WriteLine("Order Date " + currentDate.ToShortDateString() +
                                      " Price: " + currentPrice +
                                      " Quantity: " + quantity +
                                      " Type: " + "BUY");
                }
                else if (quantity < 0)
                {
                    Cash -= quantity * currentPrice;
                    orders.Add(new Order(security, quantity, currentPrice, currentDate, OrderType.SELL));
                    Console.WriteLine("Order Date " + currentDate.ToShortDateString() +
                                      " Price: " + currentPrice +
                                      " Quantity: " + quantity +
                                      " Type: " + "SELL");
                }
                #endregion Create Order by the Quantity returned by the AllocationEngine
            }
            return(orders);
        }
예제 #2
0
        public static List <Order> RunMulti(IStrategy Strategy, Dictionary <string, Security> securityMaster, double capital)
        {
            List <DateTime> Dates = securityMaster
                                    .Values.First()
                                    .SecurityPricingData.Select(p => p.Date)
                                    .ToList();
            double Cash = capital;

            foreach (DateTime date in Dates)
            {
                if (DateTime.Compare(date, Dates.First()) == 0)
                {
                    continue;
                }
                #region store info to AccountLevel
                // used to transfer data to Account Class and then show these infos to customer
                AccountLevelInfo currentAccountInfo = new AccountLevelInfo();
                currentAccountInfo.Date             = date;
                currentAccountInfo.CurrentCash      = Cash;
                currentAccountInfo.CurrentPositions = GetCurrentPositions();
                accountInfos.Add(currentAccountInfo);
                #endregion store info to AccountLevel

                #region Build DataContract
                StrategyDataContract dataContract = new StrategyDataContract();
                dataContract.CurrentCash = Cash;

                foreach (var sec in securityMaster)
                {
                    SecPosition secPosition = new SecPosition();
                    secPosition.SecurityID   = sec.Key;
                    secPosition.currentDate  = date;
                    secPosition.CurrentPrice = sec.Value.SecurityPricingData.Where(p => DateTime.Compare(p.Date, date) <= 0)
                                               .Select(p => p.ClosePrice)
                                               .ToList();

                    if (currentAccountInfo.CurrentPositions.Where(p => p.CurrentSecurity.SecurityID == sec.Key).Count() > 0)
                    {
                        if (orders.Where(p => p.CurrentSecurity.SecurityID == sec.Key).Count() > 0)
                        {
                            secPosition.BuyPrice = orders.Where(p => p.CurrentSecurity.SecurityID == sec.Key)
                                                   .Last().TransactionPrice;
                            secPosition.PositionQuantity = currentAccountInfo.CurrentPositions.Where(p => p.CurrentSecurity.SecurityID == sec.Key)
                                                           .Last().Quantity;
                        }
                    }

                    //Fill the DataContract that will be sent to Allocation Engine
                    dataContract.SecPositions.Add(secPosition);
                }
                #endregion Build DataContract

                #region Run Strategy
                Dictionary <string, int> result = Strategy.ExecuteStrategy(dataContract);
                #endregion Run Strategy

                #region Create Order by the Quantity returned by the AllocationEngine
                int quantity;
                foreach (var group in result.GroupBy(o => o.Key))
                {
                    double currentPrice = securityMaster[group.Key]
                                          .SecurityPricingData
                                          .Where(p => p.Date == date)
                                          .Select(p => p.ClosePrice).First();
                    quantity = group.Count() > 0 ? group.First().Value : 0;
                    if (quantity > 0)
                    {
                        Cash -= quantity * currentPrice;
                        orders.Add(new Order(securityMaster[group.Key], quantity, currentPrice, date, OrderType.BUY));
                        Console.WriteLine("Order Date " + date.ToShortDateString() +
                                          " SecurityID: " + group.Key +
                                          " Price: " + currentPrice +
                                          " Quantity: " + quantity +
                                          " Type: " + "BUY");
                    }
                    else if (quantity < 0)
                    {
                        Cash -= quantity * currentPrice;
                        orders.Add(new Order(securityMaster[group.Key], quantity, currentPrice, date, OrderType.SELL));
                        Console.WriteLine("Order Date " + date.ToShortDateString() +
                                          " SecurityID: " + group.Key +
                                          " Price: " + currentPrice +
                                          " Quantity: " + quantity +
                                          " Type: " + "SELL");
                    }
                }
                #endregion Create Order by the Quantity returned by the AllocationEngine
            }
            return(orders);
        }