protected override void DrawLegend(int barNumber, ChartProperty property) { int iDecimals = this.AxisY.Decimals; Rectangle cRectY = this.AxisY.AxisRectangle; IntPtr cOldFont = __cGDI.SelectFont(__cLegendFont); Size cFontMetrics = __cGDI.MeasureString("0"); __cGDI.BeginRopDraw(); List <ITrade> cTrades = __cTrades.GetTradeObject(barNumber); int iRow = 0, iCount = cTrades.Count; for (int i = 0; i < iCount; i++) { ITrade cTrade = cTrades[i]; ITradeOrder cEntry = cTrade.EntryOrder; string sEntryOrder = string.Format("#{0} {1,-10} {2} at {3} {4}", cEntry.Ticket, cEntry.Action, cEntry.Contracts, Math.Round(cEntry.Price, iDecimals), cEntry.Time.ToString("yyyy-MM-dd HH:mm:ss")); __cGDI.DrawRopString(sEntryOrder, this.ChartSetting.LegendColor, cRectY.X - (sEntryOrder.Length * cFontMetrics.Width) - 4, cRectY.Top + ((iRow++ *cFontMetrics.Height) + 2)); ITradeOrder cExit = cTrade.ExitOrder; if (cExit != null) { string sExitOrder = string.Format("#{0} {1,-10} {2} at {3} {4}", cExit.Ticket, cExit.Action, cExit.Contracts, Math.Round(cExit.Price, iDecimals), cExit.Time.ToString("yyyy-MM-dd HH:mm:ss")); __cGDI.DrawRopString(sExitOrder, this.ChartSetting.LegendColor, cRectY.X - (sExitOrder.Length * cFontMetrics.Width) - 4, cRectY.Top + ((iRow++ *cFontMetrics.Height) + 2)); } } __cGDI.EndRopDraw(); __cGDI.RemoveObject(__cGDI.SelectFont(cOldFont)); }
/// <summary> /// 建構子 /// </summary> /// <param name="tradeOrder">訂單資訊</param> /// <param name="symbolId">商品代號</param> /// <param name="type">回報類型</param> /// <param name="openTrades">開倉交易單列表</param> /// <param name="closeTrades">已平倉交易單列表</param> public ResponseEvent(ITradeOrder tradeOrder, string symbolId, ResponseType type, TradeList<ITrade> openTrades, List<ITrade> closeTrades) { __cTradeOrder = tradeOrder; __sSymbolId = symbolId; __cType = type; __cOpenTrades = openTrades; __cCloseTrades = closeTrades; }
/// <summary> /// 建構子 /// </summary> /// <param name="tradeOrder">訂單資訊</param> /// <param name="symbolId">商品代號</param> /// <param name="type">回報類型</param> /// <param name="openTrades">開倉交易單列表</param> /// <param name="closeTrades">已平倉交易單列表</param> /// <param name="latestHistoryCount">最近新增的歷史交易紀錄個數</param> public ResponseEvent(ITradeOrder tradeOrder, string symbolId, ResponseType type, TradeList <ITrade> openTrades, List <ITrade> closeTrades, int latestHistoryCount) { __cTradeOrder = tradeOrder; __sSymbolId = symbolId; __cType = type; __cOpenTrades = openTrades; __cCloseTrades = closeTrades; __iLatestHistoryCount = latestHistoryCount; __iLatestHistoryIndex = (__iLatestHistoryCount == 0) ? -1 : closeTrades.Count - latestHistoryCount; }
/// <summary> /// 計算所有傭金規則 /// </summary> /// <param name="order">ITradeOrder 介面</param> /// <returns>返回值: double[](0=佣金, 1=手續費)</returns> protected double[] CalculateCommissions(ITradeOrder order) { double[] dValues = new double[2]; if (__cCommissions != null) { int iCount = __cCommissions.Count; for (int i = 0; i < iCount; i++) { ICommission cCommission = __cCommissions[i]; int iIndex = ((int) cCommission.RuleType) - 128; //佣金起始為 128(減去 128 可得到陣列的索引值) dValues[iIndex] += cCommission.Calculate(order); } } return dValues; }
private void DrawTradeInfo(ITrade trade, AxisX axisX, ChartProperty property, IntPtr font, Rectangle4 layerRect, int top) { ITradeOrder cEntry = trade.EntryOrder; Point cPoint1 = new Point(axisX.ConvertBarNumberToWidth(cEntry.BarNumber).CenterPoint, top + this.AxisY.ConvertValueToHeight(cEntry.Price)); __cGDI.DrawString("▸", property.TradeSymbolColor, cPoint1.X - 7, cPoint1.Y - 7); DrawTradeName(cEntry.Name, font, property.ForeColor, cPoint1, true); ITradeOrder cExit = trade.ExitOrder; if (cExit != null) { Point cPoint2 = new Point(axisX.ConvertBarNumberToWidth(cExit.BarNumber).CenterPoint, top + this.AxisY.ConvertValueToHeight(cExit.Price)); __cGDI.DrawString("◂", property.TradeSymbolColor, cPoint2.X + 1, cPoint2.Y - 7); DrawTradeName(cExit.Name, font, property.ForeColor, cPoint2, false); if (Boundary.BoundFix(ref cPoint1, ref cPoint2, layerRect)) { __cGDI.DrawLine(cPoint1.X, cPoint1.Y, cPoint2.X, cPoint2.Y); } } }
private void SignalObject_onTradeResponse(object sender, ResponseEvent e) { __cTradeService.AddResponse(e); if (__bShowTradeView) { if (GlobalSettings.Testing.AutoSwitchTradePage) { ITradeOrder cOrder = e.TradeOrder; switch (e.ResponseType) { case Zeghs.Orders.ResponseType.Trust: //委託回報 tabControl.BeginInvoke((MethodInvoker) delegate { tabControl.SelectedIndex = 0; }); break; case Zeghs.Orders.ResponseType.Deal: //成交回報 EOrderAction cAction = cOrder.Action; if (cAction == EOrderAction.Buy || cAction == EOrderAction.SellShort) { tabControl.BeginInvoke((MethodInvoker) delegate { tabControl.SelectedIndex = 1; }); } else { tabControl.BeginInvoke((MethodInvoker) delegate { tabControl.SelectedIndex = 2; }); } break; } } } }
internal _TradeInfo(ITradeOrder order, string symbolId, double profit = 0) { __cOrder = order; __sSymbolId = symbolId; __dProfit = Math.Round(profit, 2); }
internal _TradeInfo(ITrade trade, string symbolId) { __cTrade = trade; __cOrder = trade.EntryOrder; __sSymbolId = symbolId; }
/// <summary> /// 發送回報事件 /// </summary> /// <param name="order">下單資訊</param> /// <param name="symbolId">商品代號</param> /// <param name="type">回報類型</param> /// <param name="openTrades">開倉交易單列表</param> /// <param name="closeTrades">已平倉交易單列表</param> /// <param name="latestHistoryCount">最近新增的歷史交易紀錄個數</param> protected void OnResponse(ITradeOrder order, string symbolId, ResponseType type, TradeList<ITrade> openTrades = null, List<ITrade> closeTrades = null, int latestHistoryCount = 0) { if (onResponse != null) { onResponse(this, new ResponseEvent(order, symbolId, type, openTrades, closeTrades, latestHistoryCount)); } }
/// <summary> /// 計算佣金 /// </summary> /// <param name="order">交易訂單</param> /// <returns>返回值: 佣金</returns> public double Calculate(ITradeOrder order) { return(__dFee); }
private void TradeTimer_onElapsed(object sender, ElapsedEventArgs e) { bool bBusy = false; lock (__oLock) { bBusy = __bTradeBusy; if (!bBusy) { __bTradeBusy = true; } } if (!bBusy) { bool bUpdate = __cQueue.Count > 0; while (__cQueue.Count > 0) { ResponseEvent cResponse = null; lock (__cQueue) { cResponse = __cQueue.Dequeue(); } ResponseType cType = cResponse.ResponseType; if (cType == ResponseType.Update) { continue; } string sSymbolId = cResponse.SymbolId; ITradeOrder cOrder = cResponse.TradeOrder; string sTicket = cOrder.Ticket; switch (cType) { case ResponseType.Cancel: //取消委託 case ResponseType.Trust: //委託回報 if (cType == ResponseType.Cancel) { __cTrusts.Remove(sTicket); } else { if (cOrder.Contracts == 0) { __cTrusts.Remove(sTicket); } else { __cTrusts.Add(new _TradeInfo(cOrder, sSymbolId)); } } break; case ResponseType.Deal: //成交回報 EOrderAction cAction = cOrder.Action; if (cAction == EOrderAction.Buy || cAction == EOrderAction.SellShort) { TradeList <ITrade> cOpenTrades = cResponse.OpenTrades; if (cOpenTrades != null && cOpenTrades.Count > 0) { ITrade cTrade = cOpenTrades.GetTrade(sTicket); if (cTrade != null) { __cOpens.Add(new _TradeInfo(cTrade, sSymbolId)); } } } else { List <ITrade> cCloseTrades = cResponse.CloseTrades; int iHistoryCount = cResponse.LatestHistoryCount; if (iHistoryCount > 0) { int iHistoryIndex = cResponse.LatestHistoryIndex; if (iHistoryIndex > -1) { for (int i = 0; i < iHistoryCount; i++) { ITrade cTrade = cCloseTrades[iHistoryIndex + i]; __cCloses.Add(new _TradeInfo(cTrade.EntryOrder, sSymbolId, 0)); __cCloses.Add(new _TradeInfo(cTrade.ExitOrder, sSymbolId, cTrade.Profit)); if (cTrade.IsTradeClosed) { __cOpens.Remove(cTrade.Ticket); } } } } } break; } } if (bUpdate) { __cUpdateTimer.Start(); onUpdate(this, EventArgs.Empty); } lock (__oLock) { __bTradeBusy = false; } } }
/// <summary> /// 發送回報事件 /// </summary> /// <param name="order">下單資訊</param> /// <param name="symbolId">商品代號</param> /// <param name="type">回報類型</param> /// <param name="openTrades">開倉交易單列表</param> /// <param name="closeTrades">已平倉交易單列表</param> protected void OnResponse(ITradeOrder order, string symbolId, ResponseType type, TradeList<ITrade> openTrades = null, List<ITrade> closeTrades = null) { if (onResponse != null) { onResponse(this, new ResponseEvent(order, symbolId, type, openTrades, closeTrades)); } }
/// <summary> /// 計算所有傭金規則 /// </summary> /// <param name="order">ITradeOrder 介面</param> /// <returns>返回值: double[](0=佣金, 1=手續費)</returns> protected double[] CalculateCommissions(ITradeOrder order) { double[] dValues = new double[2]; if (__cCommissions != null) { int iCount = __cCommissions.Count; for (int i = 0; i < iCount; i++) { ICommission cCommission = __cCommissions[i]; int iIndex = ((int) cCommission.RuleType) - 128; //佣金起始為 128(減去 128 可得到陣列的索引值) dValues[iIndex] += cCommission.Calculate(order.Price, order.Contracts); } } return dValues; }