/// <summary> /// Create alerts for all stock in portfolio /// </summary> /// <param name="alertList"> all alert resulted from analysis </param> /// <param name="frDate">Alert will only create alert in range [frDate,toDate]. /// It also ensure that in the same day,there in ONLY one new alert of the same type</param> /// <param name="toDate"></param> private static void CreateTradeAlert(TradeAlert[] alertList,DateTime frDate,DateTime toDate) { decimal availabeQty; string msg; StringCollection timeScaleList; data.baseDS.tradeAlertRow tradeAlertRow; data.baseDS.tradeAlertDataTable tradeAlertTbl = new data.baseDS.tradeAlertDataTable(); data.baseDS.portfolioDetailDataTable portfolioDetailTbl = new data.baseDS.portfolioDetailDataTable(); DataView portfolioDetailView = new DataView(portfolioDetailTbl); //Sort by Stock code + Strategy code portfolioDetailView.Sort = portfolioDetailTbl.codeColumn.ColumnName + "," + portfolioDetailTbl.subCodeColumn.ColumnName; DataRowView[] portfolioDetailFound; data.baseDS.portfolioDetailRow portfolioDataRow; portfolioDetailTbl = data.DbAccess.GetPortfolioDetail_ByType(new AppTypes.PortfolioTypes[] { AppTypes.PortfolioTypes.WatchList, AppTypes.PortfolioTypes.Portfolio }); // Only alert on stock codes that were selected by user. for (int alertId = 0; alertId < alertList.Length; alertId++) { // Check if alert's strategy in user's wish list ?? portfolioDetailFound = portfolioDetailView.FindRows(new object[] { alertList[alertId].StockCode, alertList[alertId].Strategy.Trim() }); for (int dataIdx = 0; dataIdx < portfolioDetailFound.Length; dataIdx++) { // Check if time alert's time scale in user's wish list ?? portfolioDataRow = ((data.baseDS.portfolioDetailRow)portfolioDetailFound[dataIdx].Row); timeScaleList = common.MultiValueString.String2List(portfolioDataRow.data.Trim()); if (!timeScaleList.Contains(alertList[alertId].TimeScale.Code)) continue; //Do not crete alert if there is a NEW one. tradeAlertRow = data.DbAccess.GetLastAlert( frDate, toDate, portfolioDataRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale.Code, (byte)AppTypes.CommonStatus.New); if (tradeAlertRow != null) continue; //Availabe stock if (withAplicableCheckInAlert) { availabeQty = data.AppLibs.GetAvailableStock(alertList[alertId].StockCode, portfolioDataRow.portfolio, Settings.sysStockSell2BuyInterval, alertList[alertId].OnDateTime); } else availabeQty = int.MaxValue; //Aplicable to sell if ((alertList[alertId].TradePoint.TradeAction == AppTypes.TradeActions.Sell || alertList[alertId].TradePoint.TradeAction == AppTypes.TradeActions.ClearAll) && (availabeQty <= 0)) continue; msg = " - Giá : " + alertList[alertId].Price.ToString() + common.Consts.constCRLF + " - K/L giao dịch : " + alertList[alertId].Volume.ToString() + common.Consts.constCRLF + " - Xu hướng : (" + alertList[alertId].TradePoint.BusinessInfo.ToString() + "," + alertList[alertId].TradePoint.BusinessInfo.LongTermTrend + ")" + common.Consts.constCRLF + " - K/L sở hữu hợp lệ : " + availabeQty.ToString() + common.Consts.constCRLF; CreateTradeAlert(tradeAlertTbl, portfolioDataRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale, alertList[alertId].TradePoint, toDate, msg); } } data.DbAccess.UpdateData(tradeAlertTbl); }
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(); }
/// <summary> /// Create alerts for all stock in portfolio /// </summary> /// <param name="alertList"> all alert resulted from analysis </param> private static void CreateTradeAlert(TradeAlert[] alertList) { decimal availabeQty; string msg; StringCollection timeScaleList; data.baseDS.tradeAlertRow tradeAlertRow; data.baseDS.tradeAlertDataTable tradeAlertTbl = new data.baseDS.tradeAlertDataTable(); data.baseDS.portfolioDetailDataTable portfolioDetailTbl = application.DbAccess.GetPortfolioDetail_ByType(new AppTypes.PortfolioTypes[] { AppTypes.PortfolioTypes.WatchList, AppTypes.PortfolioTypes.Portfolio }); DataView portfolioDetailView = new DataView(portfolioDetailTbl); //Sort by Stock code + Strategy code portfolioDetailView.Sort = portfolioDetailTbl.codeColumn.ColumnName + "," + portfolioDetailTbl.subCodeColumn.ColumnName; DataRowView[] portfolioDetailFound; data.baseDS.portfolioDetailRow portfolioDataRow; // Only alert on stock codes that were selected by user. for (int alertId = 0; alertId < alertList.Length; alertId++) { // Check if alert's strategy in user's wish list ?? portfolioDetailFound = portfolioDetailView.FindRows(new object[] { alertList[alertId].StockCode, alertList[alertId].Strategy.Trim() }); for (int dataIdx = 0; dataIdx < portfolioDetailFound.Length; dataIdx++) { // Check if time alert's time scale in user's wish list ?? portfolioDataRow = ((data.baseDS.portfolioDetailRow)portfolioDetailFound[dataIdx].Row); timeScaleList = common.MultiValueString.String2List(portfolioDataRow.data.Trim()); if (!timeScaleList.Contains(alertList[alertId].TimeScale.Code)) continue; //Ignore duplicate alerts. tradeAlertRow = application.DbAccess.GetAlert(alertList[alertId].OnDateTime, portfolioDataRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale.Code, AppTypes.CommonStatus.All); if (tradeAlertRow != null) continue; //Availabe stock if (withAplicableCheckInAlert) { data.baseDS.stockExchangeRow stockExchangeRow = application.AppLibs.GetStockExchange(alertList[alertId].StockCode); int sell2BuyInterval = (stockExchangeRow==null?0:stockExchangeRow.minBuySellDay); availabeQty = application.DbAccess.GetAvailableStock(alertList[alertId].StockCode, portfolioDataRow.portfolio, sell2BuyInterval, alertList[alertId].OnDateTime); } else availabeQty = 0; //Aplicable to sell if ((alertList[alertId].TradePoint.TradeAction == AppTypes.TradeActions.Sell || alertList[alertId].TradePoint.TradeAction == AppTypes.TradeActions.ClearAll) && (availabeQty <= 0)) continue; string infoText = alertList[alertId].TradePoint.BusinessInfo.ToText().Trim(); infoText = (infoText != "" ? infoText : common.Consts.constNotAvailable); //Create alert template message, AlertMessageText() will convert it to specified-language text. msg = commonClass.Consts.constTextMergeMarkerLEFT + "price" + commonClass.Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Price.ToString() + common.Consts.constCRLF + commonClass.Consts.constTextMergeMarkerLEFT + "volume" + commonClass.Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Volume.ToString() + common.Consts.constCRLF + commonClass.Consts.constTextMergeMarkerLEFT + "marketInfo" + commonClass.Consts.constTextMergeMarkerRIGHT + " : " + infoText + common.Consts.constCRLF; if (availabeQty >0) { msg += commonClass.Consts.constTextMergeMarkerLEFT + "ownedQty" + commonClass.Consts.constTextMergeMarkerRIGHT + " : " + availabeQty.ToString() + common.Consts.constCRLF; } CreateTradeAlert(tradeAlertTbl, portfolioDataRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale, alertList[alertId].TradePoint, alertList[alertId].OnDateTime, msg); } } application.DbAccess.UpdateData(tradeAlertTbl); }
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) { 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(); } }