/// <summary> /// 成交挂单 /// </summary> /// <param name="filledOrder"></param> /// <param name="newOrder"></param> private void CurrentOrderFilled(Order filledOrder, Order newOrder) { var trade = TradeOrder(newOrder); if (trade.result && !string.IsNullOrEmpty(trade.order_id)) { #region 反向挂单成功,处理缓存 newOrder.order_id = trade.order_id; newOrder.create_date = Utils.GetUtcTimeDec(); robotSession.AddUpdateSessionOrder(newOrder); filledOrder.status = "2"; robotSession.RemoveSessionOrder(filledOrder); #endregion #region 统计震荡 if (filledOrder.type == "buy")//买成交,行情下降 { info.dealDCount += 1; //info.DownCount_tmp += 1; info.floatPrice -= info.SpanPrice; } else//卖成交,行情上升 { info.dealUCount += 1; //info.UpCount_tmp += 1; info.floatPrice += info.SpanPrice; } long shockCount = Math.Min(info.dealDCount, info.dealUCount); if (info.dealCount != shockCount) { //string timeStr = DateTime.Now.ToString("yyyyMMddHHmmss"); info.ShockTimes.Add(Utils.GetUtcTimeDec()); info.dealCount = shockCount; } //int shockCount_tmp = Math.Min(info.DownCount_tmp, info.UpCount_tmp); //if (info.ShockCount_tmp != shockCount_tmp) //{ // info.ShockCount_tmp += 1; // //info.EarnAmt = info.EarnAmt + info.SpanPrice * info.TradeQty; //} #endregion #region log int buynum = robotSession.CountOrder(true); int sellnum = robotSession.CountOrder(false); string type = filledOrder.type == "sell" ? "+B" : "-S"; Log4NetUtility.Debug($"OrderFilled {type} [{newOrder.price.ToString("#0.00")}] ID: {Utils.ShortID(trade.order_id)} S:[{sellnum}] B:[{buynum}] "); #endregion } }
public string GetReport(HFTInfo info, Account account, Ticker ticker, bool hourFlag = false) { try { #region TimeSpan RunningTimeSpans = DateTime.Now - info.Open_Time; //string runningTime = string.Format("{0} {1}:{2}:{3}", RunningTimeSpans.Days, RunningTimeSpans.Hours, RunningTimeSpans.Minutes, RunningTimeSpans.Seconds); string runningTime = RunningTimeSpans.ToString(@"d\ hh\:mm\:ss"); decimal net = account.GetNet(info.Symbol, ticker.last); if (info.Open_Fund == 0) { info.Open_Fund = net; } decimal total_Earn = net - info.Open_Fund; //decimal realnet = net + info.total_fees; decimal realnet = net; decimal realEarn = realnet - info.Open_Fund; //资金基数 // decimal baseFund = info.TradeQty * (info.OrderQty + 2) * 2 * ticker.last; decimal baseFund = info.Open_Fund; //天数 decimal total_dates = (decimal)RunningTimeSpans.TotalDays; /*(decimal)(DateTime.Now - info.Open_Time).TotalMinutes / 1440m*/; decimal totalEarn_Ave_Daily = total_dates == 0 ? 0 : total_Earn / total_dates; decimal totalEarn_Rate_Daily = totalEarn_Ave_Daily / baseFund * 100; decimal totalEarn_Rate_Year = totalEarn_Rate_Daily * 365; decimal realEarn_Ave_Daily = total_dates == 0 ? 0 : realEarn / total_dates; decimal realEarn_Rate_Daily = realEarn_Ave_Daily / baseFund * 100; decimal realEarn_Rate_Year = realEarn_Rate_Daily * 365; decimal hour_realearn = realEarn - HourOpenEarn; decimal hour_averealearn = 0; if (HourOpenTimeSpans != TimeSpan.Zero) { double hour_minutes = (RunningTimeSpans - HourOpenTimeSpans).TotalMinutes; decimal running_hours = (decimal)hour_minutes / 60m; hour_averealearn = hour_realearn / running_hours * 24; } decimal hour_rate_daily = hour_averealearn / baseFund * 100; long hour_shockCount = info.dealCount - OpenShockCount; long hour_resetCount = info.resetCount - OpenResetCount; string hStr = "This"; if (hourFlag) { OpenShockCount = info.dealCount; OpenResetCount = info.resetCount; HourOpenEarn = realEarn; HourOpenTimeSpans = RunningTimeSpans; hStr = "Last"; } //当前币数 decimal coinCount = account.GetFreeCoin(info.Symbol) + account.GetFreezedCoin(info.Symbol); //decimal price_earn = (ticker.last - info.Open_Price) * coinCount; decimal trade_earn = (info.dealCount - 45 * info.resetCount) * info.TradeQty * info.SpanPrice; decimal price_earn = realEarn - trade_earn; decimal trade_earn_Ave_Daily = total_dates == 0 ? 0 : trade_earn / total_dates; decimal trade_earn_Rate_Daily = trade_earn_Ave_Daily / baseFund * 100; decimal trade_earn_Rate_Year = trade_earn_Rate_Daily * 365; //decimal reset_loss = price_earn + trade_earn - total_Earn - info.total_fees; int buy_num = robotSession.CountOrder(true); int sell_num = robotSession.CountOrder(false); #endregion #region StringBuilder sb = new StringBuilder(); sb.AppendLine(); if (hourFlag) { sb.AppendLine("*****************************************************************"); sb.AppendLine($"运行时间: {Utils.Format(runningTime)} 开盘价: {Utils.Format(info.Open_Price.ToString("#0.00"))} 当前价: {Utils.Format(ticker.last.ToString("#0.00"))}"); sb.AppendLine($"净资产: {Utils.Format(realnet.ToString("#0.00"))} 振幅: {Utils.Format(info.SpanPrice)}"); sb.AppendLine($"震荡: {Utils.Format(info.dealCount)} 平仓: {Utils.Format(info.resetCount)}"); sb.AppendLine($"小时震荡: {Utils.Format(hour_shockCount)} 小时平仓: {Utils.Format(hour_resetCount)}"); sb.AppendLine($"净盈利 : {Utils.Format("【" + realEarn.ToString("#0.0000") + "】")} 日盈利率: {Utils.Format(realEarn_Rate_Daily.ToString("#0.00") + "%")} 年化: {Utils.Format(realEarn_Rate_Year.ToString("#0.00") + "%")}"); //sb.AppendLine($"交易盈利: {Utils.Format("[" + trade_earn.ToString("#0.0000") + "]")} 日盈利率: {Utils.Format("[" + trade_earn_Rate_Daily.ToString("#0.00") + "%" + "]")} 年化: {Utils.Format(trade_earn_Rate_Year.ToString("#0.00") + "%")} "); //sb.AppendLine($"价格盈利: {Utils.Format("[" + price_earn.ToString("#0.0000") + "]")} 交易损失: {Utils.Format(info.total_fees.ToString("#0.0000"))}"); } sb.AppendLine("*****************************************************************"); sb.AppendLine($"RunTime: {Utils.Format(runningTime)} OpenPrice: {Utils.Format(info.Open_Price.ToString("#0.00"))} TickerPrice: {Utils.Format(ticker.last.ToString("#0.00"))}"); sb.AppendLine($"OpenFund: {Utils.Format(info.Open_Fund.ToString("0.0000"))} NetFund: {Utils.Format(net.ToString("0.0000"))} NetRealFund: {Utils.Format(realnet.ToString("0.0000"))}"); sb.AppendLine($"TradeQty: {Utils.Format(info.TradeQty)} SpanPrice: {Utils.Format(info.SpanPrice)} OrderQty: {Utils.Format(info.OrderQty)} FloatPrice: {Utils.Format(info.floatPrice.ToString("0.00"))}"); //sb.AppendLine($"FreeFund: {Utils.Format(account.GetFreeFund().ToString("0.0000"))} FreezedFund: {Utils.Format(account.GetFreezedFund().ToString("0.0000"))} FreeCoin: {Utils.Format(account.GetFreeCoin(info.Symbol).ToString("0.0000"))} FreezedCoin: {Utils.Format(account.GetFreezedCoin(info.Symbol).ToString("0.0000"))}"); //sb.AppendLine(); //sb.AppendLine($"{hStr}Hour: {Utils.Format(hour_realearn.ToString("#0.0000"))} HourEarnAve: {Utils.Format(hour_averealearn.ToString("#0.0000"))} HEarn_AveD: {Utils.Format(hour_rate_daily.ToString("#0.0000"))}"); sb.AppendLine($"HDealCount: {Utils.Format(hour_shockCount)} HResetCount: {Utils.Format(hour_resetCount)} DealCount: {Utils.Format(info.dealCount)} ResetCount: {Utils.Format(info.resetCount)}"); //sb.AppendLine(); sb.AppendLine($"Earn: {Utils.Format(total_Earn.ToString("#0.0000"))} RateDaily: {Utils.Format(totalEarn_Rate_Daily.ToString("#0.00") + "%")} RateYear: {Utils.Format(totalEarn_Rate_Year.ToString("#0.00") + "%")}"); //sb.AppendLine($"RealEarn: {Utils.Format("[" + realEarn.ToString("#0.0000") + "]")} RRateDaily: {Utils.Format("[" + realEarn_Rate_Daily.ToString("#0.00") + "%" + "]")} RRateYear: {Utils.Format(realEarn_Rate_Year.ToString("#0.00") + "%")}"); //sb.AppendLine($"TradeEarn: {Utils.Format("[" + trade_earn.ToString("#0.0000") + "]")} TRateDaily: {Utils.Format("[" + trade_earn_Rate_Daily.ToString("#0.00") + "%" + "]")} trade_earn_Rate_Year: {Utils.Format(trade_earn_Rate_Year.ToString("#0.00") + "%")} "); //sb.AppendLine($"PriceEarn: {Utils.Format("[" + price_earn.ToString("#0.0000") + "]")} TradeLoss: {Utils.Format(info.total_fees.ToString("#0.0000"))}"); report report = new report(); var LogOrders = robotSession.LogOrders(); sb.AppendLine(LogOrders); var DBOrdersInfostr = DBOrdersInfo(info.Open_Time, ticker, ref report); sb.AppendLine(DBOrdersInfostr); sb.AppendLine("*****************************************************************"); #region 保存数据库 if (true) { report.id = Utils.GetUtcTimeDec(); report.date = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); //report.Earn = total_Earn; report.NetFund = net; report.OpenFund = info.Open_Fund; report.OpenPrice = info.Open_Price; report.Open_Time = info.Open_Time; report.OrderQty = info.OrderQty; report.RateYear = totalEarn_Rate_Year; report.runningTime = runningTime; report.SpanPrice = info.SpanPrice; report.TickerPrice = ticker.last; report.TradeQty = info.TradeQty; report.type = "minReport"; report.HResetCount = hour_resetCount; report.DealCount = info.dealCount; report.ResetCount = info.resetCount; report.RealEarn = realEarn; report.HDealCount = hour_shockCount; report.LogOrders = LogOrders; report.DBOrdersInfo = DBOrdersInfostr; DbHelper.CreateInstance().AddReport(report); } #endregion return(sb.ToString()); #endregion } catch (Exception e) { Log4NetUtility.Error("GetReport", Utils.Exception2String(e)); DbHelper.CreateInstance().AddError("GetReport", e); return(null); } }