Exemple #1
0
 //行权
 void Execute(PositionSummary up, Trader ts, decimal exeBasePrice, bool isManual = false)
 {
     up.Contract.IsNotInUse = true;
     //if (up.Order == null) return;
     if (!isManual)
     {
         if (up.Contract.ExcuteTime.Date != DateTime.Now.Date)
         {
             return;
         }
     }
     if (up.Contract.OptionType == OptionType.认购期权)  //认购期权:跌了不行权
     {
         if (exeBasePrice > up.Contract.ExcutePrice) //涨了
         {
             var d = exeBasePrice - up.Contract.ExcutePrice;
             var t = d * up.Count * up.Contract.CoinCount;
             if (up.PositionType == "权利仓")          //权利方
             {
                 ts.Account.BailAccount.Collect(t); //收钱
                 handler.SaveRecord(ts, up.Contract, PositionType.权利仓, up.Count, exeBasePrice, true, t);
                 TraderService.OperateAccount(ts, t, AccountChangeType.行权划入, "系统操作", null, ts.Account.BailAccount.Total);
             }
             else//义务方
             {
                 ts.BailPay(t, ts.GetMarket(), null, AccountChangeType.行权划出);
                 handler.SaveRecord(ts, up.Contract, PositionType.义务仓, up.Count, exeBasePrice, false, t);
             }
         }
         else
         {
             if (up.PositionType == "权利仓")//权利方
             {
                 handler.SaveRecord(ts, up.Contract, PositionType.权利仓, up.Count, exeBasePrice, true, 0);
             }
             else//义务方
             {
                 handler.SaveRecord(ts, up.Contract, PositionType.义务仓, up.Count, exeBasePrice, false, 0);
             }
         }
     }
     else//认沽期权:涨了不行权
     {
         if (exeBasePrice < up.Contract.ExcutePrice)//跌了
         {
             var d = up.Contract.ExcutePrice - exeBasePrice;
             var t = d * up.Count * up.Contract.CoinCount;
             if (up.PositionType == "权利仓")          //权利方
             {
                 ts.Account.BailAccount.Collect(t); //收钱
                 handler.SaveRecord(ts, up.Contract, PositionType.权利仓, up.Count, exeBasePrice, true, t);
                 TraderService.OperateAccount(ts, t, AccountChangeType.行权划入, "系统操作", null, ts.Account.BailAccount.Total);
             }
             else//义务方
             {
                 ts.BailPay(t, ts.GetMarket(), null, AccountChangeType.行权划出);
                 handler.SaveRecord(ts, up.Contract, PositionType.义务仓, up.Count, exeBasePrice, false, t);
             }
         }
         else
         {
             if (up.PositionType == "权利仓")//权利方
             {
                 handler.SaveRecord(ts, up.Contract, PositionType.权利仓, up.Count, exeBasePrice, true, 0);
             }
             else//义务方
             {
                 handler.SaveRecord(ts, up.Contract, PositionType.义务仓, up.Count, exeBasePrice, false, 0);
             }
         }
     }
 }