//行权 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); } } } }