private void GetStockList()
        {
            TradeDays myTradeDays = new TradeDays(20130601, 20160626);

            int[] changeDate = new int[7] {
                20130628, 20131213, 20140613, 20141212, 20150612, 20151211, 20160608
            };
            w.start();
            foreach (int date in changeDate)
            {
                int           today        = date;
                int           tomorrow     = TradeDays.GetNextTradeDay(date);
                string        todayStr     = DateTime.ParseExact(today.ToString(), "yyyyMMdd", null).ToString("yyyy-MM-dd");
                string        tomorrowStr  = DateTime.ParseExact(tomorrow.ToString(), "yyyyMMdd", null).ToString("yyyy-MM-dd");
                List <string> todayList    = new List <string>();
                List <string> tomorrowList = new List <string>();
                List <string> stockIn      = new List <string>();
                List <string> stockOut     = new List <string>();
                WindData      wd           = w.wset("sectorconstituent", "date=" + todayStr + ";windcode=" + indexName);
                object[]      stockList    = wd.data as object[];
                int           num          = stockList.Length / 3;
                for (int i = 0; i < num; i++)
                {
                    todayList.Add(Convert.ToString(stockList[i * 3 + 1]));
                }
                wd        = w.wset("sectorconstituent", "date=" + tomorrowStr + ";windcode=" + indexName);
                stockList = wd.data as object[];
                num       = stockList.Length / 3;
                for (int i = 0; i < num; i++)
                {
                    tomorrowList.Add(Convert.ToString(stockList[i * 3 + 1]));
                }
                foreach (string code in tomorrowList)
                {
                    if (todayList.Contains(code) == false)
                    {
                        stockIn.Add(code);
                    }
                }
                foreach (string code in todayList)
                {
                    if (tomorrowList.Contains(code) == false)
                    {
                        stockOut.Add(code);
                    }
                }
                stockModifyList myList = new stockModifyList(today, stockIn, stockOut);
                changeList.Add(today, myList);
            }
        }
 private void computePosition(int startDate, int endDate)
 {
     foreach (var item in changeList)
     {
         if (item.Key < startDate || item.Key > endDate)
         {
             continue;
         }
         SortedDictionary <string, List <stockChangeFormat> > stockChangeList = new SortedDictionary <string, List <stockChangeFormat> >();
         SortedDictionary <string, SortedDictionary <int, stockDataFormat[]> > stockDataList = new SortedDictionary <string, SortedDictionary <int, stockDataFormat[]> >();
         int                  date      = item.Key;
         stockModifyList      list      = item.Value;
         List <stockPosition> stockList = new List <stockPosition>();
         int                  firstDate = Math.Max(TradeDays.GetNTradeDaysBefore(date, 15), startDate);
         int                  lastDate  = Math.Min(TradeDays.GetNTradeDaysLater(date, 15), endDate);
         TradeDays            myDays    = new TradeDays(firstDate, lastDate);
         foreach (string stockIn in list.stockIn)
         {
             stockPosition stock = new stockPosition();
             stock.code     = stockIn;
             stock.position = 1;
             stockList.Add(stock);
         }
         foreach (string stockOut in list.stockOut)
         {
             stockPosition stock = new stockPosition();
             stock.code     = stockOut;
             stock.position = -1;
             stockList.Add(stock);
         }
         foreach (stockPosition stock in stockList)
         {
             GetStockBonus bonus = new GetStockBonus(stock.code, firstDate, lastDate);
             GetStockData  data  = new GetStockData(stock.code, firstDate, lastDate);
             stockDataList.Add(stock.code, data.stockData);
             stockChangeList.Add(stock.code, bonus.stockChangeList);
         }
         //先确定权重
         Dictionary <string, double> weight = new Dictionary <string, double>();
         foreach (int today in myDays.myTradeDays)
         {
             List <stockPosition> stockListToday = new List <stockPosition>();
             foreach (stockPosition stock in stockList)
             {
                 List <stockChangeFormat> myChange = stockChangeList[stock.code];
                 double position = stock.position;
                 double cash     = stock.cash;
                 for (int i = 0; i < myChange.Count; i++)
                 {
                     if (myChange[i].date <= today && myChange[i].date > firstDate)
                     {
                         cash     += position * myChange[i].bonus;
                         position *= myChange[i].divisor;
                     }
                 }
                 stockListToday.Add(new stockPosition(stock.code, today, position, cash));
             }
             positionList.Add(today, stockListToday);
             //计算净值曲线
             double[] todayNetValue = new double[14402];//一天分成14402秒
             //先计算权重
             if (today == firstDate)
             {
                 double stockInNum  = 0;
                 double stockOutNum = 0;
                 Dictionary <string, double> stockOpen = new Dictionary <string, double>();
                 foreach (stockPosition myStock in stockListToday)
                 {
                     if (stockDataList.ContainsKey(myStock.code) && stockDataList[myStock.code].ContainsKey(today))
                     {
                         double[] data = dataModify(stockDataList[myStock.code][today]);
                         stockOpen.Add(myStock.code, data[0]);
                     }
                     else
                     {
                         stockOpen.Add(myStock.code, 0);
                     }
                 }
                 foreach (stockPosition myStock in stockListToday)
                 {
                     if (myStock.position > 0 && stockOpen[myStock.code] > 0)
                     {
                         stockInNum += 1;
                     }
                     if (myStock.position < 0 && stockOpen[myStock.code] > 0)
                     {
                         stockOutNum += 1;
                     }
                 }
                 foreach (stockPosition myStock in stockListToday)
                 {
                     if (myStock.position > 0 && stockOpen[myStock.code] > 0)
                     {
                         weight.Add(myStock.code, 1.0 / stockInNum / stockOpen[myStock.code]);
                     }
                     if (myStock.position < 0 && stockOpen[myStock.code] > 0)
                     {
                         weight.Add(myStock.code, 1.0 / stockOutNum / stockOpen[myStock.code]);
                     }
                 }
             }
             foreach (stockPosition myStock in stockListToday)
             {
                 if (weight.ContainsKey(myStock.code) == false)
                 {
                     continue;
                 }
                 stockDataFormat[] myStockData = (stockDataList.ContainsKey(myStock.code) && stockDataList[myStock.code].ContainsKey(today))? stockDataList[myStock.code][today]:new stockDataFormat[14402];
                 double[]          data        = dataModify(myStockData);
                 for (int i = 0; i < 14402; i++)
                 {
                     todayNetValue[i] += (myStock.position * data[i] + myStock.cash) * weight[myStock.code];
                 }
             }
             netValue.Add(today, todayNetValue);
         }
     }
 }