예제 #1
0
        // 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]);
            }
        }
예제 #2
0
        //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");
        }
예제 #3
0
        //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);
        }