예제 #1
0
 public static data.baseDS.investorStockRow UpdateData(data.baseDS.investorStockRow row)
 {
     data.baseDS.investorStockDataTable tbl = new data.baseDS.investorStockDataTable();
     tbl.ImportRow(row);
     myClient.UpdateInvestorStock(ref tbl);
     row.AcceptChanges();
     return(tbl[0]);
 }
예제 #2
0
        protected void LoadDetailData()
        {
            if (this.portfolioSource.Current == null) return;
            data.baseDS.portfolioRow portfolioRow = (data.baseDS.portfolioRow)((DataRowView)this.portfolioSource.Current).Row;

            //Investor stock
            investorStockSource.DataSource = DataAccess.Libs.GetOwnedStock(portfolioRow.code);
            data.baseDS.investorStockDataTable investorStockTbl = (investorStockSource.DataSource as data.baseDS.investorStockDataTable);
            for (int idx = 0; idx < investorStockTbl.Count; idx++)
            {
                if (investorStockTbl[idx].RowState == DataRowState.Deleted) continue;
            }
        }
예제 #3
0
        public static void LoadStockCode_ByPortfolios(data.tmpDS.stockCodeDataTable tbl, StringCollection portfolios)
        {
            data.baseDS.investorStockDataTable tmpTbl = new data.baseDS.investorStockDataTable();
            string cond = common.system.MakeConditionStr(portfolios, "b." + tmpTbl.portfolioColumn.ColumnName + "=N'", "'", "OR");

            if (cond.Trim() == "")
            {
                return;
            }

            tmpTbl.Dispose();

            string sqlCmd = "SELECT DISTINCT a.*" +
                            " FROM stockCode a" +
                            " INNER JOIN investorStock b ON a.code = b.stockCode" +
                            " WHERE " + cond;

            LoadFromSQL(tbl, sqlCmd);
        }
예제 #4
0
        public static bool GetOwnStock(string stockCode, string portfolio, int buySellInterval, DateTime sellDate,
                                       out decimal qty, out decimal buyAmt)
        {
            qty = 0; buyAmt = 0;
            data.baseDS.investorStockDataTable dataTbl = new data.baseDS.investorStockDataTable();
            DbAccess.LoadData(dataTbl, stockCode, portfolio);
            if (dataTbl.Count == 0)
            {
                return(false);
            }
            DateTime applicableDate = sellDate.AddDays(-Settings.sysStockSell2BuyInterval);

            for (int idx = 0; idx < dataTbl.Count; idx++)
            {
                if (dataTbl[idx].buyDate > applicableDate)
                {
                    continue;
                }
                qty    += dataTbl[idx].qty;
                buyAmt += dataTbl[idx].buyAmt;
            }
            return(true);
        }
예제 #5
0
        public static bool GetOwnStock(string stockCode, string portfolio, int buySellInterval, DateTime sellDate,
                                       out decimal qty, out decimal buyAmt)
        {
            data.baseDS.stockExchangeRow marketRow = AppLibs.GetStockExchange(stockCode);
            qty = 0; buyAmt = 0;
            data.baseDS.investorStockDataTable dataTbl = new data.baseDS.investorStockDataTable();
            LoadData(dataTbl, stockCode, portfolio);
            if (dataTbl.Count == 0)
            {
                return(false);
            }
            DateTime applicableDate = sellDate.AddDays(-marketRow.minBuySellDay);

            for (int idx = 0; idx < dataTbl.Count; idx++)
            {
                if (dataTbl[idx].buyDate > applicableDate)
                {
                    continue;
                }
                qty    += dataTbl[idx].qty;
                buyAmt += dataTbl[idx].buyAmt;
            }
            return(true);
        }
예제 #6
0
 public void UpdateInvestorStock(ref data.baseDS.investorStockDataTable tbl)
 {
     DbAccess.UpdateData(tbl);
 }
예제 #7
0
 public data.baseDS.investorStockDataTable GetOwnedStock(string portfolioCode)
 {
     data.baseDS.investorStockDataTable tbl = new data.baseDS.investorStockDataTable();
     DbAccess.LoadData(tbl, portfolioCode);
     return(tbl);
 }
예제 #8
0
 public static data.baseDS.investorStockRow UpdateData(data.baseDS.investorStockRow row)
 {
     data.baseDS.investorStockDataTable tbl = new data.baseDS.investorStockDataTable();
     tbl.ImportRow(row);
     myClient.UpdateInvestorStock(ref tbl);
     row.AcceptChanges();
     return tbl[0];
 }
예제 #9
0
 public data.baseDS.investorStockDataTable GetOwnedStock(string portfolioCode)
 {
     data.baseDS.investorStockDataTable tbl = new data.baseDS.investorStockDataTable();
     DbAccess.LoadData(tbl, portfolioCode);
     return tbl;
 }
예제 #10
0
 public static void LoadData(data.baseDS.investorStockDataTable tbl, string portfolioCode)
 {
     investorStockTA.ClearBeforeFill = false;
     investorStockTA.FillByPortfolio(tbl, portfolioCode);
 }
예제 #11
0
        /// <summary>
        ///  Create records to keep stock transaction (buy,sell...) 
        ///  - transactions
        ///  - investorStock
        /// </summary>
        /// <param name="onDate"></param>
        /// <param name="type"></param>
        /// <param name="stockCode"></param>
        /// <param name="portfolio"></param>
        /// <param name="qty"></param>
        /// <param name="amt"></param>
        public static data.baseDS.transactionsDataTable MakeTransaction(AppTypes.TradeActions type, string stockCode, string portfolioCode, int qty, decimal feePerc,out string errorText)
        {
            errorText="";
            data.baseDS.stockExchangeRow marketRow = GetStockExchange(stockCode);
            if (marketRow == null) return null;

            errorText="";
            DateTime onTime = DateTime.Now;
            //Price
            data.baseDS.priceDataRow priceRow = DbAccess.GetLastPriceData(stockCode);
            if (priceRow == null)
            {
                errorText = Languages.Libs.GetString("cannotDoTransaction");
                return null;
            }
            decimal amt = qty * priceRow.closePrice * marketRow.priceRatio;
            decimal feeAmt = (decimal)Math.Round(feePerc * amt / 100, Settings.sysPrecisionLocal);

            data.baseDS.portfolioRow portfolioRow = DbAccess.GetPortfolio(portfolioCode);
            if (portfolioRow == null)
            {
                errorText = String.Format(Languages.Libs.GetString("dataNotFound"), "[portfolio]");
                return null;
            }
            switch (type)
            {
                case AppTypes.TradeActions.Buy:
                case AppTypes.TradeActions.Accumulate:
                    portfolioRow.usedCapAmt += amt;
                    portfolioRow.usedCapAmt += feeAmt;
                    break;
                default: //Sell
                    portfolioRow.usedCapAmt -= amt;
                    portfolioRow.usedCapAmt += feeAmt;
                    break;
            }
            if (portfolioRow.startCapAmt - portfolioRow.usedCapAmt < 0)
            {
                portfolioRow.CancelEdit();
                errorText = String.Format(Languages.Libs.GetString("outOfMoney"), portfolioRow.startCapAmt - portfolioRow.usedCapAmt - amt - feeAmt);
                return null;
            }

            //Create records to store data 
            data.baseDS.transactionsDataTable transTbl = new data.baseDS.transactionsDataTable();
            data.baseDS.investorStockDataTable investorStockTbl = new data.baseDS.investorStockDataTable();
            data.baseDS.transactionsRow transRow;
            data.baseDS.investorStockRow stockRow;

            transRow = transTbl.NewtransactionsRow();
            commonClass.AppLibs.InitData(transRow);
            transRow.onTime = onTime;
            transRow.tranType = (byte)type;
            transRow.stockCode = stockCode;
            transRow.portfolio = portfolioCode;
            transRow.qty = qty;
            transRow.amt = amt;
            transRow.feeAmt = feeAmt;
            transRow.status = (byte)AppTypes.CommonStatus.Close;
            transTbl.AddtransactionsRow(transRow);

            //Update stock
            DateTime onDate = onTime.Date;
            switch (type)
            {
                case AppTypes.TradeActions.Buy:
                case AppTypes.TradeActions.Accumulate:
                    investorStockTbl.Clear();
                    DbAccess.LoadData(investorStockTbl, stockCode, portfolioCode, onDate);
                    if (investorStockTbl.Count == 0)
                    {
                        stockRow = investorStockTbl.NewinvestorStockRow();
                        commonClass.AppLibs.InitData(stockRow);
                        stockRow.buyDate = onDate;
                        stockRow.stockCode = stockCode;
                        stockRow.portfolio = portfolioCode;
                        investorStockTbl.AddinvestorStockRow(stockRow);
                    }
                    stockRow = investorStockTbl[0];
                    stockRow.qty += qty; stockRow.buyAmt += amt;
                    break;
                default: //Sell
                    DateTime applicableDate = onDate.AddDays(-marketRow.minBuySellDay);
                    investorStockTbl.Clear();
                    DbAccess.LoadData(investorStockTbl, stockCode, portfolioCode);
                    decimal remainQty = qty;
                    for (int idx = 0; idx < investorStockTbl.Count; idx++)
                    {
                        if (investorStockTbl[idx].buyDate > applicableDate) continue;
                        if (investorStockTbl[idx].qty >= remainQty)
                        {
                            investorStockTbl[idx].buyAmt = (investorStockTbl[idx].qty - remainQty) * (investorStockTbl[idx].qty == 0 ? 0 : investorStockTbl[idx].buyAmt / investorStockTbl[idx].qty);
                            investorStockTbl[idx].qty = (investorStockTbl[idx].qty - remainQty);
                            remainQty = 0;
                        }
                        else
                        {
                            remainQty -= investorStockTbl[idx].qty;
                            investorStockTbl[idx].buyAmt = 0;
                            investorStockTbl[idx].qty = 0;
                        }
                        if (remainQty == 0) break;
                    }
                    if (remainQty > 0)
                    {
                        errorText =  String.Format(Languages.Libs.GetString("outOfQty"), qty - remainQty);
                        return null;
                    }
                    break;
            }
            //Delete empty stock
            for (int idx = 0; idx < investorStockTbl.Count; idx++)
            {
                if (investorStockTbl[idx].qty != 0) continue;
                investorStockTbl[idx].Delete();
            }

            //Update data with transaction support
            TransactionScopeOption tranOption;
            tranOption = (commonClass.SysLibs.sysUseTransactionInUpdate ? TransactionScopeOption.Required : TransactionScopeOption.Suppress);
            using (TransactionScope scope = new TransactionScope(tranOption))
            {
                DbAccess.UpdateData(portfolioRow);
                DbAccess.UpdateData(investorStockTbl);
                DbAccess.UpdateData(transTbl);
                scope.Complete();
            }
            return transTbl;
        }
예제 #12
0
 public static void UpdateData(data.baseDS.investorStockDataTable tbl)
 {
     investorStockTA.Update(tbl);
     tbl.AcceptChanges();
 }
예제 #13
0
 public static void LoadStockByInvestor(data.baseDS.investorStockDataTable tbl, string investorCode)
 {
     investorStockTA.ClearBeforeFill = false;
     investorStockTA.FillByInvestor(tbl, investorCode);
 }
예제 #14
0
 public static void LoadData(data.baseDS.investorStockDataTable tbl, string stockCode, string portfolio, DateTime buyDate)
 {
     investorStockTA.ClearBeforeFill = false;
     investorStockTA.FillByPortfolioStockBuyDate(tbl, portfolio, stockCode, buyDate);
 }
예제 #15
0
        public static void LoadStockCode_ByPortfolios(data.tmpDS.stockCodeDataTable tbl, StringCollection portfolios)
        {
            data.baseDS.investorStockDataTable tmpTbl = new data.baseDS.investorStockDataTable();
            string cond = common.system.MakeConditionStr(portfolios, "b." + tmpTbl.portfolioColumn.ColumnName + "=N'", "'", "OR");
            if (cond.Trim() == "") return;

            tmpTbl.Dispose();

            string sqlCmd = "SELECT DISTINCT a.*" +
                            " FROM stockCode a" +
                            " INNER JOIN investorStock b ON a.code = b.stockCode"+
                            " WHERE " + cond;
            LoadFromSQL(tbl, sqlCmd);
        }
예제 #16
0
 public static bool GetOwnStock(string stockCode, string portfolio, int buySellInterval, DateTime sellDate,
                                out decimal qty, out decimal buyAmt)
 {
     data.baseDS.stockExchangeRow marketRow = AppLibs.GetStockExchange(stockCode);
     qty = 0; buyAmt = 0;
     data.baseDS.investorStockDataTable dataTbl = new data.baseDS.investorStockDataTable();
     LoadData(dataTbl, stockCode, portfolio);
     if (dataTbl.Count == 0) return false;
     DateTime applicableDate = sellDate.AddDays(-marketRow.minBuySellDay);
     for (int idx = 0; idx < dataTbl.Count; idx++)
     {
         if (dataTbl[idx].buyDate > applicableDate) continue;
         qty += dataTbl[idx].qty;
         buyAmt += dataTbl[idx].buyAmt;
     }
     return true;
 }
예제 #17
0
 public static bool GetOwnStock(string stockCode, string portfolio, int buySellInterval, DateTime sellDate,
                                       out decimal qty, out decimal buyAmt)
 {
     qty = 0; buyAmt = 0;
     data.baseDS.investorStockDataTable dataTbl = new data.baseDS.investorStockDataTable();
     DbAccess.LoadData(dataTbl, stockCode, portfolio);
     if (dataTbl.Count == 0) return false;
     DateTime applicableDate = sellDate.AddDays(-Settings.sysStockSell2BuyInterval);
     for (int idx = 0; idx < dataTbl.Count; idx++)
     {
         if (dataTbl[idx].buyDate > applicableDate) continue;
         qty += dataTbl[idx].qty;
         buyAmt += dataTbl[idx].buyAmt;
     }
     return true;
 }