/// <summary> /// 成交后保证金操作:收款,付款,解冻 /// </summary> /// <param name="o"></param> /// <param name="count"></param> void MatchCache(Order o, int count) { o.Unfreeze(); if (o.IsCollect()) { bool r = TraderService.OperateAccount(o.Trader, o.DonePrice * o.DoneCount, AccountChangeType.保证金收款, "system", o); //if (r) { log.Info(string.Format("保证金收款成功,收款金额:{0}", o.DonePrice * o.DoneCount)); } } else { bool r = o.Trader.BailPay(o.DoneCount * o.DonePrice, m, o, AccountChangeType.保证金付款);// TraderService.BailPay(o.Trader, o.DoneCount * o.DonePrice, o); // if (r) { log.Info(string.Format("保证金付款成功,付款金额:{0}", o.DonePrice * o.DoneCount)); } } }
//TextLog log = new TextLog("jd.txt"); void HandleCache(SpotOrder so) { so.UnFreeze(); if (so.Direction == TradeDirectType.卖) { var ca = so.Trader.Account.CacheAccount.BtcAccount; //收款 TraderService.OperateAccount(so.Trader, so.DonePrice * so.DoneCount, AccountChangeType.现金收款, so.Trader.Name, null); TraderService.OperateAccount(so.Trader, so.DoneCount, AccountChangeType.BTC付款, so.Trader.Name, null); } else { TraderService.OperateAccount(so.Trader, so.DoneCount * so.DonePrice, AccountChangeType.现金付款, so.Trader.Name, null); TraderService.OperateAccount(so.Trader, so.DoneCount, AccountChangeType.BTC收款, so.Trader.Name, null); } }
/// <summary> /// 如果是平仓,直接支付;否则检查保证金是否足够 /// </summary> /// <param name="t"></param> /// <param name="delta"></param> /// <param name="m"></param> /// <param name="o"></param> /// <returns></returns> public static bool BailPay(this Trader t, decimal delta, Market m, Order o, AccountChangeType type) { lock (t.Account.BailAccount) { SystemAccount.Instance.Log.Info(string.Format("支付(可能借款):{0}-线程{1}-委托{2}", DateTime.Now.ToString("HH:mm:ss.fff"), Thread.CurrentThread.ManagedThreadId, o == null?"":o.Id.ToString())); if (o != null && o.OrderType == OrderType.平仓) { //系统借款记录处理 if (t.Account.BailAccount.Sum < delta) { var needed = delta * (TraderService.CommissionRatio + 1) - t.Account.BailAccount.Sum; var borrowResult = SystemAccount.Instance.Borrow(needed, o); } var r = t.Account.BailAccount.Sub(delta); TraderService.OperateAccount(t, delta, type, "system", o, t.Account.BailAccount.Total); return(r); } else { var maintain = GetMaintain(t, m); var remain = t.Account.BailAccount.Sum - maintain; if (t.Account.BailAccount.Sum < delta || remain < delta) { //执行保证金自动转入 var d1 = delta - t.Account.BailAccount.Sum; var d2 = delta - remain; var d = d1 >= d2 ? d1 : d2; var tr = TraderService.OperateAddBailFromCache(t, d, o); if (!tr) { return(false); } } var r = t.Account.BailAccount.Sub(delta);//划转保证金 TraderService.OperateAccount(t, delta, type, "system", o, t.Account.BailAccount.Total); return(r); } } }
public static void Unfreeze(this Order o) { if (o == null || o.Sign == null) { return; } lock (o.Sign) { if (o.IsNeedBailExceptMaintainBail()) { var c = o.GetSellOpenCountFrozen(); if (c > 0) { TraderService.OperateAccount(o.Trader, c, AccountChangeType.保证金解冻, "system", o); } if (o.State == OrderState.已撤销 || o.State == OrderState.已成交 || o.State == OrderState.已行权) { o.ClearSellOpenCount(); } } } }
public PartialViewResult AuditIt(AuditModel am) { ViewData["sysBank"] = GetSysBank(); if (ModelState.IsValid && IsTranPwd(am.code)) { var r = db.BankRecords.Where(a => a.Id == am.BrId).FirstOrDefault(); if (r == null) { ViewBag.msg = "无此编号的记录"; return(PartialView(am)); } if (r.IsApproved == true) { ViewBag.msg = "已审核"; return(PartialView(am)); } // if (r.BankRecordType == BankRecordType.提现 && r.coin == "BTC") { } else if (r.BankRecordType == BankRecordType.充值 && r.coin == "BTC") { if (!rech.BtcRecharge(r.AppUserName, r.Num, r.Address)) { ViewBag.msg = "不符合审核条件"; return(PartialView(am)); } } var sa = AddSysBankRecord(am); r.IsApproved = true; r.AuditTime = DateTime.Now; r.ActualDelta = am.ActualDelta; r.ApproveDesc = am.Desc; r.ApprovedResult = am.IsApproved; r.SysRecord = sa; var t = db.SaveChanges() > 0; if (!t) { ViewBag.msg = "审核失败"; return(PartialView(am)); } else { var u = MvcApplication.OptionService.Model.Traders.Where(a => a.Name == r.AppUserName).FirstOrDefault(); if (u != null) { if (r.ApprovedResult.Value)//审核通过 { TraderService.OperateAccount( u, r.ActualDelta, r.BankRecordType == BankRecordType.提现 && r.coin == "CNY" ? AccountChangeType.CNY提现 : (r.BankRecordType == BankRecordType.充值 && r.coin == "CNY" ? AccountChangeType.CNY充值 : (r.BankRecordType == BankRecordType.提现 && r.coin == "BTC" ? AccountChangeType.BTC提现 : AccountChangeType.BTC充值)), User.Identity.Name, null ); var user = db.Users.Where(a => a.UserName == u.Name).FirstOrDefault(); if (user != null) { string str = string.Format("您的比权网账户于{0}发生了一笔{2}操作,目前已到账,到账金额为 {1} 元,请注意查收。【比权网】", r.AuditTime, am.ActualDelta, r.BankRecordType.ToString()); qes.SendMassage2(user.PhoneNumber.ToString(), str); } } else //审核不通过 { if (r.BankRecordType == BankRecordType.提现 && r.coin == "CNY") { TraderService.OperateAccount(u, r.Delta, AccountChangeType.现金解冻, "system", null); } } } ViewBag.msg = "审核成功"; return(PartialView()); } } return(PartialView(am)); }
public OperationResult UpdateTrader(int traderId, TraderUpdateType type, object value) { return(Operate(() => { OperationResult r = null; var trader = Model.Traders.Where(a => a.Id == traderId).FirstOrDefault(); if (trader == null) { return new OperationResult(101, "无此用户"); } switch (type) { case TraderUpdateType.提现: case TraderUpdateType.充值: { if (!(value is decimal)) { return new OperationResult(301, "参数类型错误"); } var tv = (decimal)value; if (tv <= 0) { return new OperationResult(302, "充值提现事金额不能小于等于0"); } TraderService.OperateAccount(trader, tv, (AccountChangeType)(int)type, trader.Name, null); r = OperationResult.SuccessResult; } break; case TraderUpdateType.设置保证金自动转入: { if (!(value is bool)) { return new OperationResult(301, "参数类型错误"); } var sv = (bool)value; trader.IsAutoAddBailFromCache = sv; r = OperationResult.SuccessResult; } break; case TraderUpdateType.设置冻结用户: { if (!(value is bool)) { return new OperationResult(301, "参数类型错误"); } var sv = (bool)value; trader.IsFrozen = sv; r = OperationResult.SuccessResult; } break; case TraderUpdateType.设置自动买平: { if (!(value is bool)) { return new OperationResult(301, "参数类型错误"); } var sv = (bool)value; trader.IsAutoSellRight = sv; r = OperationResult.SuccessResult; } break; default: r = new OperationResult(303, "不允许此种类型的操作"); break; } return r; })); }
public void Execute(SpotOrder o) { TraderService.OperateAccount(o.Trader, Count * Ratio, ChangeType, o.Trader.Name + o.Id + "-" + o.Price, null); }
//行权 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); } } } }