public string GetSQL() { databases.baseDS.portfolioDataTable portfolioTbl = new databases.baseDS.portfolioDataTable(); databases.baseDS.tradeAlertDataTable tradeAlertTbl = new databases.baseDS.tradeAlertDataTable(); string condCmd = ""; condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.portfolioColumn.ColumnName + " IN (" + " SELECT " + portfolioTbl.codeColumn.ColumnName + " FROM " + portfolioTbl.TableName + " WHERE " + portfolioTbl.investorCodeColumn.ColumnName + "=N'" + commonClass.SysLibs.sysLoginCode + "'))"; if (dateRangeChk.Checked) { condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.onTimeColumn.ColumnName + " BETWEEN '" + common.system.ConvertToSQLDateString(dateRange.frDate, false) + "' AND '" + common.system.ConvertToSQLDateString(dateRange.toDate.AddDays(1).AddSeconds(-1), false) + "')"; } if (statusChk.Checked) { condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.statusColumn.ColumnName + " & " + ((byte)statusCb.myValue).ToString() + ">0)"; } if (portfolioChk.Checked) { condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.portfolioColumn.ColumnName + "=N'" + portfolioCb.myValue + "')"; } if (strategyChk.Checked) { condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.strategyColumn.ColumnName + "=N'" + strategyCb.myValue + "')"; } if (timeScaleChk.Checked) { condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.timeScaleColumn.ColumnName + "='" + timeScaleCb.myValue.Code + "')"; } if (codeChk.Checked) { condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.stockCodeColumn.ColumnName + "=N'" + codeEd.Text.Trim() + "')"; } string sqlCmd = "SELECT * FROM " + tradeAlertTbl.TableName + (condCmd == "" ? "" : " WHERE " + condCmd) + " ORDER BY " + tradeAlertTbl.onTimeColumn.ColumnName + " DESC"; return(sqlCmd); }
public static databases.baseDS.tradeAlertDataTable GetTradeAlertSummaryOfLogin() { DateTime lastAlertDate = DataAccess.Libs.GetLastAlertTime(commonClass.SysLibs.sysLoginCode); databases.baseDS.tradeAlertDataTable tradeAlertTbl = DataAccess.Libs.GetTradeAlert(lastAlertDate, lastAlertDate, commonClass.SysLibs.sysLoginCode, (byte)common.CommonTypes.CommonStatus.All); return(MakeAlertSummary(tradeAlertTbl)); }
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 virtual void LoadData(bool force) { databases.baseDS.tradeAlertDataTable tradeAlertTbl = DataAccess.Libs.GetTradeAlert_BySQL(myAlertFilterForm.GetSQL()); for (int idx = 0; idx < tradeAlertTbl.Count; idx++) { if (tradeAlertTbl[idx].RowState == DataRowState.Deleted) { continue; } tradeAlertTbl[idx].msg = AppLibs.AlertMessageText(tradeAlertTbl[idx].msg, " "); } tradeAlertSource.DataSource = tradeAlertTbl; alertSummarySource.DataSource = AppLibs.MakeAlertSummary(tradeAlertSource.DataSource as databases.baseDS.tradeAlertDataTable); SetDataGrid(); ShowReccount(alertSummarySource.Count); }
//private static void SaveLastRunTime(DateTime onTime) //{ // StringCollection aFields = new StringCollection(); // StringCollection aValues = new StringCollection(); // aFields.Add(Configuration.configKeys.sysTradeAlertLastRun.ToString()); // aValues.Add(onTime.ToString()); // application.Configuration.SaveConfig(aFields, aValues); //} //withAplicableCheckInAlert = true : Sell alerts only create when user owned stock that is applible to sell /// <summary> /// Create alerts for all stock in portfolio and return number of alerts created /// </summary> /// <param name="alertList"> all alert resulted from analysis </param> private static int CreateTradeAlert(TradeAlertItem[] alertList) { int noAlertCreated = 0; string msg; StringCollection timeScaleList; databases.baseDS.tradeAlertRow tradeAlertRow; databases.baseDS.tradeAlertDataTable tradeAlertTbl = new databases.baseDS.tradeAlertDataTable(); //Watch list : sort by Stock code + Strategy code databases.baseDS.portfolioDetailDataTable watchlistTbl = databases.DbAccess.GetPortfolioDetail_ByType(new AppTypes.PortfolioTypes[] { AppTypes.PortfolioTypes.WatchList }); DataView watchlistView = new DataView(watchlistTbl); watchlistView.Sort = watchlistTbl.codeColumn.ColumnName + "," + watchlistTbl.subCodeColumn.ColumnName; //Portfolio : Sort by Stock code databases.tmpDS.investorStockDataTable investorStockTbl = new databases.tmpDS.investorStockDataTable(); databases.DbAccess.LoadStockOwnedByAll(investorStockTbl); DataView investorStockView = new DataView(investorStockTbl); investorStockView.Sort = investorStockTbl.stockCodeColumn.ColumnName; DataRowView[] foundRows; // Only create alerts for codes in user's watchlist. for (int alertId = 0; alertId < alertList.Length; alertId++) { databases.baseDS.portfolioDetailRow portfolioDetailRow; //=============================================== // Check if alert's strategy in user's wish list //=============================================== foundRows = watchlistView.FindRows(new object[] { alertList[alertId].StockCode, alertList[alertId].Strategy.Trim() }); for (int dataIdx = 0; dataIdx < foundRows.Length; dataIdx++) { // Check if alert's time scale in user's wish list ?? portfolioDetailRow = ((databases.baseDS.portfolioDetailRow)foundRows[dataIdx].Row); timeScaleList = common.MultiValueString.String2List(portfolioDetailRow.data.Trim()); if (!timeScaleList.Contains(alertList[alertId].TimeScale.Code)) { continue; } //Ignore duplicate alerts. tradeAlertRow = databases.DbAccess.GetOneAlert(alertList[alertId].OnDateTime, portfolioDetailRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale.Code, AppTypes.CommonStatus.All); if (tradeAlertRow != null) { 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 = Consts.constTextMergeMarkerLEFT + "price" + Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Price.ToString() + common.Consts.constCRLF + Consts.constTextMergeMarkerLEFT + "volume" + Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Volume.ToString() + common.Consts.constCRLF + Consts.constTextMergeMarkerLEFT + "marketInfo" + Consts.constTextMergeMarkerRIGHT + " : " + infoText + common.Consts.constCRLF; CreateTradeAlert(tradeAlertTbl, portfolioDetailRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale, alertList[alertId].TradePoint, alertList[alertId].OnDateTime, msg); noAlertCreated++; } //=============================================== // Create alerts for all codes in user's porfolio //=============================================== foundRows = investorStockView.FindRows(new object[] { alertList[alertId].StockCode }); for (int dataIdx = 0; dataIdx < foundRows.Length; dataIdx++) { // Check if alert's time scale in user's wish list ?? databases.tmpDS.investorStockRow investorStockRow = ((databases.tmpDS.investorStockRow)foundRows[dataIdx].Row); if (investorStockRow.qty == 0) { continue; } //Ignore duplicate alerts. tradeAlertRow = databases.DbAccess.GetOneAlert(alertList[alertId].OnDateTime, investorStockRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale.Code, AppTypes.CommonStatus.All); if (tradeAlertRow != null) { 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 = Consts.constTextMergeMarkerLEFT + "price" + Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Price.ToString() + common.Consts.constCRLF + Consts.constTextMergeMarkerLEFT + "volume" + Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Volume.ToString() + common.Consts.constCRLF + Consts.constTextMergeMarkerLEFT + "marketInfo" + Consts.constTextMergeMarkerRIGHT + " : " + infoText + common.Consts.constCRLF; msg += Consts.constTextMergeMarkerLEFT + "ownedQty" + Consts.constTextMergeMarkerRIGHT + " : " + investorStockRow.qty.ToString() + common.Consts.constCRLF; CreateTradeAlert(tradeAlertTbl, investorStockRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale, alertList[alertId].TradePoint, alertList[alertId].OnDateTime, msg); noAlertCreated++; } } databases.DbAccess.UpdateData(tradeAlertTbl); return(noAlertCreated); }
public static databases.baseDS.tradeAlertRow UpdateData(databases.baseDS.tradeAlertRow row) { try { lock (myClient) { databases.baseDS.tradeAlertDataTable tbl = new databases.baseDS.tradeAlertDataTable(); tbl.ImportRow(row); myClient.UpdateTradeAlert(ref tbl); row.AcceptChanges(); return tbl[0]; } } catch (Exception er) { if (OnError != null) OnError(er); } return null; }
public bool UpdateTradeAlert(ref databases.baseDS.tradeAlertDataTable tradeAlertTbl) { return(base.Channel.UpdateTradeAlert(ref tradeAlertTbl)); }
//private static void SaveLastRunTime(DateTime onTime) //{ // StringCollection aFields = new StringCollection(); // StringCollection aValues = new StringCollection(); // aFields.Add(Configuration.configKeys.sysTradeAlertLastRun.ToString()); // aValues.Add(onTime.ToString()); // application.Configuration.SaveConfig(aFields, aValues); //} //withAplicableCheckInAlert = true : Sell alerts only create when user owned stock that is applible to sell /// <summary> /// Create alerts for all stock in portfolio and return number of alerts created /// </summary> /// <param name="alertList"> all alert resulted from analysis </param> private static int CreateTradeAlert(TradeAlertItem[] alertList) { int noAlertCreated = 0; string msg; StringCollection timeScaleList; databases.baseDS.tradeAlertRow tradeAlertRow; databases.baseDS.tradeAlertDataTable tradeAlertTbl = new databases.baseDS.tradeAlertDataTable(); //Watch list : sort by Stock code + Strategy code databases.baseDS.portfolioDetailDataTable watchlistTbl = databases.DbAccess.GetPortfolioDetail_ByType(new AppTypes.PortfolioTypes[] { AppTypes.PortfolioTypes.WatchList}); DataView watchlistView = new DataView(watchlistTbl); watchlistView.Sort = watchlistTbl.codeColumn.ColumnName + "," + watchlistTbl.subCodeColumn.ColumnName; //Portfolio : Sort by Stock code databases.tmpDS.investorStockDataTable investorStockTbl = new databases.tmpDS.investorStockDataTable(); databases.DbAccess.LoadStockOwnedByAll(investorStockTbl); DataView investorStockView = new DataView(investorStockTbl); investorStockView.Sort = investorStockTbl.stockCodeColumn.ColumnName; DataRowView[] foundRows; // Only create alerts for codes in user's watchlist. for (int alertId = 0; alertId < alertList.Length; alertId++) { databases.baseDS.portfolioDetailRow portfolioDetailRow; //=============================================== // Check if alert's strategy in user's wish list //=============================================== foundRows = watchlistView.FindRows(new object[] { alertList[alertId].StockCode, alertList[alertId].Strategy.Trim() }); for (int dataIdx = 0; dataIdx < foundRows.Length; dataIdx++) { // Check if alert's time scale in user's wish list ?? portfolioDetailRow = ((databases.baseDS.portfolioDetailRow)foundRows[dataIdx].Row); timeScaleList = common.MultiValueString.String2List(portfolioDetailRow.data.Trim()); if (!timeScaleList.Contains(alertList[alertId].TimeScale.Code)) continue; //Ignore duplicate alerts. tradeAlertRow = databases.DbAccess.GetOneAlert(alertList[alertId].OnDateTime, portfolioDetailRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale.Code, AppTypes.CommonStatus.All); if (tradeAlertRow != null) 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 = Consts.constTextMergeMarkerLEFT + "price" + Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Price.ToString() + common.Consts.constCRLF + Consts.constTextMergeMarkerLEFT + "volume" + Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Volume.ToString() + common.Consts.constCRLF + Consts.constTextMergeMarkerLEFT + "marketInfo" + Consts.constTextMergeMarkerRIGHT + " : " + infoText + common.Consts.constCRLF; CreateTradeAlert(tradeAlertTbl, portfolioDetailRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale, alertList[alertId].TradePoint, alertList[alertId].OnDateTime, msg); noAlertCreated++; } //=============================================== // Create alerts for all codes in user's porfolio //=============================================== foundRows = investorStockView.FindRows(new object[] { alertList[alertId].StockCode }); for (int dataIdx = 0; dataIdx < foundRows.Length; dataIdx++) { // Check if alert's time scale in user's wish list ?? databases.tmpDS.investorStockRow investorStockRow = ((databases.tmpDS.investorStockRow)foundRows[dataIdx].Row); if (investorStockRow.qty == 0) continue; //Ignore duplicate alerts. tradeAlertRow = databases.DbAccess.GetOneAlert(alertList[alertId].OnDateTime, investorStockRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale.Code, AppTypes.CommonStatus.All); if (tradeAlertRow != null) 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 = Consts.constTextMergeMarkerLEFT + "price" + Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Price.ToString() + common.Consts.constCRLF + Consts.constTextMergeMarkerLEFT + "volume" + Consts.constTextMergeMarkerRIGHT + " : " + alertList[alertId].Volume.ToString() + common.Consts.constCRLF + Consts.constTextMergeMarkerLEFT + "marketInfo" + Consts.constTextMergeMarkerRIGHT + " : " + infoText + common.Consts.constCRLF; msg += Consts.constTextMergeMarkerLEFT + "ownedQty" + Consts.constTextMergeMarkerRIGHT + " : " + investorStockRow.qty.ToString() + common.Consts.constCRLF; CreateTradeAlert(tradeAlertTbl, investorStockRow.portfolio, alertList[alertId].StockCode, alertList[alertId].Strategy, alertList[alertId].TimeScale, alertList[alertId].TradePoint, alertList[alertId].OnDateTime, msg); noAlertCreated++; } } databases.DbAccess.UpdateData(tradeAlertTbl); return noAlertCreated; }
public databases.baseDS.tradeAlertDataTable GetTradeAlert_BySQL(string sql) { try { databases.baseDS.tradeAlertDataTable tbl = new databases.baseDS.tradeAlertDataTable(); databases.DbAccess.LoadFromSQL(tbl, sql); return tbl; } catch (Exception ex) { WriteSysLogLocal("WS051", ex); } return null; }
public string GetSQL() { databases.baseDS.portfolioDataTable portfolioTbl = new databases.baseDS.portfolioDataTable(); databases.baseDS.tradeAlertDataTable tradeAlertTbl = new databases.baseDS.tradeAlertDataTable(); string condCmd = ""; condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.portfolioColumn.ColumnName + " IN (" + " SELECT " + portfolioTbl.codeColumn.ColumnName + " FROM " + portfolioTbl.TableName + " WHERE " + portfolioTbl.investorCodeColumn.ColumnName + "=N'" + commonClass.SysLibs.sysLoginCode + "'))"; if (dateRangeChk.Checked) condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.onTimeColumn.ColumnName + " BETWEEN '" + common.system.ConvertToSQLDateString(dateRange.frDate,false) + "' AND '"+ common.system.ConvertToSQLDateString(dateRange.toDate.AddDays(1).AddSeconds(-1),false) + "')"; if (statusChk.Checked) condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.statusColumn.ColumnName + " & " + ((byte)statusCb.myValue).ToString() + ">0)"; if (portfolioChk.Checked) condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.portfolioColumn.ColumnName + "=N'" + portfolioCb.myValue + "')"; if (strategyChk.Checked) condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.strategyColumn.ColumnName + "=N'" + strategyCb.myValue + "')"; if (timeScaleChk.Checked) condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.timeScaleColumn.ColumnName + "='" + timeScaleCb.myValue.Code + "')"; if (codeChk.Checked) condCmd += (condCmd == "" ? "" : " AND ") + "(" + tradeAlertTbl.stockCodeColumn.ColumnName + "=N'" + codeEd.Text.Trim() + "')"; string sqlCmd = "SELECT * FROM " + tradeAlertTbl.TableName + (condCmd == "" ? "" : " WHERE " + condCmd) + " ORDER BY " + tradeAlertTbl.onTimeColumn.ColumnName + " DESC"; return sqlCmd; }
public static databases.baseDS.tradeAlertDataTable MakeAlertSummary(databases.baseDS.tradeAlertDataTable tbl) { SummaryItem buyCount, sellCount; databases.baseDS.tradeAlertRow sumRow; databases.baseDS.tradeAlertDataTable sumTbl = new databases.baseDS.tradeAlertDataTable(); sumTbl.DefaultView.Sort = sumTbl.onTimeColumn.ColumnName + "," + sumTbl.stockCodeColumn.ColumnName; DataRowView[] foundRows; common.DictionaryList buyCountList = new common.DictionaryList(); common.DictionaryList sellCountList = new common.DictionaryList(); object obj; //Sum for (int idx = 0; idx < tbl.Count; idx++) { foundRows = sumTbl.DefaultView.FindRows(new object[] { tbl[idx].onTime.Date, tbl[idx].stockCode }); if (foundRows.Length != 0) sumRow = (databases.baseDS.tradeAlertRow)foundRows[0].Row; else { sumRow = sumTbl.NewtradeAlertRow(); databases.AppLibs.InitData(sumRow); sumRow.onTime = tbl[idx].onTime.Date; sumRow.stockCode = tbl[idx].stockCode; sumTbl.AddtradeAlertRow(sumRow); } AppTypes.TradeActions action = (AppTypes.TradeActions)tbl[idx].tradeAction; switch (action) { case AppTypes.TradeActions.Buy: case AppTypes.TradeActions.Accumulate: obj = buyCountList.Find(sumRow.onTime.ToString() + sumRow.stockCode); if (obj == null) buyCount = new SummaryItem(sumRow.stockCode, sumRow.onTime); else buyCount = (SummaryItem)obj; buyCount.Qty++; buyCountList.Add(sumRow.onTime.ToString() + sumRow.stockCode, buyCount); break; case AppTypes.TradeActions.Sell: case AppTypes.TradeActions.ClearAll: obj = sellCountList.Find(sumRow.onTime.ToString() + sumRow.stockCode); if (obj == null) sellCount = new SummaryItem(sumRow.stockCode, sumRow.onTime); else sellCount = (SummaryItem)obj; sellCount.Qty++; sellCountList.Add(sumRow.onTime.Date.ToString() + sumRow.stockCode, sellCount); break; } } //Make summary message for (int idx = 0; idx < sumTbl.Count; idx++) { sumTbl[idx].msg = ""; obj = buyCountList.Find(sumTbl[idx].onTime.ToString() + sumTbl[idx].stockCode); if (obj != null) sumTbl[idx].msg += (sumTbl[idx].msg.Trim() != "" ? " , " : "") + (obj as SummaryItem).Qty.ToString() + " " + Languages.Libs.GetString("buyAlert"); obj = sellCountList.Find(sumTbl[idx].onTime.ToString() + sumTbl[idx].stockCode); if (obj != null) sumTbl[idx].msg += (sumTbl[idx].msg.Trim() != "" ? " , " : "") + (obj as SummaryItem).Qty.ToString() + " " + Languages.Libs.GetString("sellAlert"); } return sumTbl; }
public static databases.baseDS.tradeAlertDataTable MakeAlertSummary(databases.baseDS.tradeAlertDataTable tbl) { SummaryItem buyCount, sellCount; databases.baseDS.tradeAlertRow sumRow; databases.baseDS.tradeAlertDataTable sumTbl = new databases.baseDS.tradeAlertDataTable(); sumTbl.DefaultView.Sort = sumTbl.onTimeColumn.ColumnName + "," + sumTbl.stockCodeColumn.ColumnName; DataRowView[] foundRows; common.DictionaryList buyCountList = new common.DictionaryList(); common.DictionaryList sellCountList = new common.DictionaryList(); object obj; //Sum for (int idx = 0; idx < tbl.Count; idx++) { foundRows = sumTbl.DefaultView.FindRows(new object[] { tbl[idx].onTime.Date, tbl[idx].stockCode }); if (foundRows.Length != 0) { sumRow = (databases.baseDS.tradeAlertRow)foundRows[0].Row; } else { sumRow = sumTbl.NewtradeAlertRow(); databases.AppLibs.InitData(sumRow); sumRow.onTime = tbl[idx].onTime.Date; sumRow.stockCode = tbl[idx].stockCode; sumTbl.AddtradeAlertRow(sumRow); } AppTypes.TradeActions action = (AppTypes.TradeActions)tbl[idx].tradeAction; switch (action) { case AppTypes.TradeActions.Buy: case AppTypes.TradeActions.Accumulate: obj = buyCountList.Find(sumRow.onTime.ToString() + sumRow.stockCode); if (obj == null) { buyCount = new SummaryItem(sumRow.stockCode, sumRow.onTime); } else { buyCount = (SummaryItem)obj; } buyCount.Qty++; buyCountList.Add(sumRow.onTime.ToString() + sumRow.stockCode, buyCount); break; case AppTypes.TradeActions.Sell: case AppTypes.TradeActions.ClearAll: obj = sellCountList.Find(sumRow.onTime.ToString() + sumRow.stockCode); if (obj == null) { sellCount = new SummaryItem(sumRow.stockCode, sumRow.onTime); } else { sellCount = (SummaryItem)obj; } sellCount.Qty++; sellCountList.Add(sumRow.onTime.Date.ToString() + sumRow.stockCode, sellCount); break; } } //Make summary message for (int idx = 0; idx < sumTbl.Count; idx++) { sumTbl[idx].msg = ""; obj = buyCountList.Find(sumTbl[idx].onTime.ToString() + sumTbl[idx].stockCode); if (obj != null) { sumTbl[idx].msg += (sumTbl[idx].msg.Trim() != "" ? " , " : "") + (obj as SummaryItem).Qty.ToString() + " " + Languages.Libs.GetString("buyAlert"); } obj = sellCountList.Find(sumTbl[idx].onTime.ToString() + sumTbl[idx].stockCode); if (obj != null) { sumTbl[idx].msg += (sumTbl[idx].msg.Trim() != "" ? " , " : "") + (obj as SummaryItem).Qty.ToString() + " " + Languages.Libs.GetString("sellAlert"); } } return(sumTbl); }