private void MeasureSimulationStep() { DateTime start = DateTime.Now; ProcessSimulationStep(); DateTime end = DateTime.Now; TimeSpan span = new TimeSpan((end.Subtract(start).Ticks)); m_StepTimeSpan.Add(span.TotalMilliseconds); if (OnStepProcessed != null) { OnStepProcessed(this); } }
private void CalculateDaily(string code) { if (string.IsNullOrEmpty(code)) { return; } var scripts = Config.Instance.INFO.ScriptSetting.Scripts; var macdsetting = Config.Instance.INFO.MACDSetting; var rsisetting = Config.Instance.INFO.RSISetting; // Delete MACD, RSI values if ((CheckTable <DBStkMACDEntity>() && scripts.ContainsKey("DEL_MACD_BY_CD")) && (CheckTable <DBStkRSIEntity>() && scripts.ContainsKey("DEL_RSI_BY_CD"))) { var lprm_macd = accessor.CreateParameter("CODE", code); var lcmd_macd = accessor.CreateCommand(scripts["DEL_MACD_BY_CD"], new List <DbParameter>() { lprm_macd }); var lprm_rsi = accessor.CreateParameter("CODE", code); var lcmd_rsi = accessor.CreateCommand(scripts["DEL_RSI_BY_CD"], new List <DbParameter>() { lprm_rsi }); if (accessor.ExecuteSQLCommand(new List <DbCommand>() { lcmd_macd, lcmd_rsi }) < 0) { logger.Write(TYPE.ERROR, string.Format("delete MACD and RSI data failed.({0})", code)); logger.Write(TYPE.ERROR, accessor.LastError); return; } } else { return; } // Retrieve Stocks var page = new EntityPage <DBTStkDailyEntity>( new Clause("Code = {Code}").AddParam("Code", code), new Sort().Add("ID", Sort.Orientation.asc), 100, accessor); List <DBTStkDailyEntity> lst_daily = null; DateTime ldt_date = DateTime.Today; MACD macd = null; RSI rsi = null; AverageValue daily30 = null; #region Cache For MACD SegCache <LinearList <KeyValuePair <DateTime, decimal> >, KeyValuePair <DateTime, decimal> > cache1 = null; SegCache <LinearList <KeyValuePair <DateTime, decimal> >, KeyValuePair <DateTime, decimal> > cache2 = null; LinearList <KeyValuePair <DateTime, decimal> > list1 = null; LinearList <KeyValuePair <DateTime, decimal> > list2 = null; #endregion #region Cache For AVG SegCache <LinearList <KeyValuePair <DateTime, decimal> >, KeyValuePair <DateTime, decimal> > cache3 = null; SegCache <LinearList <KeyValuePair <DateTime, decimal> >, KeyValuePair <DateTime, decimal> > cache4 = null; LinearList <KeyValuePair <DateTime, decimal> > list3 = null; LinearList <KeyValuePair <DateTime, decimal> > list4 = null; #endregion Func <KeyValuePair <DateTime, decimal>, decimal> fValue = (pair) => { return(pair.Value); }; Func <KeyValuePair <DateTime, decimal>, KeyValuePair <DateTime, decimal>, LinearList <KeyValuePair <DateTime, decimal> >, bool> fSwitch1 = (v1, v2, segment) => { switch (segment.Orietion) { case 0: return(false); case 1: if (v2.Value >= v1.Value) { return(false); } break; case -1: if (v2.Value <= v1.Value) { return(false); } break; } return(true); }; Func <LinearList <KeyValuePair <DateTime, decimal> >, LinearList <KeyValuePair <DateTime, decimal> >, bool> fSwitch2 = (values, segment) => { if (segment.Orietion == 0 || segment.Orietion == values.Orietion) { return(false); } return(values.Count >= 10); }; int pageno = 0; var count = 0; while ((lst_daily = page.Retrieve(++pageno)).Count > 0) { for (int i = 0; i < lst_daily.Count; i++, count++) { try { var daily = lst_daily[i]; ldt_date = daily.Date; if (pageno == 1 && i == 0) { macd = new MACD(daily.Close); rsi = new RSI(rsisetting.N1, rsisetting.N2, rsisetting.N3, daily.Close); daily30 = new AverageValue(30, 4); daily30.Add(daily.Close); cache1 = new SegCache <LinearList <KeyValuePair <DateTime, decimal> >, KeyValuePair <DateTime, decimal> >( new LinearList <KeyValuePair <DateTime, decimal> >[] { new LinearList <KeyValuePair <DateTime, decimal> >(fValue), new LinearList <KeyValuePair <DateTime, decimal> >(fValue) }, fSwitch1, null); cache2 = new SegCache <LinearList <KeyValuePair <DateTime, decimal> >, KeyValuePair <DateTime, decimal> >( new LinearList <KeyValuePair <DateTime, decimal> >[] { new LinearList <KeyValuePair <DateTime, decimal> >(fValue), new LinearList <KeyValuePair <DateTime, decimal> >(fValue) }, null, fSwitch2); cache3 = new SegCache <LinearList <KeyValuePair <DateTime, decimal> >, KeyValuePair <DateTime, decimal> >( new LinearList <KeyValuePair <DateTime, decimal> >[] { new LinearList <KeyValuePair <DateTime, decimal> >(fValue), new LinearList <KeyValuePair <DateTime, decimal> >(fValue) }, fSwitch1, null); cache4 = new SegCache <LinearList <KeyValuePair <DateTime, decimal> >, KeyValuePair <DateTime, decimal> >( new LinearList <KeyValuePair <DateTime, decimal> >[] { new LinearList <KeyValuePair <DateTime, decimal> >(fValue), new LinearList <KeyValuePair <DateTime, decimal> >(fValue) }, null, fSwitch2); } else { macd.Add(daily.Close); rsi.Add(daily.Close); daily30.Add(daily.Close); if (cache1.Add(new KeyValuePair <DateTime, decimal>(daily.Date, macd.DEA), out list1)) { cache2.Add(list1, out list2); } if (cache3.Add(new KeyValuePair <DateTime, decimal>(daily.Date, daily30.Average), out list3)) { cache4.Add(list3, out list4); } } var lent_macd = new DBStkMACDEntity(daily.ID); lent_macd.EMA12 = macd.EMA12; lent_macd.EMA26 = macd.EMA26; lent_macd.DIFF = macd.DIFF; lent_macd.DEA = macd.DEA; lent_macd.BAR = macd.BAR; var lent_rsi = new DBStkRSIEntity(daily.ID); lent_rsi.RSI1 = rsi.RSI1; lent_rsi.RSI2 = rsi.RSI2; lent_rsi.RSI3 = rsi.RSI3; lent_rsi.RSI1MaxEma = rsi.RSI1MaxEma; lent_rsi.RSI1ABSEma = rsi.RSI1ABSEma; lent_rsi.RSI2MaxEma = rsi.RSI2MaxEma; lent_rsi.RSI2ABSEma = rsi.RSI2ABSEma; lent_rsi.RSI3MaxEma = rsi.RSI3MaxEma; lent_rsi.RSI3ABSEma = rsi.RSI3ABSEma; accessor.SaveEntity(lent_macd, lent_rsi); accessor.Commit(); } catch { } } } if (count > 120) { cache2.Add(cache1.Segment, out list2); cache4.Add(cache3.Segment, out list4); var lent_sum = new DBStkSummaryResultEntity(); lent_sum.Code = code; lent_sum.Time = DateTime.Now; lent_sum.PAVG30_ORIENT = cache4.Segment.Orietion; lent_sum.PAVG30_DAYS = cache4.Segment.Count; lent_sum.PAVG30_VALUE = cache4.Segment.Slope; lent_sum.PAVG30_Date1 = cache4.Segment[0].Key; lent_sum.PAVG30_Date2 = cache4.Segment[cache4.Segment.Count - 1].Key; lent_sum.DEA_ORIENT = cache2.Segment.Orietion; lent_sum.DEA_DAYS = cache2.Segment.Count; lent_sum.DEA_VALUE = cache2.Segment.Slope; lent_sum.DEA_Date1 = cache2.Segment[0].Key; lent_sum.DEA_Date2 = cache2.Segment[cache2.Segment.Count - 1].Key; lent_sum.RSI_Date = ldt_date; lent_sum.RSI_VALUE1 = rsi.RSI1; lent_sum.RSI_VALUE2 = rsi.RSI2; lent_sum.RSI_VALUE3 = rsi.RSI3; if (CheckTable <DBStkSummaryResultEntity>()) { accessor.SetDBAccessor2(lent_sum); lent_sum.GenerateID(); lent_sum.Save(); } } if (page != null) { page.Dispose(); } if (cache1 != null) { cache1.Dispose(); } if (cache2 != null) { cache2.Dispose(); } if (cache3 != null) { cache3.Dispose(); } if (cache4 != null) { cache4.Dispose(); } if (daily30 != null) { daily30.Dispose(); } }