예제 #1
0
        public static double Theta(CallPutType cp,
                                   double spotPrice,
                                   double strikePrice,
                                   double interestRate,
                                   double volatility,
                                   double timeToExpiry,
                                   double costOfCarry)
        {
            double theta = 0.0;
            double d1    = (Math.Log(spotPrice / strikePrice) + (costOfCarry + volatility * volatility * 0.5) * timeToExpiry) / (volatility * Math.Sqrt(timeToExpiry));
            double d2    = d1 - volatility * Math.Sqrt(timeToExpiry);

            if (cp == CallPutType.Call)
            {
                theta = spotPrice * volatility * Math.Exp((costOfCarry - interestRate) * timeToExpiry) * StandardGaussianDensity(d1) / (2 * Math.Sqrt(timeToExpiry))
                        - (interestRate - costOfCarry) * spotPrice * Math.Exp((costOfCarry - interestRate) * timeToExpiry) * StandardGaussianProbability(d1)
                        + interestRate * strikePrice * Math.Exp((-interestRate * timeToExpiry) * StandardGaussianProbability(d2));
            }
            else
            {
                theta = spotPrice * volatility * Math.Exp((costOfCarry - interestRate) * timeToExpiry) * StandardGaussianDensity(d1) / (2 * Math.Sqrt(timeToExpiry))
                        + (interestRate - costOfCarry) * spotPrice * Math.Exp((costOfCarry - interestRate) * timeToExpiry) * StandardGaussianProbability(-d1)
                        - interestRate * strikePrice * Math.Exp((-interestRate * timeToExpiry) * StandardGaussianProbability(-d2));
            }

            return(theta / 252);
        }
예제 #2
0
        public static double NormalWarrantPrice(CallPutType cp, double underlyingPrice, double k, double interestRate, double vol, int t, double cr)
        {
            double price        = 0.0;
            double timeToExpiry = (t * 30.0) / GlobalVar.globalParameter.dayPerYear;

            price = BlackSholeFormula(cp, underlyingPrice, k, interestRate, vol, timeToExpiry, interestRate) * cr;
            return(price);
        }
예제 #3
0
        public static double BullBearWarrantPrice(CallPutType cp,
                                                  double underlyingPrice,
                                                  double resetR,
                                                  double interestR,
                                                  double vol,
                                                  int t,
                                                  double financialR,
                                                  double cr)
        {
            double price = 0.0;

            price = (cp == CallPutType.Call ? 1.0 : -1.0) * (underlyingPrice - Math.Round(underlyingPrice * resetR, 2)) * cr + Math.Round(underlyingPrice * resetR, 2) * t * (30.0 / GlobalVar.globalParameter.dayPerYear) * cr * financialR;
            price = RoundUp(price, 2);
            return(price);
        }
예제 #4
0
        public static double Delta(CallPutType cp,
                                   double spotPrice,
                                   double strikePrice,
                                   double interestRate,
                                   double volatility,
                                   double timeToExpiry,
                                   double costOfCarry)
        {
            double delta = 0.0;
            double d1    = (Math.Log(spotPrice / strikePrice) + (costOfCarry + volatility * volatility * 0.5) * timeToExpiry) / (volatility * Math.Sqrt(timeToExpiry));
            double d2    = d1 - volatility * Math.Sqrt(timeToExpiry);

            if (cp == CallPutType.Call)
            {
                delta = Math.Exp((costOfCarry - interestRate) * timeToExpiry) * StandardGaussianProbability(d1);
            }
            else
            {
                delta = Math.Exp((costOfCarry - interestRate) * timeToExpiry) * (StandardGaussianProbability(d1) - 1);
            }

            return(delta);
        }
예제 #5
0
        public static double BlackSholeFormula(CallPutType cp,
                                               double spotPrice,
                                               double strikePrice,
                                               double interestRate,
                                               double volatility,
                                               double timeToExpiry,
                                               double costOfCarry)
        {
            double bsprice = 0.0;

            double d1 = (Math.Log(spotPrice / strikePrice) + (costOfCarry + volatility * volatility * 0.5) * timeToExpiry) / (volatility * Math.Sqrt(timeToExpiry));
            double d2 = d1 - volatility * Math.Sqrt(timeToExpiry);

            if (cp == CallPutType.Call)
            {
                bsprice = spotPrice * Math.Exp((costOfCarry - interestRate) * timeToExpiry) * StandardGaussianProbability(d1) - strikePrice * Math.Exp(-1.0 * interestRate * timeToExpiry) * StandardGaussianProbability(d2);
            }
            else
            {
                bsprice = strikePrice * Math.Exp(-1.0 * interestRate * timeToExpiry) * StandardGaussianProbability(-1.0 * d2) - spotPrice * Math.Exp((costOfCarry - interestRate) * timeToExpiry) * StandardGaussianProbability(-1.0 * d1);
            }

            return(bsprice);
        }
예제 #6
0
        private void LoadData()
        {
            DataView dv = DeriLib.Util.ExecSqlQry(sql, GlobalVar.loginSet.edisSqlConnString);

            if (dv.Count > 0)
            {
                dt.Rows.Clear();
                foreach (DataRowView drv in dv)
                {
                    DataRow dr = dt.NewRow();

                    string      warrantType = drv["WarrantType"].ToString();
                    string      type        = "";
                    string      cp          = "";
                    CallPutType cpType      = CallPutType.Call;
                    double      financialR  = 0.0;

                    if (warrantType == "浮動重設認購權證")
                    {
                        type   = "重設型";
                        cp     = "C";
                        cpType = CallPutType.Call;
                    }
                    else if (warrantType == "浮動重設認售權證")
                    {
                        type   = "重設型";
                        cp     = "P";
                        cpType = CallPutType.Put;
                    }
                    else if (warrantType == "重設型牛證認購")
                    {
                        type       = "牛熊證";
                        cp         = "C";
                        cpType     = CallPutType.Call;
                        financialR = 5.0;
                    }
                    else if (warrantType == "重設型熊證認售")
                    {
                        type       = "牛熊證";
                        cp         = "P";
                        cpType     = CallPutType.Put;
                        financialR = 5.0;
                    }
                    else if (warrantType == "一般型認售權證")
                    {
                        type   = "一般型";
                        cp     = "P";
                        cpType = CallPutType.Put;
                    }
                    else
                    {
                        type   = "一般型";
                        cp     = "C";
                        cpType = CallPutType.Call;
                    }

                    double s        = Convert.ToDouble(drv["MPrice"]);
                    double k        = Convert.ToDouble(drv["K"]);
                    int    t        = Convert.ToInt32(drv["T"]);
                    double cr       = Convert.ToDouble(drv["exeRatio"]);
                    double hv       = Convert.ToDouble(drv["HV"]);
                    double iv       = Convert.ToDouble(drv["IV"]);
                    double resetR   = Convert.ToDouble(drv["ResetR"]);
                    double barrierR = Convert.ToDouble(drv["BarrierR"]);

                    DateTime issueDate    = Convert.ToDateTime(drv["IssueDate"]);
                    string   issueDateStr = issueDate.ToShortDateString();
                    DateTime expiry       = Convert.ToDateTime(drv["ExpiryDate"]);
                    string   expiryStr    = expiry.ToShortDateString();
                    double   price        = 0.0;
                    double   delta        = 0.0;

                    if (s != 0.0)
                    {
                        if (type == "牛熊證")
                        {
                            price = Pricing.BullBearWarrantPrice(cpType, s, (resetR / 100), GlobalVar.globalParameter.interestRate, (iv / 100), t, (financialR / 100), cr);
                        }
                        else if (type == "重設型")
                        {
                            price = Pricing.ResetWarrantPrice(cpType, s, (resetR / 100), GlobalVar.globalParameter.interestRate, (iv / 100), t, cr);
                        }
                        else
                        {
                            price = Pricing.NormalWarrantPrice(cpType, s, k, GlobalVar.globalParameter.interestRate, (iv / 100), t, cr);
                        }

                        if (warrantType == "牛熊證")
                        {
                            delta = 1.0;
                        }
                        else
                        {
                            delta = Pricing.Delta(cpType, s, k, GlobalVar.globalParameter.interestRate, (iv / 100), (t * 30.0) / GlobalVar.globalParameter.dayPerYear, GlobalVar.globalParameter.interestRate) * cr;
                        }
                    }

                    dr["標的代號"]  = drv["UnderlyingID"].ToString();
                    dr["標的名稱"]  = drv["UnderlyingName"].ToString();
                    dr["權證代號"]  = drv["WarrantID"].ToString();
                    dr["型態"]    = type;
                    dr["CP"]    = cp;
                    dr["S"]     = s;
                    dr["K"]     = k;
                    dr["T"]     = t;
                    dr["行使比例"]  = cr;
                    dr["HV"]    = hv;
                    dr["IV"]    = iv;
                    dr["重設比"]   = resetR;
                    dr["界限比"]   = barrierR;
                    dr["財務費用"]  = financialR;
                    dr["發行日"]   = issueDate;
                    dr["到期日"]   = expiry;
                    dr["今日理論價"] = Math.Round(price, 2);
                    dr["Delta"] = Math.Round(delta, 4);
                    dr["交易員"]   = drv["TraderID"].ToString().PadLeft(7, '0');

                    dt.Rows.Add(dr);
                }
            }
        }
예제 #7
0
        private void ultraGrid1_AfterCellUpdate(object sender, CellEventArgs e)
        {
            if (e.Cell.Column.Key != "交易員" && e.Cell.Column.Key != "權證名稱" && e.Cell.Column.Key != "發行價格" && e.Cell.Column.Key != "標的代號" && e.Cell.Column.Key != "市場" && e.Cell.Column.Key != "1500W")
            {
                double price = 0.0;

                double underlyingPrice = 0.0;
                underlyingPrice = e.Cell.Row.Cells["股價"].Value == DBNull.Value ? 0 : Convert.ToDouble(e.Cell.Row.Cells["股價"].Value);
                double k = 0.0;
                k = e.Cell.Row.Cells["履約價"].Value == DBNull.Value ? 0 : Convert.ToDouble(e.Cell.Row.Cells["履約價"].Value);
                int t = 0;
                t = e.Cell.Row.Cells["期間"].Value == DBNull.Value ? 0 : Convert.ToInt32(e.Cell.Row.Cells["期間"].Value);
                double cr = 0.0;
                cr = e.Cell.Row.Cells["行使比例"].Value == DBNull.Value ? 0 : Convert.ToDouble(e.Cell.Row.Cells["行使比例"].Value);
                double vol = 0.0;
                vol = e.Cell.Row.Cells["IV"].Value == DBNull.Value ? 0 : Convert.ToDouble(e.Cell.Row.Cells["IV"].Value) / 100;
                double resetR = 0.0;
                resetR = e.Cell.Row.Cells["重設比"].Value == DBNull.Value ? 0 : Convert.ToDouble(e.Cell.Row.Cells["重設比"].Value) / 100;
                double financialR = 0.0;
                financialR = e.Cell.Row.Cells["財務費用"].Value == DBNull.Value ? 0 : Convert.ToDouble(e.Cell.Row.Cells["財務費用"].Value) / 100;
                string warrantType = "一般型";
                warrantType = e.Cell.Row.Cells["類型"].Value == DBNull.Value ? "一般型" : e.Cell.Row.Cells["類型"].Value.ToString();
                string cpType = "C";
                cpType = e.Cell.Row.Cells["CP"].Value == DBNull.Value ? "C" : e.Cell.Row.Cells["CP"].Value.ToString();

                if (warrantType != "一般型" && warrantType != "牛熊證" && warrantType != "重設型")
                {
                    if (warrantType == "2")
                    {
                        warrantType = "牛熊證";
                    }
                    else if (warrantType == "3")
                    {
                        warrantType = "重設型";
                    }
                    else
                    {
                        warrantType = "一般型";
                    }
                }

                if (cpType != "C" && cpType != "P")
                {
                    if (cpType == "2")
                    {
                        cpType = "P";
                    }
                    else
                    {
                        cpType = "C";
                    }
                }

                CallPutType cp = CallPutType.Call;
                if (cpType == "P")
                {
                    cp = CallPutType.Put;
                }
                else
                {
                    cp = CallPutType.Call;
                }

                if (warrantType == "牛熊證")
                {
                    price = Pricing.BullBearWarrantPrice(cp, underlyingPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, financialR, cr);
                }
                else if (warrantType == "重設型")
                {
                    price = Pricing.ResetWarrantPrice(cp, underlyingPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, cr);
                }
                else
                {
                    price = Pricing.NormalWarrantPrice(cp, underlyingPrice, k, GlobalVar.globalParameter.interestRate, vol, t, cr);
                }

                /*e.Cell.Row.Cells["履約價"].Appearance.ForeColor = Color.Black;
                 * if (warrantType != "牛熊證") {
                 *  if (cpType == "C" && k / underlyingPrice >= 1.5) {
                 *      e.Cell.Row.Cells["履約價"].Appearance.ForeColor = Color.Red;
                 *  } else if (cpType == "P" && k / underlyingPrice <= 0.5) {
                 *      e.Cell.Row.Cells["履約價"].Appearance.ForeColor = Color.Red;
                 *  }
                 * }*/

                double shares = 0.0;
                shares = e.Cell.Row.Cells["張數"].Value == DBNull.Value ? 10000 : Convert.ToDouble(e.Cell.Row.Cells["張數"].Value);

                /*
                 * string is1500W = "N";
                 * is1500W = e.Cell.Row.Cells["1500W"].Value == DBNull.Value ? "N" : (string)e.Cell.Row.Cells["1500W"].Value;
                 * if (e.Cell.Column.Key == "1500W" && is1500W=="Y")
                 * {
                 *  double totalValue = 0.0;
                 *  totalValue = price * shares * 1000;
                 *  while (totalValue < 15000000)
                 *  {
                 *      vol += 0.01;
                 *      if (warrantType == "牛熊證")
                 *          price = Pricing.BullBearWarrantPrice(cp, underlyingPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, financialR, cr);
                 *      else if (warrantType == "重設型")
                 *          price = Pricing.ResetWarrantPrice(cp, underlyingPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, cr);
                 *      else
                 *          price = Pricing.NormalWarrantPrice(cp, underlyingPrice, k, GlobalVar.globalParameter.interestRate, vol, t, cr);
                 *      totalValue = price * shares * 1000;
                 *  }
                 *  e.Cell.Row.Cells["IV"].Value = Math.Round(vol * 100, 0);
                 * }
                 * */

                e.Cell.Row.Cells["發行價格"].Value = Math.Round(price, 2);
            }

            string is1500W = "N";

            is1500W = e.Cell.Row.Cells["1500W"].Value.ToString();
            if (e.Cell.Column.Key == "1500W")
            {
                if (is1500W == "N")
                {
                    e.Cell.Row.Cells["IV"].Value = e.Cell.Row.Cells["IVOri"].Value;
                }
            }
        }
예제 #8
0
        private void LoadData()
        {
            try {
                dt.Rows.Clear();
                string sql = @"SELECT  a.SerialNumber
                                      ,a.TraderID
	                                  ,b.WarrantName
	                                  ,a.UnderlyingID
                                      ,a.Apply1500W
	                                  ,b.Market
	                                  ,a.Type
	                                  ,a.CP
	                                  ,IsNull(c.MPrice,0) MPrice
                                      ,a.K
                                      ,a.T
                                      ,a.R
                                      ,a.HV
                                      ,CASE WHEN a.Apply1500W='Y' THEN a.IVNew ELSE a.IV END IVNew
                                      ,a.ResetR
                                      ,a.BarrierR
                                      ,a.FinancialR
                                      ,a.IssueNum
                                      ,b.EquivalentNum
                                      ,b.Result
                                      ,a.IV
                                      ,CASE WHEN a.CP='C' THEN d.Reason ELSE d.ReasonP END Reason
                                  FROM [EDIS].[dbo].[ApplyOfficial] a
                                  LEFT JOIN [EDIS].[dbo].[ApplyTotalList] b ON a.SerialNumber=b.SerialNum
                                  LEFT JOIN [EDIS].[dbo].[WarrantPrices] c on a.UnderlyingID=c.CommodityID
                                left join Underlying_TraderIssue d on a.UnderlyingID=d.UID 
                                  ORDER BY b.Market desc, a.Type, a.CP, a.UnderlyingID, a.SerialNumber"; //or (a.UnderlyingID = 'IX0001' and d.UID ='TWA00')

                DataView dv = DeriLib.Util.ExecSqlQry(sql, GlobalVar.loginSet.edisSqlConnString);

                foreach (DataRowView drv in dv)
                {
                    DataRow dr = dt.NewRow();

                    dr["序號"]    = drv["SerialNumber"].ToString();
                    dr["交易員"]   = drv["TraderID"].ToString().TrimStart('0');
                    dr["權證名稱"]  = drv["WarrantName"].ToString();
                    dr["標的代號"]  = drv["UnderlyingID"].ToString();
                    dr["1500W"] = drv["Apply1500W"].ToString();
                    dr["市場"]    = drv["Market"].ToString();
                    dr["張數"]    = drv["IssueNum"];
                    dr["約當張數"]  = drv["EquivalentNum"];
                    dr["額度結果"]  = drv["Result"];
                    dr["IVOri"] = drv["IV"];

                    double underlyingPrice = 0.0;
                    underlyingPrice = Convert.ToDouble(drv["MPrice"]);
                    dr["股價"]        = underlyingPrice;
                    double k = Convert.ToDouble(drv["K"]);
                    dr["履約價"] = k;
                    int t = Convert.ToInt32(drv["T"]);
                    dr["期間"] = t;
                    double cr = Convert.ToDouble(drv["R"]);
                    dr["行使比例"] = cr;
                    dr["HV"]   = Convert.ToDouble(drv["HV"]);
                    double vol = Convert.ToDouble(drv["IVNew"]) / 100;
                    dr["IV"] = Convert.ToDouble(drv["IVNew"]);

                    double resetR = Convert.ToDouble(drv["ResetR"]) / 100;
                    dr["重設比"] = Convert.ToDouble(drv["ResetR"]);
                    //double barrierR = Convert.ToDouble(drv["BarrierR"]);
                    dr["界限比"] = Convert.ToDouble(drv["BarrierR"]);
                    double financialR = Convert.ToDouble(drv["FinancialR"]) / 100;
                    dr["財務費用"] = Convert.ToDouble(drv["FinancialR"]);
                    string warrantType = drv["Type"].ToString();
                    dr["類型"] = warrantType;
                    CallPutType cp = drv["CP"].ToString() == "C" ? CallPutType.Call : CallPutType.Put;
                    dr["CP"]   = drv["CP"].ToString();
                    dr["發行原因"] = drv["Reason"] == DBNull.Value ? " " : reasonString[Convert.ToInt32(drv["Reason"])];

                    double price = 0.0;
                    if (underlyingPrice != 0)
                    {
                        if (warrantType == "牛熊證")
                        {
                            price = Pricing.BullBearWarrantPrice(cp, underlyingPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, financialR, cr);
                        }
                        else if (warrantType == "重設型")
                        {
                            price = Pricing.ResetWarrantPrice(cp, underlyingPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, cr);
                        }
                        else
                        {
                            price = Pricing.NormalWarrantPrice(cp, underlyingPrice, k, GlobalVar.globalParameter.interestRate, vol, t, cr);
                        }
                    }
                    dr["發行價格"] = Math.Round(price, 2);

                    dt.Rows.Add(dr);
                }
            } catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }
예제 #9
0
        private void  證系統上傳檔ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string fileName = "D:\\權證發行_相關Excel\\上傳檔\\權證發行匯入檔.xls";

            Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
            Workbook workBook = null;

            try {
                string sql = @"SELECT a.UnderlyingID
	                                  ,c.TraderID
                                      ,a.WarrantName
                                      ,c.Type
                                      ,c.CP
                                      ,IsNull(b.MPrice,0) MPrice
                                      ,c.K
                                      ,c.ResetR
                                      ,c.BarrierR
                                      ,c.T
                                      ,a.CR
                                      ,c.HV
                                      ,c.IV
                                      ,a.IssueNum
                                      ,c.FinancialR
                                      ,a.UseReward
                                      ,c.Apply1500W
                                      ,c.SerialNumber
                                  FROM [EDIS].[dbo].[ApplyTotalList] a
                                  LEFT JOIN [EDIS].[dbo].[WarrantPrices] b ON a.UnderlyingID=b.CommodityID
                                  LEFT JOIN [EDIS].[dbo].[ApplyOfficial] c ON a.SerialNum=c.SerialNumber
                                  WHERE a.ApplyKind='1' AND a.Result+0.00001 >= a.EquivalentNum
                                  ORDER BY a.Market desc, a.Type, a.CP, a.UnderlyingID, a.SerialNum"; //a.SerialNum
                //DataView dv = DeriLib.Util.ExecSqlQry(sql, GlobalVar.loginSet.edisSqlConnString);
                System.Data.DataTable dv = MSSQL.ExecSqlQry(sql, GlobalVar.loginSet.edisSqlConnString);

                if (dv.Rows.Count > 0)
                {
                    int i = 3;
                    app.Visible = true;
                    workBook    = app.Workbooks.Open(fileName);
                    //workBook.EnvelopeVisible = false;
                    Worksheet workSheet = (Worksheet)workBook.Sheets[1];
                    workSheet.get_Range("A3:BZ1000").ClearContents();
                    //workSheet.UsedRange.

                    foreach (DataRow dr in dv.Rows)
                    {
                        string date         = DateTime.Today.ToString("yyyyMMdd");
                        string underlyingID = dr["UnderlyingID"].ToString();
                        string traderID     = dr["TraderID"].ToString().TrimStart('0');
                        if (traderID == "10120" || traderID == "10329")
                        {
                            traderID = "7643";
                        }
                        string warrantName = dr["WarrantName"].ToString();
                        string type        = dr["Type"].ToString();
                        string cp          = dr["CP"].ToString();
                        string isReset     = "N";
                        if (type == "重設型" || type == "牛熊證")
                        {
                            isReset = "Y";
                        }
                        double stockPrice = Convert.ToDouble(dr["MPrice"]);
                        double k          = Convert.ToDouble(dr["K"]);
                        double resetR     = Convert.ToDouble(dr["ResetR"]);
                        double barrierR   = Convert.ToDouble(dr["BarrierR"]);
                        if (isReset == "Y")
                        {
                            k = Math.Round(resetR / 100 * stockPrice, 2);
                        }
                        double barrierP = Math.Round(barrierR / 100 * stockPrice, 2);
                        if (type == "牛熊證")
                        {
                            if (cp == "C")
                            {
                                barrierP = Math.Round(Math.Floor(barrierR * stockPrice) / 100, 2);
                            }
                            else if (cp == "P")
                            {
                                barrierP = Math.Round(Math.Ceiling(barrierR * stockPrice) / 100, 2);
                            }
                        }

                        //Check for moneyness constraint
                        if (type != "牛熊證")
                        {
                            if ((cp == "C" && k / stockPrice >= 1.5) || (cp == "P" && k / stockPrice <= 0.5))
                            {
                                MessageBox.Show(warrantName + " 超過價外50%限制");
                                // continue;
                            }
                        }

                        int    t          = Convert.ToInt32(dr["T"]);
                        double cr         = Convert.ToDouble(dr["CR"]);
                        double r          = GlobalVar.globalParameter.interestRate * 100;
                        double hv         = Convert.ToDouble(dr["HV"]);
                        double iv         = Convert.ToDouble(dr["IV"]);
                        double issueNum   = Convert.ToDouble(dr["IssueNum"]);
                        double price      = 0.0;
                        double financialR = Convert.ToDouble(dr["FinancialR"]);
                        string isReward   = dr["UseReward"].ToString();

                        string is1500W   = dr["Apply1500W"].ToString();
                        string serialNum = dr["SerialNumber"].ToString();
                        double p         = 0.0;
                        double vol       = iv / 100;
                        if (is1500W == "Y")
                        {
                            CallPutType cpType = CallPutType.Call;
                            if (cp == "P")
                            {
                                cpType = CallPutType.Put;
                            }

                            if (type == "牛熊證")
                            {
                                p = Pricing.BullBearWarrantPrice(cpType, stockPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, financialR, cr);
                            }
                            else if (type == "重設型")
                            {
                                p = Pricing.ResetWarrantPrice(cpType, stockPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, cr);
                            }
                            else
                            {
                                p = Pricing.NormalWarrantPrice(cpType, stockPrice, k, GlobalVar.globalParameter.interestRate, vol, t, cr);
                            }

                            double totalValue     = p * issueNum * 1000;
                            double volUpperLimmit = vol * 2;
                            while (totalValue < 15000000 && vol < volUpperLimmit)
                            {
                                vol += 0.01;
                                if (type == "牛熊證")
                                {
                                    p = Pricing.BullBearWarrantPrice(cpType, stockPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, financialR, cr);
                                }
                                else if (type == "重設型")
                                {
                                    p = Pricing.ResetWarrantPrice(cpType, stockPrice, resetR, GlobalVar.globalParameter.interestRate, vol, t, cr);
                                }
                                else
                                {
                                    p = Pricing.NormalWarrantPrice(cpType, stockPrice, k, GlobalVar.globalParameter.interestRate, vol, t, cr);
                                }
                                totalValue = p * issueNum * 1000;
                            }

                            if (vol < volUpperLimmit)
                            {
                                iv = vol * 100;
                                string cmdText = "UPDATE [ApplyOfficial] SET IVNew=@IVNew WHERE SerialNumber=@SerialNumber";
                                List <System.Data.SqlClient.SqlParameter> pars = new List <System.Data.SqlClient.SqlParameter>();
                                pars.Add(new SqlParameter("@IVNew", SqlDbType.Float));
                                pars.Add(new SqlParameter("@SerialNumber", SqlDbType.VarChar));

                                SQLCommandHelper h = new SQLCommandHelper(GlobalVar.loginSet.edisSqlConnString, cmdText, pars);

                                h.SetParameterValue("@IVNew", iv);
                                h.SetParameterValue("@SerialNumber", serialNum);
                                h.ExecuteCommand();
                                h.Dispose();
                            }
                        }

                        if (type == "重設型")
                        {
                            type = "一般型";
                        }
                        if (cp == "P")
                        {
                            cp = "認售";
                        }
                        else
                        {
                            cp = "認購";
                        }
                        try {
                            // workSheet.Cells[1][i] = date;
                            workSheet.get_Range("A" + i.ToString(), "A" + i.ToString()).Value = date;
                            workSheet.get_Range("B" + i.ToString(), "B" + i.ToString()).Value = underlyingID;
                            workSheet.get_Range("C" + i.ToString(), "C" + i.ToString()).Value = traderID;
                            workSheet.get_Range("D" + i.ToString(), "D" + i.ToString()).Value = warrantName;
                            workSheet.get_Range("E" + i.ToString(), "E" + i.ToString()).Value = type;
                            workSheet.get_Range("F" + i.ToString(), "F" + i.ToString()).Value = cp;
                            workSheet.get_Range("G" + i.ToString(), "G" + i.ToString()).Value = isReset;
                            workSheet.get_Range("H" + i.ToString(), "H" + i.ToString()).Value = stockPrice;
                            workSheet.get_Range("I" + i.ToString(), "I" + i.ToString()).Value = k;
                            workSheet.get_Range("J" + i.ToString(), "J" + i.ToString()).Value = resetR;
                            workSheet.get_Range("K" + i.ToString(), "K" + i.ToString()).Value = barrierP;
                            workSheet.get_Range("L" + i.ToString(), "L" + i.ToString()).Value = barrierR;
                            workSheet.get_Range("M" + i.ToString(), "M" + i.ToString()).Value = t;
                            workSheet.get_Range("N" + i.ToString(), "N" + i.ToString()).Value = cr;
                            workSheet.get_Range("O" + i.ToString(), "O" + i.ToString()).Value = r;
                            workSheet.get_Range("P" + i.ToString(), "P" + i.ToString()).Value = hv;
                            workSheet.get_Range("Q" + i.ToString(), "Q" + i.ToString()).Value = iv;
                            workSheet.get_Range("R" + i.ToString(), "R" + i.ToString()).Value = issueNum;
                            workSheet.get_Range("S" + i.ToString(), "S" + i.ToString()).Value = price;
                            workSheet.get_Range("T" + i.ToString(), "T" + i.ToString()).Value = financialR;
                            workSheet.get_Range("Y" + i.ToString(), "Y" + i.ToString()).Value = isReward;
                            i++;
                        } catch (Exception ex) {
                            MessageBox.Show("write" + ex.Message);
                        }
                    }

                    string sql2 = "SELECT [UnderlyingID] FROM [EDIS].[dbo].[ApplyOfficial] as A "
                                  + " left join (Select CS8010, count(1) as count from [10.19.1.20].[VOLDB].[dbo].[ED_RelationUnderlying] "
                                  + $" where RecordDate = (select top 1 RecordDate from [10.19.1.20].[VOLDB].[dbo].[ED_RelationUnderlying])"
                                  + " group by CS8010) as B on A.UnderlyingID = B.CS8010 "
                                  + " left join (SELECT stkid, MAX([IssueVol]) as MAX, min(IssueVol) as min FROM[10.19.1.20].[EDIS].[dbo].[WARRANTS]"
                                  + " where kgiwrt = '他家' and marketdate <= GETDATE() and lasttradedate >= GETDATE() and IssueVol<> 0 "
                                  + " group by stkid ) as C on A.UnderlyingID = C.stkid "
                                  + " WHERE B.count > 0 and (((IVNew > C.MAX or IVNew < C.min) and Apply1500W = 'Y') or ((IV > C.MAX or IV < C.min) and Apply1500W = 'N'))";
                    System.Data.DataTable badParam = MSSQL.ExecSqlQry(sql2, GlobalVar.loginSet.edisSqlConnString);
                    foreach (DataRow Row in badParam.Rows)
                    {
                        //WindowState = FormWindowState.Minimized;
                        //Show();
                        //WindowState = FormWindowState.Normal;
                        Activate();
                        MessageBox.Show(Row["UnderlyingID"] + " 為關係人標的,波動度超過可發範圍,會被稽核該該叫,請修改條件。");
                    }

                    GlobalUtility.LogInfo("Log", GlobalVar.globalParameter.userID + "產發行上傳檔");
                    app.Visible = false;
                    MessageBox.Show("發行上傳檔完成!");
                }
                else
                {
                    MessageBox.Show("無可發行權證");
                }
            } catch (Exception ex) {
                MessageBox.Show(ex.Message);
            } finally {
                if (workBook != null)
                {
                    workBook.Save();
                    workBook.Close();
                }
                if (app != null)
                {
                    app.Quit();
                }
            }
        }