public void Diagnose(commonTypes.AppTypes.PriceDataType dataType, double allowVariantPerc, ref databases.tmpDS.priceDiagnoseDataTable priceDiagnoseTbl) { string dataFld = ""; switch (dataType) { case AppTypes.PriceDataType.High: dataFld = priceDataTbl.highPriceColumn.ColumnName; break; case AppTypes.PriceDataType.Low: dataFld = priceDataTbl.lowPriceColumn.ColumnName; break; case AppTypes.PriceDataType.Open: dataFld = priceDataTbl.openPriceColumn.ColumnName; break; case AppTypes.PriceDataType.Volume: dataFld = priceDataTbl.volumeColumn.ColumnName; break; default: dataFld = priceDataTbl.closePriceColumn.ColumnName; break; } databases.tmpDS.priceDiagnoseRow priceDiagnoseRow; double d1, d2; for (int idx = 1; idx < priceDataTbl.Count; idx++) { if (priceDataTbl[idx].RowState == System.Data.DataRowState.Deleted) continue; d1 = (double)priceDataTbl[idx-1][dataFld]; d2 = (double)priceDataTbl[idx][dataFld]; if (d1 == 0) continue; if (Math.Abs((d2 - d1)/d1) < allowVariantPerc) continue; priceDiagnoseRow = priceDiagnoseTbl.NewpriceDiagnoseRow(); priceDiagnoseRow.code = this.DataStockCode; priceDiagnoseRow.date1 = priceDataTbl[idx-1].onDate; priceDiagnoseRow.date2 = priceDataTbl[idx].onDate; priceDiagnoseRow.price1 = d1; priceDiagnoseRow.price2 = d2; priceDiagnoseRow.variance = (d2 - d1) / d1; priceDiagnoseTbl.AddpriceDiagnoseRow(priceDiagnoseRow); } }
/// <summary> /// Diagnose price data for abnomal variance in price /// </summary> /// <param name="priceDataTbl"></param> /// <param name="checkVariancePerc"></param> /// <param name="checkVariance"></param> /// <param name="precision"></param> /// <param name="priceDiagnoseTbl"></param> public static void DiagnosePrice_CloseAndNextOpen(databases.baseDS.priceDataDataTable priceDataTbl, double checkVariancePerc, double checkVariance,byte precision, databases.tmpDS.priceDiagnoseDataTable priceDiagnoseTbl) { string dataFld1 = priceDataTbl.closePriceColumn.ColumnName; string dataFld2 = priceDataTbl.openPriceColumn.ColumnName; databases.baseDS.priceDataRow priceRow1, priceRow2; databases.tmpDS.priceDiagnoseRow priceDiagnoseRow; DataView myView = new DataView(priceDataTbl); myView.Sort = priceDataTbl.onDateColumn.ColumnName; double d1, d2,variancePerc; for (int idx = 1; idx < myView.Count; idx++) { d1 = double.Parse(myView[idx-1][dataFld1].ToString()); d2 = double.Parse(myView[idx][dataFld2].ToString()); if (d1 == 0) continue; variancePerc = (d2 / d1) - 1; //if (Math.Abs(d2 - d1) <= checkVariance || if (Math.Abs(Math.Round(variancePerc, precision)) <= checkVariancePerc) continue; priceRow1 = (databases.baseDS.priceDataRow)myView[idx-1].Row; priceRow2 = (databases.baseDS.priceDataRow)myView[idx].Row; priceDiagnoseRow = priceDiagnoseTbl.NewpriceDiagnoseRow(); priceDiagnoseRow.code = priceRow2.stockCode; priceDiagnoseRow.date1 = priceRow1.onDate; priceDiagnoseRow.date2 = priceRow2.onDate; priceDiagnoseRow.price1 = d1; priceDiagnoseRow.price2 = d2; priceDiagnoseRow.variance = variancePerc; priceDiagnoseTbl.AddpriceDiagnoseRow(priceDiagnoseRow); } }