public static TradePointInfo[] ToTradePointInfo(Data.TradePoints tradePoints) { TradePointInfo[] tradePointInfos = new TradePointInfo[tradePoints.Count]; for (int idx = 0; idx < tradePoints.Count; idx++) { tradePointInfos[idx] = (TradePointInfo)tradePoints[idx]; } return(tradePointInfos); }
public TradeAlertItem(string stockCode, string strategy, AppTypes.TimeScale timeScale, DateTime onDateTime, double price, double volume, TradePointInfo tradePoint) { this.StockCode = stockCode; this.TimeScale = timeScale; this.Strategy = strategy; this.OnDateTime = onDateTime; this.Price = price; this.Volume = volume; this.TradePoint = tradePoint; }
//[ServiceKnownType(typeof(TradePointInfo[]))] public TradePointInfo[] Analysis(string dataKey, string strategyCode) { TradePointInfo[] tradePointList = new TradePointInfo[0]; AnalysisData data = GetAnalysisData(dataKey); if (data == null) { return(tradePointList); } application.Strategy.Meta meta = application.Strategy.Libs.FindMetaByCode(strategyCode); if (meta == null) { return(tradePointList); } return(application.Strategy.Libs.ToTradePointInfo(application.Strategy.Libs.Analysis(data, meta))); }
/// <summary> /// Tim tradepointInfo cua Pointidx /// </summary> /// <param name="pointIdx">diem tren do thi</param> /// <returns></returns> private TradePointInfo findTradePointInfo(int pointIdx) { TradePointInfo info = null; if (tradePoints == null) { return(null); } //Array.BinarySearch(tradePoints, for (int i = 0; i < tradePoints.Length; i++) { if ((tradePoints[i].DataIdx == pointIdx) && (tradePoints[i].isValid)) { return(tradePoints[i]); } } return(info); }
/// <summary> /// The hien thong tin tren moi diem ve /// </summary> /// <param name="curve"></param> /// <param name="pointIdx"></param> /// <returns></returns> private string PointValueEventPrice(CurveItem curve, int pointIdx) { if (!Settings.sysChartShowDescription) { return(null); } if (pointIdx >= myData.Open.Values.Length) { return(null); } DateTime dt = DateTime.FromOADate(curve[pointIdx].X); string retVal = ""; switch (this.ChartTimeScale.Type) { case AppTypes.TimeScaleTypes.RealTime: case AppTypes.TimeScaleTypes.Minnute: case AppTypes.TimeScaleTypes.Hour: retVal = Languages.Libs.GetString("time") + " : " + dt.ToString(); break; case AppTypes.TimeScaleTypes.Day: retVal = Languages.Libs.GetString("date") + " : " + dt.ToShortDateString(); break; case AppTypes.TimeScaleTypes.Week: retVal = Languages.Libs.GetString("week") + " : " + common.dateTimeLibs.WeekOfYear(dt).ToString() + "/" + dt.Year.ToString(); break; case AppTypes.TimeScaleTypes.Month: retVal = Languages.Libs.GetString("month") + " : " + dt.Month.ToString() + "/" + dt.Year.ToString(); break; case AppTypes.TimeScaleTypes.Year: retVal = Languages.Libs.GetString("year") + " : " + dt.Year.ToString(); break; } retVal += common.Consts.constCRLF + Languages.Libs.GetString("openPrice") + " : " + myData.Open.Values[pointIdx].ToString(Settings.sysMaskPrice) + common.Consts.constCRLF + Languages.Libs.GetString("highPrice") + " : " + myData.High.Values[pointIdx].ToString(Settings.sysMaskPrice) + common.Consts.constCRLF + Languages.Libs.GetString("lowPrice") + " : " + myData.Low.Values[pointIdx].ToString(Settings.sysMaskPrice) + common.Consts.constCRLF + Languages.Libs.GetString("closePrice") + " : " + myData.Close.Values[pointIdx].ToString(Settings.sysMaskPrice) + common.Consts.constCRLF + Languages.Libs.GetString("volume") + " : " + myData.Volume.Values[pointIdx].ToString(Settings.sysMaskQty); TradePointInfo info = findTradePointInfo(pointIdx); if (info != null) { retVal += common.Consts.constCRLF + Languages.Libs.GetString("targetPrice") + " : " + info.BusinessInfo.Short_Target + common.Consts.constCRLF + Languages.Libs.GetString("resistance") + " : " + info.BusinessInfo.Short_Resistance + common.Consts.constCRLF + Languages.Libs.GetString("support") + " : " + info.BusinessInfo.Short_Support; } return(retVal); }
//public static int CreateTradeAlert() //{ // CreateTradeAlert(null, null, null); //} public static int CreateTradeAlert(onProcessStart onStartFunc, onProcessItem onProcessItemFunc, onProcessEnd onEndFunc) { DateTime frDate = common.Consts.constNullDate; DateTime toDate = DateTime.Now; //Run all strategy analysis for all stocks. databases.tmpDS.stockCodeDataTable stockCodeTbl = new databases.tmpDS.stockCodeDataTable(); databases.DbAccess.LoadData(stockCodeTbl, AppTypes.CommonStatus.Enable); application.AnalysisData data = new application.AnalysisData(); data.DataTimeRange = AppTypes.TimeRanges.None; data.DataMaxCount = Settings.sysGlobal.AlertDataCount; TradeAlertItem[] tradeAlertList = new TradeAlertItem[0]; StringCollection strategyList = new StringCollection(); for (int idx = 0; idx < StrategyData.MetaList.Values.Length; idx++) { application.Strategy.StrategyMeta meta = (application.Strategy.StrategyMeta)StrategyData.MetaList.Values[idx]; if (meta.Type != AppTypes.StrategyTypes.Strategy) { continue; } strategyList.Add(((application.Strategy.StrategyMeta)StrategyData.MetaList.Values[idx]).Code); } if (onStartFunc != null) { onStartFunc(stockCodeTbl.Count); } DateTime alertDate; DateTime alertFrDate = toDate.Date; DateTime alertToDate = toDate; for (int stockCodeIdx = 0; stockCodeIdx < stockCodeTbl.Count; stockCodeIdx++) { if (onProcessItemFunc != null) { if (!onProcessItemFunc(stockCodeTbl[stockCodeIdx].code)) { break; } } //foreach (AppTypes.TimeScale timeScale in AppTypes.myTimeScales) //??? AppTypes.TimeScale timeScale = AppTypes.TimeScaleFromType(AppTypes.TimeScaleTypes.Day); { data.DataStockCode = stockCodeTbl[stockCodeIdx].code; data.DataTimeScale = timeScale; data.LoadData(); for (int strategyIdx = 0; strategyIdx < strategyList.Count; strategyIdx++) { StrategyData.ClearCache(); TradePoints advices = application.Strategy.StrategyLibs.AnalysisStrategy(data, strategyList[strategyIdx].Trim()); if ((advices == null) || (advices.Count == 0)) { continue; } //Only check the last advices for alert TradePointInfo tradeInfo = (TradePointInfo)advices[advices.Count - 1]; alertDate = DateTime.FromOADate(data.DateTime[tradeInfo.DataIdx]); //Ignore alerts that out of date range. if (alertDate < alertFrDate || alertDate > alertToDate) { continue; } Array.Resize(ref tradeAlertList, tradeAlertList.Length + 1); tradeAlertList[tradeAlertList.Length - 1] = new TradeAlertItem(stockCodeTbl[stockCodeIdx].code.Trim(), strategyList[strategyIdx].Trim(), timeScale, alertDate, data.Close[tradeInfo.DataIdx], data.Volume[tradeInfo.DataIdx], tradeInfo); } } } //Create alerts in the day int noAlertCreated = CreateTradeAlert(tradeAlertList); //Save last lun date //SaveLastRunTime(toDate); if (onEndFunc != null) { onEndFunc(); } stockCodeTbl.Dispose(); return(noAlertCreated); }
private static void CreateTradeAlert(databases.baseDS.tradeAlertDataTable tradeAlertTbl, string portfolioCode, string stockCode, string strategy, AppTypes.TimeScale timeScale, TradePointInfo info, DateTime onTime, string msg) { databases.baseDS.tradeAlertRow row = tradeAlertTbl.NewtradeAlertRow(); databases.AppLibs.InitData(row); row.onTime = onTime; row.portfolio = portfolioCode; row.stockCode = stockCode; row.timeScale = timeScale.Code; row.strategy = strategy; row.status = (byte)AppTypes.CommonStatus.New; row.tradeAction = (byte)info.TradeAction; row.subject = info.TradeAction.ToString(); row.msg = msg; tradeAlertTbl.AddtradeAlertRow(row); }
public void PlotStrategyTradepoints(application.Strategy.StrategyMeta meta, bool showEstimation, EstimateTradePointFunc estimateFunc) { int idx; ShowMessage(""); EstimateOptions estOption = new EstimateOptions(); databases.tmpDS.tradeEstimateDataTable tbl = new databases.tmpDS.tradeEstimateDataTable(); application.StrategyStatistics statistics = new StrategyStatistics(); //TradePointInfo[] tradePoints = DataAccess.Libs.GetTradePointWithEstimationDetail(myData.myDataParam, myData.DataStockCode, meta.Code, estOption, out tbl, out statistics); /// Estimate trade points and set tradepoint's [isValid] property to mark whether a tradepoint is valid or not. for (idx = 0; idx < tradePoints.Length; idx++) { tradePoints[idx].isValid = !tbl[idx].ignored; } for (idx = tradePoints.Length - 1; idx > 0; idx--) { if (tradePoints[idx].isValid) { break; } } TradePointInfo tpiTradePointInfo = (TradePointInfo)tradePoints[idx]; BusinessInfo biLastTrade = tpiTradePointInfo.BusinessInfo; BusinessInfo biLastPoint = tradePoints[tradePoints.Length - 1].BusinessInfo; double price = myData.Close[myData.Close.Count - 1]; double risk = (biLastPoint.Short_Resistance - price) / (price - biLastPoint.Short_Support); //string sResult = "Close price=" + price+ // "Target="+biLastTrade.Short_Target+ // "Resistance=" + biLastPoint.Short_Resistance + // " Support=" + biLastPoint.Short_Support + // " Risk return=" +risk+ // " Winning Percentage:"+ String.Format("{0:P2}",statistics.dWinningPercentagePerTrade)+ // " Max %Win Per Trade:" + String.Format("{0:P2}",statistics.dMaxWinningPercentage)+ // " Max %Lose Per Trade" + String.Format("{0:P2}", statistics.dMaxLosingPercentage)+ // " Average %Win Per Trade" + String.Format("{0:P2}", statistics.dAverageWinningPercentage)+ // " Average %Lose Per Trade" + String.Format("{0:P2}", statistics.dAverageLosingPercentage); ; PlotStrategyTradepoints(application.Strategy.StrategyLibs.ToTradePoints(tradePoints), pricePanel); //MessageBox.Show(sResult); //Show form Tools.Forms.TradeStatistics formStatistic = new Tools.Forms.TradeStatistics(); formStatistic.AddStatisticInfo("Close price", price); formStatistic.AddStatisticInfo("Target", biLastTrade.Short_Target); formStatistic.AddStatisticInfo("Resistance", biLastPoint.Short_Resistance); formStatistic.AddStatisticInfo("Support", biLastPoint.Short_Support); formStatistic.AddStatisticInfo("Risk return", risk); formStatistic.AddStatisticInfo("Winning Percentage", String.Format("{0:P2}", statistics.dWinningPercentagePerTrade)); formStatistic.AddStatisticInfo("Max %Win Per Trade", String.Format("{0:P2}", statistics.dMaxWinningPercentage)); formStatistic.AddStatisticInfo("Max %Lose Per Trade", String.Format("{0:P2}", statistics.dMaxLosingPercentage)); formStatistic.AddStatisticInfo("Average %Win Per Trade", String.Format("{0:P2}", statistics.dAverageWinningPercentage)); formStatistic.AddStatisticInfo("Average %Lose Per Trade", String.Format("{0:P2}", statistics.dAverageLosingPercentage)); formStatistic.Show(this.DockPanel, DockState.DockRightAutoHide); //Call estimation handler if any. if (showEstimation && estimateFunc != null) { estimateFunc(this, meta.Code, estOption, tbl); } }
public static void CreateTradeAlert(onProcessStart onStartFunc, onProcessItem onProcessItemFunc, onProcessEnd onEndFunc) { DateTime frDate = common.Consts.constNullDate; DateTime toDate = DateTime.Now; //Run all strategy analysis for all stocks. data.tmpDS.stockCodeDataTable stockCodeTbl = new data.tmpDS.stockCodeDataTable(); application.DbAccess.LoadData(stockCodeTbl, AppTypes.CommonStatus.Enable); application.AnalysisData data = new application.AnalysisData(); TradeAlert[] tradeAlertList = new TradeAlert[0]; StringCollection strategyList = new StringCollection(); for (int idx = 0; idx < application.Strategy.Data.MetaList.Values.Length; idx++) { application.Strategy.Meta meta = (application.Strategy.Meta)application.Strategy.Data.MetaList.Values[idx]; if (meta.Type != AppTypes.StrategyTypes.Strategy) { continue; } strategyList.Add(((application.Strategy.Meta)application.Strategy.Data.MetaList.Values[idx]).Code); } if (onStartFunc != null) { onStartFunc(stockCodeTbl.Count); } //Alert on last month data data.DataTimeRange = Settings.sysAlertTimeRange;; DateTime alertDate; DateTime alertFrDate = toDate.Date; DateTime alertToDate = toDate; for (int stockCodeIdx = 0; stockCodeIdx < stockCodeTbl.Count; stockCodeIdx++) { if (onProcessItemFunc != null) { if (!onProcessItemFunc(stockCodeTbl[stockCodeIdx].code)) { break; } } foreach (AppTypes.TimeScale timeScale in AppTypes.myTimeScales) //?? { data.DataStockCode = stockCodeTbl[stockCodeIdx].code; data.DataTimeScale = timeScale; data.LoadData(); for (int strategyIdx = 0; strategyIdx < strategyList.Count; strategyIdx++) { application.Strategy.Data.ClearCache(); application.Strategy.Data.TradePoints advices = application.Strategy.Libs.Analysis(data, strategyList[strategyIdx].Trim()); if (advices == null) { continue; } for (int idx3 = 0; idx3 < advices.Count; idx3++) { TradePointInfo tradeInfo = (TradePointInfo)advices[idx3]; alertDate = DateTime.FromOADate(data.DateTime[tradeInfo.DataIdx]); //Ignore alerts that out of date range. if (alertDate < alertFrDate || alertDate > alertToDate) { continue; } Array.Resize(ref tradeAlertList, tradeAlertList.Length + 1); tradeAlertList[tradeAlertList.Length - 1] = new TradeAlert(stockCodeTbl[stockCodeIdx].code.Trim(), strategyList[strategyIdx].Trim(), timeScale, alertDate, data.Close[tradeInfo.DataIdx], data.Volume[tradeInfo.DataIdx], tradeInfo); } } } } stockCodeTbl.Dispose(); //Create alerts in the day CreateTradeAlert(tradeAlertList); //Save last lun date SaveLastRunTime(toDate); if (onEndFunc != null) { onEndFunc(); } }
public static void CreateTradeAlert(onProcessStart onStartFunc, onProcessItem onProcessItemFunc, onProcessEnd onEndFunc) { CultureInfo cultureInfo = new CultureInfo(Settings.sysCultureCode); DateTime frDate = common.Consts.constNullDate; DateTime toDate = DateTime.Now; //Run all strategy analysis for all stocks. data.tmpDS.stockCodeDataTable stockCodeTbl = new data.tmpDS.stockCodeDataTable(); global::data.DbAccess.LoadData(stockCodeTbl, AppTypes.CommonStatus.Enable); application.Data data = new application.Data(); TradeAlert[] tradeAlertList = new TradeAlert[0]; StringCollection strategyList = new StringCollection(); for (int idx = 0; idx < Strategy.Data.MetaList.Values.Length; idx++) { Strategy.Meta meta = (Strategy.Meta)Strategy.Data.MetaList.Values[idx]; if (meta.Type != AppTypes.StrategyTypes.Strategy) { continue; } strategyList.Add(((Strategy.Meta)Strategy.Data.MetaList.Values[idx]).Code); } if (onStartFunc != null) { onStartFunc(stockCodeTbl.Count); } for (int stockCodeIdx = 0; stockCodeIdx < stockCodeTbl.Count; stockCodeIdx++) { if (onProcessItemFunc != null) { if (!onProcessItemFunc(stockCodeTbl[stockCodeIdx].code)) { break; } } foreach (AppTypes.TimeScale timeScale in AppTypes.myTimeScales) { //Move date ahead to ensure that there are sufficient data need in analysis process switch (timeScale.Type) { case AppTypes.TimeScaleTypes.RealTime: frDate = toDate.AddHours(-1); break; case AppTypes.TimeScaleTypes.Hour: frDate = toDate.Date; break; case AppTypes.TimeScaleTypes.Day: frDate = toDate.Date; break; case AppTypes.TimeScaleTypes.Week: frDate = common.dateTimeLibs.StartOfWeek(toDate, cultureInfo).AddSeconds(-1); break; case AppTypes.TimeScaleTypes.Month: frDate = common.dateTimeLibs.MakeDate(1, toDate.Month, toDate.Year).AddSeconds(-1); break; case AppTypes.TimeScaleTypes.Year: frDate = common.dateTimeLibs.MakeDate(1, 1, toDate.Year).AddSeconds(-1); break; default: common.system.ThrowException("Invalid parametter in calling to LoadStockPrice()"); break; } data.Reload(stockCodeTbl[stockCodeIdx].code, timeScale, frDate, toDate); for (int strategyIdx = 0; strategyIdx < strategyList.Count; strategyIdx++) { Strategy.Data.ClearCache(); Strategy.Data.TradePoints advices = Strategy.Libs.Analysis(data, strategyList[strategyIdx].Trim()); if (advices == null) { continue; } for (int idx3 = 0; idx3 < advices.Count; idx3++) { TradePointInfo tradeInfo = (TradePointInfo)advices[idx3]; Array.Resize(ref tradeAlertList, tradeAlertList.Length + 1); tradeAlertList[tradeAlertList.Length - 1] = new TradeAlert(stockCodeTbl[stockCodeIdx].code.Trim(), strategyList[strategyIdx].Trim(), timeScale, DateTime.FromOADate(data.DateTime[tradeInfo.DataIdx]), data.Close[tradeInfo.DataIdx], data.Volume[tradeInfo.DataIdx], tradeInfo); } } } } stockCodeTbl.Dispose(); //Create alerts in the day CreateTradeAlert(tradeAlertList, toDate.Date, toDate); //Save last lun date SaveLastRunTime(toDate); if (onEndFunc != null) { onEndFunc(); } }