/// <summary> /// 爆仓准备 /// </summary> /// <param name="t">要爆仓的用户</param> /// <returns>true表示保证率满足要求,false表示保证率不满足要求</returns> public bool Blast(Trader t) { //撤单 while (t.GetMaintainRatio(m) < preBlastThreshold)//true保证率>1,false|保证率依旧<1 { var couldRedo = AutoRedo(t); if (!couldRedo) { break; } } //保证金自动转入 if (t.GetMaintainRatio(m) < preBlastThreshold) { if (t.IsAutoAddBailFromCache) { var delta = t.GetMaintain(m) * 1.1m - t.Account.BailAccount.Sum; if (t.Account.CacheAccount.CnyAccount.Sum <= 100) { delta = t.Account.CacheAccount.CnyAccount.Sum; } var r = TraderService.OperateAddBailFromCache(t, delta, null); Blaster.Log.Info(string.Format("保证金转入:{0}-金额{1}-自动转入{2}-转入结果{3}", t.Name, delta, t.IsAutoAddBailFromCache, r)); } } var rrr = t.GetMaintainRatio(m) >= preBlastThreshold; return(rrr); }
/// <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); } } }