// importPrice->priceData private static void AddImportPrice(databases.importDS.importPriceDataTable importPriceTbl, DailyData dailyPrice, databases.baseDS.priceDataDataTable priceDataTbl) { databases.baseDS.priceDataSumRow dailyPriceRow; databases.baseDS.priceDataRow priceDataRow; decimal volume = 0; for (int idx = 0; idx < importPriceTbl.Count; idx++) { //Invalid price, ignore if (importPriceTbl[idx].closePrice <= 0) { continue; } volume = importPriceTbl[idx].volume; // If this is total volume then minus the last volume to get the real volume in the period if (importPriceTbl[idx].isTotalVolume) { dailyPriceRow = dailyPrice.GetData(importPriceTbl[idx]); if (dailyPriceRow != null) { volume -= dailyPriceRow.volume; } if (volume <= 0) { continue; } } priceDataRow = priceDataTbl.NewpriceDataRow(); databases.AppLibs.InitData(priceDataRow); priceDataRow.onDate = importPriceTbl[idx].onDate; priceDataRow.stockCode = importPriceTbl[idx].stockCode; priceDataRow.closePrice = importPriceTbl[idx].closePrice; priceDataRow.openPrice = importPriceTbl[idx].closePrice; priceDataRow.highPrice = importPriceTbl[idx].closePrice; priceDataRow.lowPrice = importPriceTbl[idx].closePrice; priceDataRow.volume = volume; //Fix other invalid price if (priceDataRow.highPrice <= 0) { priceDataRow.highPrice = priceDataRow.closePrice; } if (priceDataRow.lowPrice <= 0) { priceDataRow.highPrice = priceDataRow.lowPrice; } if (priceDataRow.openPrice <= 0) { priceDataRow.highPrice = priceDataRow.openPrice; } priceDataTbl.AddpriceDataRow(priceDataRow); //Update the last row dailyPrice.UpdateData(importPriceTbl[idx]); } }
//Testing public void Add2Top(databases.baseDS.priceDataDataTable tbl) { for (int idx = tbl.Count - 1; idx >= 0; idx--) { databases.baseDS.priceDataRow newRow = priceDataTbl.NewpriceDataRow(); newRow.ItemArray = tbl[idx].ItemArray; priceDataTbl.Rows.InsertAt(newRow, 0); } //Update OHLCV data series double[] tmpData; if (this.DateTime.Values != null) { tmpData = DataLibs.GetDataList(tbl, 0, AppTypes.PriceDataType.DateTime); this.DateTime.Add2Top(tmpData); } if (this.High.Values != null) { tmpData = DataLibs.GetDataList(tbl, 0, AppTypes.PriceDataType.High); this.High.Add2Top(tmpData); } if (this.Low.Values != null) { tmpData = DataLibs.GetDataList(tbl, 0, AppTypes.PriceDataType.Low); this.Low.Add2Top(tmpData); } if (this.Open.Values != null) { tmpData = DataLibs.GetDataList(tbl, 0, AppTypes.PriceDataType.Open); this.Open.Add2Top(tmpData); } if (this.Close.Values != null) { tmpData = DataLibs.GetDataList(tbl, 0, AppTypes.PriceDataType.Close); this.Close.Add2Top(tmpData); } if (this.Volume.Values != null) { tmpData = DataLibs.GetDataList(tbl, 0, AppTypes.PriceDataType.Volume); this.Volume.Add2Top(tmpData); } //Remove cached "Bars: dataCache.Remove("Bars"); }
//Use the idea from http://www.codeproject.com/KB/database/CsvReader.aspx by Sebastien Lorion public static bool CSV_ImportParse(string csvFileName, char delimiter, common.dateTimeLibs.DateTimeFormats dateDataFormat, string marketCode, CultureInfo dataCulture, databases.baseDS.priceDataDataTable priceDataTbl, ImportRowHandler ImportRowFunc, OnUpdatePriceData onUpdateDataFunc, OnEndImportPriceData onEndImportFunc) { importStat myImportStat = new importStat(); myImportStat.Reset(); myImportStat.dateDataFormat = dateDataFormat; myImportStat.srcCulture = dataCulture; databases.baseDS.stockCodeDataTable stockCodeTbl = new databases.baseDS.stockCodeDataTable(); databases.baseDS.priceDataRow priceDataRow; DataRowView[] foundRows; databases.DbAccess.LoadData(stockCodeTbl, AppTypes.CommonStatus.Enable); DataView stockCodeView = new DataView(stockCodeTbl); stockCodeView.Sort = stockCodeTbl.codeColumn.ColumnName; bool fCanceled = false; DateTime lastPriceDate = common.Consts.constNullDate; importOHLCV data; // open the file "data.csv" which is a CSV file with headers using (CsvReader csv = new CsvReader(new StreamReader(csvFileName), true, delimiter)) { // missing fields will not throw an exception, // but will instead be treated as if there was a null value csv.MissingFieldAction = MissingFieldAction.ReplaceByNull; int fieldCount = csv.FieldCount; if (fieldCount < 7) { return(false); } while (csv.ReadNextRecord()) { Application.DoEvents(); myImportStat.dataCount++; data = ImportRowFunc(csv, myImportStat); if (myImportStat.cancel) { fCanceled = true; break; } if (data == null) { myImportStat.errorCount++; continue; } //Assume that all price must be valid if (data.Open <= 0 || data.High <= 0 || data.Low <= 0 || data.Close <= 0) { continue; } foundRows = stockCodeView.FindRows(data.code); if (foundRows.Length == 0) { //Try to add new stock code Libs.AddNewCode(data.code, marketCode, stockCodeTbl); databases.DbAccess.UpdateData(stockCodeTbl); } // Ignore all data that was in database //if (!foundLastPriceDate) //{ // lastPriceDate = FindLastPriceDate(data.code); // foundLastPriceDate = true; //} if (lastPriceDate != common.Consts.constNullDate && data.dateTime <= lastPriceDate) { continue; } if (priceDataTbl.FindBystockCodeonDate(data.code, data.dateTime) != null) { myImportStat.errorCount++; continue; } myImportStat.updateCount++; priceDataRow = priceDataTbl.NewpriceDataRow(); databases.AppLibs.InitData(priceDataRow); priceDataRow.stockCode = data.code; priceDataRow.onDate = data.dateTime; //Try to fix some error in data priceDataRow.openPrice = (decimal)data.Open; priceDataRow.highPrice = (decimal)data.High; priceDataRow.lowPrice = (decimal)data.Low; priceDataRow.closePrice = (decimal)data.Close; priceDataRow.volume = (decimal)data.Volume; priceDataTbl.AddpriceDataRow(priceDataRow); if (onUpdateDataFunc != null) { onUpdateDataFunc(priceDataRow, myImportStat); } } } if (fCanceled) { priceDataTbl.Clear(); return(false); } if (onEndImportFunc != null) { onEndImportFunc(priceDataTbl); } return(true); }