// Return common.extSortedList that store the mapping [Column in web page] -> [importPrice column] private static common.extSortedList CreateMapping(importPriceMeta meta, data.importDS.importPriceDataTable dataTbl) { common.extSortedList list = new common.extSortedList(); //list.Add(meta.sellPrice1ColId.ToString(), dataTbl.sellPrice1Column.ColumnName); //list.Add(meta.sellPrice2ColId.ToString(), dataTbl.sellPrice2Column.ColumnName); //list.Add(meta.sellPrice3ColId.ToString(), dataTbl.sellPrice3Column.ColumnName); //list.Add(meta.sellVolume1ColId.ToString(), dataTbl.sellVolume1Column.ColumnName); //list.Add(meta.sellVolume2ColId.ToString(), dataTbl.sellVolume2Column.ColumnName); //list.Add(meta.sellVolume3ColId.ToString(), dataTbl.sellVolume3Column.ColumnName); //list.Add(meta.buyPrice1ColId.ToString(), dataTbl.buyPrice1Column.ColumnName); //list.Add(meta.buyPrice2ColId.ToString(), dataTbl.buyPrice2Column.ColumnName); //list.Add(meta.buyPrice3ColId.ToString(), dataTbl.buyPrice3Column.ColumnName); //list.Add(meta.buyVolume1ColId.ToString(), dataTbl.buyVolume1Column.ColumnName); //list.Add(meta.buyVolume2ColId.ToString(), dataTbl.buyVolume2Column.ColumnName); //list.Add(meta.buyVolume3ColId.ToString(), dataTbl.buyVolume3Column.ColumnName); list.Add(meta.openPriceColId.ToString(), dataTbl.openPriceColumn.ColumnName); list.Add(meta.highPriceColId.ToString(), dataTbl.highPriceColumn.ColumnName); list.Add(meta.lowPriceColId.ToString(), dataTbl.lowPriceColumn.ColumnName); list.Add(meta.closePriceColId.ToString(), dataTbl.closePriceColumn.ColumnName); list.Add(meta.volumeColId.ToString(), dataTbl.volumeColumn.ColumnName); return(list); }
// importPrice->priceData private static void AddImportPrice(data.importDS.importPriceDataTable importPriceTbl, DailyPrice dailyPrice, data.baseDS.priceDataDataTable priceDataTbl) { data.baseDS.priceDataSumRow dailyPriceRow; data.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 totail 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(); commonClass.AppLibs.InitData(priceDataRow); priceDataRow.onDate = importPriceTbl[idx].onDate; priceDataRow.stockCode = importPriceTbl[idx].stockCode; priceDataRow.openPrice = importPriceTbl[idx].openPrice; priceDataRow.lowPrice = importPriceTbl[idx].lowPrice; priceDataRow.highPrice = importPriceTbl[idx].highPrice; priceDataRow.closePrice = 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]); } }
public static void ImportPrice_URL(DateTime updateTime, string url, string stockExchangeCode) { data.importDS.importPriceDataTable importPriceTbl = GetPriceFromURL(updateTime, url, stockExchangeCode); libs.AddNewCode(importPriceTbl, null); application.DbAccess.UpdateData(importPriceTbl); data.baseDS.priceDataDataTable priceTbl = new data.baseDS.priceDataDataTable(); libs.AddImportPrice(importPriceTbl, priceTbl); application.DbAccess.UpdateData(priceTbl); // In VN culture : start of week is Monday (not Sunday) libs.AggregatePriceData(priceTbl, libs.CultureInfoVN, null); }
public static void ImportPrice_URL(DateTime updateTime, string url, string marketCode) { data.importDS.importPriceDataTable importPriceTbl = GetPrice(updateTime, url, marketCode); libs.AddNewCode(importPriceTbl, null); application.DbAccess.UpdateData(importPriceTbl); data.baseDS.priceDataDataTable priceTbl = new data.baseDS.priceDataDataTable(); libs.AddImportPrice(importPriceTbl, priceTbl); application.DbAccess.UpdateData(priceTbl); // Gold use US culture libs.AggregatePriceData(priceTbl, libs.CultureInfoUS, null); }
private static data.importDS.importPriceDataTable GetPrice(DateTime updateTime, string url, string marketCode) { data.importDS.importPriceDataTable importPriceTbl = new data.importDS.importPriceDataTable(); ForexData[] frData = ImportForex(url); ForexData goldData = frData[3]; //Gold at price 4 if (lastForexData != null) { if (lastForexData.last == goldData.last && lastForexData.high == goldData.high && lastForexData.low == goldData.low) { return(importPriceTbl); } } else { lastForexData = new ForexData(); } lastForexData.last = goldData.last; lastForexData.high = goldData.high; lastForexData.low = goldData.low; data.importDS.importPriceRow importRow; importRow = importPriceTbl.NewimportPriceRow(); application.DbAccess.InitData(importRow); importRow.onDate = updateTime; importRow.stockExchange = marketCode; importRow.stockCode = goldData.code; importRow.closePrice = goldData.last; importRow.highPrice = goldData.high; importRow.lowPrice = goldData.low; if (goldOpenPriceDate != updateTime.Date || goldOpenPrice == decimal.MinValue) { data.baseDS.priceDataRow row = application.DbAccess.GetLastPriceData(importRow.stockCode); if (row != null) { goldOpenPrice = row.closePrice; } else { goldOpenPrice = importRow.closePrice; } goldOpenPriceDate = updateTime.Date; } importRow.openPrice = goldOpenPrice; importPriceTbl.AddimportPriceRow(importRow); return(importPriceTbl); }
//Detect new stockCode and create new one public static void AddNewCode(data.importDS.importPriceDataTable tbl, OnAddData onAddstockCodeFunc) { data.baseDS.stockCodeDataTable stockCodeTbl = new data.baseDS.stockCodeDataTable(); for (int count = 0; count < tbl.Count; count++) { if (tbl[count].RowState == DataRowState.Deleted) { continue; } if (AddNewCode(tbl[count].stockCode, tbl[count].stockExchange, stockCodeTbl) != null && onAddstockCodeFunc != null) { onAddstockCodeFunc(tbl[count].stockCode); } } application.DbAccess.UpdateData(stockCodeTbl); }
public static void AddImportPrice(data.importDS.importPriceDataTable importPriceTbl, data.baseDS.priceDataDataTable priceDataTbl) { AddImportPrice(importPriceTbl, myDailyPrice, priceDataTbl); }
/// <summary> /// Import data from URL to tables : importPrice /// The function also detect and add new companies to the database /// </summary> /// <param name="url">URL to get data</param> /// <param name="priceMeta">meta describe the webpage structure</param> /// <param name="stockExchangeCode">stock exchange code of imported data </param> /// <param name="importPriceTbl"> where to store imported data </param> private static data.importDS.importPriceDataTable GetPriceFromURL(DateTime updateTime, string url, importPriceMeta priceMeta, string marketCode) { data.importDS.importPriceDataTable importPriceTbl = new data.importDS.importPriceDataTable(); common.extSortedList mappingList = CreateMapping(priceMeta, importPriceTbl); data.baseDS.priceDataRow priceDataRow; // Get the URL specified var webGet = new HtmlWeb(); var document = webGet.Load(url); // Get <a> tags that have a href attribute and non-whitespace inner text var linksOnPage = from item in document.DocumentNode.Descendants() where item.Name == "td" && item.Attributes["id"] == null select new { Text = item.InnerText }; bool fError = false; int igmoreRowCount = 0, columnCount = 0; decimal val = 0; data.importDS.importPriceRow importRow = null; string stockCode; foreach (var item in linksOnPage) { //Check whether to ignore some items at the first if (++igmoreRowCount <= priceMeta.noRowIgnore) { continue; } if (fError) { break; } if (columnCount == priceMeta.startAtColId) { stockCode = item.Text.Trim(); importRow = importPriceTbl.NewimportPriceRow(); application.DbAccess.InitData(importRow); importRow.onDate = updateTime; importRow.stockCode = stockCode; importRow.stockExchange = marketCode; importRow.isTotalVolume = true; columnCount++; continue; } //Last column if (columnCount == priceMeta.endAtColId) { if (importRow.closePrice > 0) { if (importRow.openPrice == 0) { priceDataRow = application.DbAccess.GetLastPriceData(importRow.stockCode); if (priceDataRow == null) { importRow.openPrice = importRow.lowPrice; } else { importRow.openPrice = priceDataRow.closePrice; } } importPriceTbl.AddimportPriceRow(importRow); } else { importRow.CancelEdit(); } columnCount = 0; continue; } object obj = mappingList.GetValue(columnCount.ToString()); if (obj != null) { val = 0; common.system.StrToDecimal(item.Text, libs.CultureInfoUS, out val); importRow[(string)obj] = val; } columnCount++; } return(importPriceTbl); }
/// <summary> /// Import data from URL to tables : importPrice /// The function also detect and add new companies to the database /// </summary> /// <param name="url">URL to get data</param> /// <param name="priceMeta">meta describe the webpage structure</param> /// <param name="stockExchangeCode">stock exchange code of imported data </param> /// <param name="importPriceTbl"> where to store imported data </param> private static data.importDS.importPriceDataTable GetPriceFromURL(DateTime updateTime, string url, importPriceMeta priceMeta, string marketCode) { data.importDS.importPriceDataTable importPriceTbl = new data.importDS.importPriceDataTable(); common.extSortedList mappingList = CreateMapping(priceMeta, importPriceTbl); data.baseDS.priceDataRow priceDataRow; // Get the URL specified var webGet = new HtmlWeb(); var document = webGet.Load(url); // Get <a> tags that have a href attribute and non-whitespace inner text var linksOnPage = from item in document.DocumentNode.Descendants() where item.Name == "td" && item.Attributes["id"] == null select new { Text = item.InnerText }; bool fError = false; int igmoreRowCount = 0, columnCount = 0; decimal val = 0; data.importDS.importPriceRow importRow = null; string stockCode; foreach (var item in linksOnPage) { //Check whether to ignore some items at the first if (++igmoreRowCount <= priceMeta.noRowIgnore) continue; if (fError) break; if (columnCount == priceMeta.startAtColId) { stockCode = item.Text.Trim(); importRow = importPriceTbl.NewimportPriceRow(); application.DbAccess.InitData(importRow); importRow.onDate = updateTime; importRow.stockCode = stockCode; importRow.stockExchange = marketCode; importRow.isTotalVolume = true; columnCount++; continue; } //Last column if (columnCount == priceMeta.endAtColId) { if (importRow.closePrice > 0) { if (importRow.openPrice == 0) { priceDataRow = application.DbAccess.GetLastPriceData(importRow.stockCode); if (priceDataRow == null) importRow.openPrice = importRow.lowPrice; else importRow.openPrice = priceDataRow.closePrice; } importPriceTbl.AddimportPriceRow(importRow); } else importRow.CancelEdit(); columnCount = 0; continue; } object obj = mappingList.GetValue(columnCount.ToString()); if (obj != null) { val = 0; common.system.StrToDecimal(item.Text, libs.CultureInfoUS, out val); importRow[(string)obj] = val; } columnCount++; } return importPriceTbl; }
public static void UpdateData(data.importDS.importPriceDataTable tbl) { importPriceTA.Update(tbl); tbl.AcceptChanges(); }
private static data.importDS.importPriceDataTable GetPrice(DateTime updateTime, string url, string marketCode) { data.importDS.importPriceDataTable importPriceTbl = new data.importDS.importPriceDataTable(); ForexData[] frData = ImportForex(url); ForexData goldData = frData[3]; //Gold at price 4 if (lastForexData != null) { if (lastForexData.last == goldData.last && lastForexData.high == goldData.high && lastForexData.low == goldData.low) return importPriceTbl; } else lastForexData = new ForexData(); lastForexData.last = goldData.last; lastForexData.high = goldData.high; lastForexData.low = goldData.low; data.importDS.importPriceRow importRow; importRow = importPriceTbl.NewimportPriceRow(); application.DbAccess.InitData(importRow); importRow.onDate = updateTime; importRow.stockExchange = marketCode; importRow.stockCode = goldData.code; importRow.closePrice = goldData.last; importRow.highPrice = goldData.high; importRow.lowPrice = goldData.low; if (goldOpenPriceDate != updateTime.Date || goldOpenPrice == decimal.MinValue) { data.baseDS.priceDataRow row = application.DbAccess.GetLastPriceData(importRow.stockCode); if (row != null) goldOpenPrice = row.closePrice; else goldOpenPrice = importRow.closePrice; goldOpenPriceDate = updateTime.Date; } importRow.openPrice = goldOpenPrice; importPriceTbl.AddimportPriceRow(importRow); return importPriceTbl; }