static private FixDataResult TestGood(IDataManager idm, string Symbol, bool OnlyUp2Date) { IDataProvider idp = idm[Symbol, Config.FixDataTestDays]; double[] High = idp["HIGH"]; double[] Low = idp["LOW"]; double[] Date = idp["DATE"]; FixDataResult fdr = FixDataResult.OK; for (int i = Date.Length - 1; i >= 1; i--) { if (!OnlyUp2Date) { double d1 = Low[i] / High[i - 1]; //dd[i]/dd[i-1]; double d2 = High[i] / Low[i - 1]; double Delta = Config.FixDataDifference / 100.0; if (d2 < (1.0 - Delta) || d1 > (1.0 + Delta)) { Tools.Log(Symbol + ":Delta = " + d1 + "," + d2 + ":" + DateTime.FromOADate(Date[i])); fdr = FixDataResult.Others; } if (Date[i] - Date[i - 1] > Config.FixDataGapDays) { Tools.Log(Symbol + ":GapDays:" + DateTime.FromOADate(Date[i])); fdr = FixDataResult.Others; } } if (i == Date.Length - 1) { if ((DateTime.Now.ToOADate() - Date[i]) > Config.FixDataNoDataDays) { Tools.Log(Symbol + ":NoData:" + DateTime.FromOADate(Date[i])); fdr = FixDataResult.NoData; } } } if (Date.Length == 0) { fdr = fdr = FixDataResult.NoData; } return(fdr); }
/// <summary> /// Test days : FixData.TestDays /// When data increase or decline beyond +/-"FixData.Difference"% , reload data /// When data lost for "FixData.GapDays" days, reload data, still no data then delete /// When no data for latest "FixData.NoDataDays" days, reload data, still no data then delete /// /// Result saved in QuoteCode /// -1 : Stocks should be deleted /// -2 : Network error, Should redownload /// -3 : No need to fix again /// -4 : Fixed symbols /// </summary> /// <param name="Sender"></param> static public void FixData(object Sender) { Tools.Log("FixData started"); try { DataTable dtSkip = DB.GetDataTable("select QuoteCode from ScanedQuote where ConditionId=-3"); ArrayList alSkip = new ArrayList(); foreach (DataRow dr in dtSkip.Rows) { alSkip.Add(dr[0].ToString()); } DB.DoCommand("delete from ScanedQuote where ConditionId<0 and ConditionId<>-3"); DataTable dt = DB.GetDataTable("select QuoteCode from stockdata"); DBDataManager ddm = new DBDataManager(); FixedCount = 0; FixErrorCount = 0; TotalCount = dt.Rows.Count; for (int j = 0; j < dt.Rows.Count; j++) { NowIndex = j + 1; DataRow dr = dt.Rows[j]; string Symbol = dr["QuoteCode"].ToString(); try { if (TestGood(ddm, Symbol, false) != FixDataResult.OK) { if (alSkip.IndexOf(Symbol) >= 0) { if (TestGood(ddm, Symbol, true) == FixDataResult.OK) { continue; } else { DB.DoCommand("delete from ScanedQuote where ConditionId=-3 and QuoteCode='" + Symbol + "'"); } } for (int k = 0; k < 3; k++) { try { Utils.DownloadYahooHistory(Symbol, true, false); break; } catch (WebException) { if (k == 2) { throw; } } } FixDataResult fdr1 = TestGood(ddm, Symbol, false); FixDataResult fdr2 = TestGood(ddm, Symbol, true); if (fdr2 == FixDataResult.NoData) { InsertQuote(-1, Symbol); } else if (fdr1 == FixDataResult.Others && fdr2 == FixDataResult.OK) { InsertQuote(-3, Symbol); } else { InsertQuote(-4, Symbol); } FixedCount++; } } catch (Exception e) { if (e.Message.IndexOf("404") >= 0) { InsertQuote(-1, Symbol); } else { InsertQuote(-2, Symbol); } Tools.Log("FixData:" + Symbol + ";" + e.Message + ";" + e.GetType()); FixErrorCount++; } Thread.Sleep(1); } Tools.Log("FixData finished"); } finally { FixDataThread = null; } }