public void CancelOrder(ref CThostFtdcOrderField pOrder) { if (null == m_pTdApi || IntPtr.Zero == m_pTdApi) { return; } TraderApi.TD_CancelOrder(m_pTdApi, ref pOrder); }
public void CancelOrder(ref CThostFtdcOrderField pOrder) { if (null == IntPtrKey || IntPtr.Zero == IntPtrKey) { return; } TraderApi.TD_CancelOrder(IntPtrKey, ref pOrder); }
private void OnRtnOrderLastStatus(GenericOrderItem item, CThostFtdcOrderField pOrder, string OrderSysID, string Key) { // 给成交回报用的,由于成交回报返回慢,所以不能删 //orderMap.OrderSysID_OrderRef.Remove(OrderSysID); // 已经是最后状态,不能用于撤单了 // 这个功能交给用户上层处理,报个重复撤单也没啥 //orderMap.OrderItem_OrderField.Remove(item); OnLastStatus(item, OrderSysID, Key); }
private void OnRspQryOrder_callback(object sender, ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { if (null != OnRspQryOrder) { try { OnRspQryOrder(this, new OnRspQryOrderArgs(ref pOrder, ref pRspInfo, nRequestID, bIsLast)); } catch (Exception ex) { MessageBox.Show("TraderApiWrapper::OnRspQryOrder_callback:" + ex.ToString()); } } }
public void OnRtnOrder(CThostFtdcOrderField pOrder) { Console.WriteLine("OnRtnOrder"); if (pOrder.OrderStatus == '1') { Console.WriteLine("PartTradedQueueing"); } else if (pOrder.OrderStatus == '2') { Console.WriteLine("PartTradedNotQueueing"); } else if (pOrder.OrderStatus == '5') { Console.WriteLine("Canceled"); } else { Console.WriteLine("Placed"); } }
private void CTPOnRtnOrder(ref CThostFtdcOrderField pOrder) { if (!IsLogin) { _rtnOrderTime = DateTime.Now; //登录前接收所有旧的 order } if (string.IsNullOrEmpty(pOrder.InstrumentID)) { return; } string id = string.Format("{0}|{1}|{2}", pOrder.SessionID, pOrder.FrontID, pOrder.OrderRef); //_dicLocalidSfrId.TryAdd(pOrder.OrderLocalID, id);//防止因此项未赋值,导致成交响应里无法更新 if (DicOrderField.TryAdd(id, new OrderField { Custom = (int)(long.TryParse(pOrder.OrderRef, out long tmp) ? tmp % 1000000 : 0), //修复: 值为null会导致界面显示错误 InsertTime = string.IsNullOrEmpty(pOrder.InsertTime) ? DateTime.Now.ToString("HH:mm:ss") : pOrder.InsertTime, InstrumentID = pOrder.InstrumentID, //SysID = string.Empty, //为null会导致界面显示错误 //TradeTime = string.Empty, IsLocal = pOrder.SessionID == _session, LimitPrice = pOrder.LimitPrice, OrderID = id, Volume = pOrder.VolumeTotalOriginal, VolumeLeft = pOrder.VolumeTotalOriginal, // pOrder->VolumeTotal; //f->VolumeLeft = pOrder->VolumeTotal; //由ontrade处理 Status = OrderStatus.Normal, StatusMsg = pOrder.StatusMsg, Direction = pOrder.Direction == TThostFtdcDirectionType.THOST_FTDC_D_Buy ? DirectionType.Buy : DirectionType.Sell, Hedge = (TThostFtdcHedgeFlagType)pOrder.CombHedgeFlag[0] == TThostFtdcHedgeFlagType.THOST_FTDC_HF_Speculation ? HedgeType.Speculation : (TThostFtdcHedgeFlagType)pOrder.CombHedgeFlag[0] == TThostFtdcHedgeFlagType.THOST_FTDC_HF_Arbitrage ? HedgeType.Arbitrage : HedgeType.Hedge, Offset = (TThostFtdcOffsetFlagType)pOrder.CombOffsetFlag[0] == TThostFtdcOffsetFlagType.THOST_FTDC_OF_Open ? OffsetType.Open : (TThostFtdcOffsetFlagType)pOrder.CombOffsetFlag[0] == TThostFtdcOffsetFlagType.THOST_FTDC_OF_CloseToday ? OffsetType.CloseToday : OffsetType.Close, })) //首次响应
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(CThostFtdcOrderField obj) { return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr); }
private void OnRspQryOrder_3(ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { OnRspQryOrder_1(this, ref pOrder, ref pRspInfo, nRequestID, bIsLast); }
private void OnRspQryOrder_3(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { OnRspQryOrder_1(this, pTraderApi, ref pOrder, ref pRspInfo, nRequestID, bIsLast); }
// 通过报单组合,实际的向交易所撤单 public bool TryGetValue(GenericOrderItem key, out CThostFtdcOrderField value) { return(OrderItem_OrderField.TryGetValue(key, out value)); }
private void OnRtnOrder(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder) { if (OutputLog) { Console.WriteLine("{0},{1},{2},开平{3},价{4},原量{5},成交{6},提交{7},状态{8},引用{9},{10}", pOrder.InsertTime, pOrder.InstrumentID, pOrder.Direction, pOrder.CombOffsetFlag, pOrder.LimitPrice, pOrder.VolumeTotalOriginal, pOrder.VolumeTraded, pOrder.OrderSubmitStatus, pOrder.OrderStatus, pOrder.OrderRef, pOrder.StatusMsg); } SingleOrder order; string strKey = string.Format("{0}:{1}:{2}", _RspUserLogin.FrontID, _RspUserLogin.SessionID, pOrder.OrderRef); if (_OrderRef2Order.TryGetValue(strKey, out order)) { order.Text = pOrder.StatusMsg; //找到对应的报单回应 Dictionary <string, CThostFtdcOrderField> _Ref2Action; if (!_Orders4Cancel.TryGetValue(order, out _Ref2Action)) { //没找到,自己填一个 _Ref2Action = new Dictionary <string, CThostFtdcOrderField>(); _Orders4Cancel[order] = _Ref2Action; } lock (_Ref2Action) { switch (pOrder.OrderStatus) { case TThostFtdcOrderStatusType.AllTraded: //已经是最后状态,不能用于撤单了 _Ref2Action.Remove(strKey); break; case TThostFtdcOrderStatusType.PartTradedQueueing: //只是部分成交,还可以撤单,所以要记录下来 _Ref2Action[strKey] = pOrder; break; case TThostFtdcOrderStatusType.PartTradedNotQueueing: //已经是最后状态,不能用于撤单了 _Ref2Action.Remove(strKey); break; case TThostFtdcOrderStatusType.NoTradeQueueing: if (0 == _Ref2Action.Count()) { EmitAccepted(order); } _Ref2Action[strKey] = pOrder; break; case TThostFtdcOrderStatusType.NoTradeNotQueueing: //已经是最后状态,不能用于撤单了 _Ref2Action.Remove(strKey); break; case TThostFtdcOrderStatusType.Canceled: //已经是最后状态,不能用于撤单了 _Ref2Action.Remove(strKey); //分析此报单是否结束,如果结束分析整个Order是否结束 switch (pOrder.OrderSubmitStatus) { case TThostFtdcOrderSubmitStatusType.InsertRejected: //如果是最后一个的状态,同意发出消息 if (0 == _Ref2Action.Count()) { EmitRejected(order, pOrder.StatusMsg); } else { Cancel(order); } break; default: //如果是最后一个的状态,同意发出消息 if (0 == _Ref2Action.Count()) { EmitCancelled(order); } else { Cancel(order); } break; } break; case TThostFtdcOrderStatusType.Unknown: switch (pOrder.OrderSubmitStatus) { case TThostFtdcOrderSubmitStatusType.InsertSubmitted: //新单,新加入记录以便撤单 if (0 == _Ref2Action.Count()) { EmitAccepted(order); } _Ref2Action[strKey] = pOrder; break; } break; case TThostFtdcOrderStatusType.NotTouched: //没有处理 break; case TThostFtdcOrderStatusType.Touched: //没有处理 break; } //已经是最后状态了,可以去除了 if (0 == _Ref2Action.Count()) { _Orders4Cancel.Remove(order); } } } else { //由第三方软件发出或上次登录时的剩余的单子在这次成交了,先不处理,当不存在 } }
public OnRtnOrderArgs(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder) { this.pTraderApi = pTraderApi; this.pOrder = pOrder; }
public OnRspQryOrderArgs(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { this.pTraderApi = pTraderApi; this.pOrder = pOrder; this.pRspInfo = pRspInfo; this.nRequestID = nRequestID; this.bIsLast = bIsLast; }
///请求查询报单响应 public void OnRspQryOrder(CThostFtdcOrderField pOrder, CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { Console.WriteLine("OnRspQryOrder"); }
public void CancelOrder(ref CThostFtdcOrderField pOrder) { m_Api.CancelOrder(ref pOrder); }
public void CancelOrder(string OrderRef, int FrontID, int SessionID, string instrumentID) { var orderField = new CThostFtdcOrderField(); orderField.OrderRef = OrderRef; orderField.FrontID = FrontID; orderField.SessionID = SessionID; orderField.InstrumentID = instrumentID; m_Api.CancelOrder(ref orderField); }
public void CancelOrder(ref CThostFtdcOrderField pOrder) { if (null == IntPtrKey || IntPtr.Zero == IntPtrKey) { return; } TraderApi.TD_CancelOrder(IntPtrKey, ref pOrder); }
public override void OnRspQryOrder(CThostFtdcOrderField pOrder, CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { _callbackApi.OnRspQryOrder(pOrder, pRspInfo, nRequestID, bIsLast); }
private void OnRtnOrder_3(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder) { OnRtnOrder_1(this, pTraderApi, ref pOrder); }
public override void OnRtnOrder(CThostFtdcOrderField pOrder) { _callbackApi.OnRtnOrder(pOrder); }
private void OnRtnOrder_3(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder) { OnRtnOrder_1(this, pTraderApi, ref pOrder); }
public OnRtnOrderArgs(ref CThostFtdcOrderField pOrder) { this.pOrder = pOrder; }
private void OnRtnOrder_3(ref CThostFtdcOrderField pOrder) { OnRtnOrder_1(this, ref pOrder); }
public void CancelOrder(ref CThostFtdcOrderField pOrder) { m_Api.CancelOrder(ref pOrder); }
private void OnRtnOrder(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder) { tdlog.Info("{0},{1},{2},开平{3},价{4},原量{5},成交{6},提交{7},状态{8},前置{9},会话{10},引用{11},报单编号{12},{13}", pOrder.InsertTime, pOrder.InstrumentID, pOrder.Direction, pOrder.CombOffsetFlag, pOrder.LimitPrice, pOrder.VolumeTotalOriginal, pOrder.VolumeTraded, pOrder.OrderSubmitStatus, pOrder.OrderStatus, pOrder.FrontID, pOrder.SessionID, pOrder.OrderRef, pOrder.OrderSysID, pOrder.StatusMsg); // 加上这句只是为了在一个账号多会话高频交易时提前过滤 if (pOrder.SessionID != _RspUserLogin.SessionID || pOrder.FrontID != _RspUserLogin.FrontID) { return; } GenericOrderItem item; string strKey = string.Format("{0}:{1}:{2}", pOrder.FrontID, pOrder.SessionID, pOrder.OrderRef); if (orderMap.TryGetValue(strKey, out item)) { string strSysID = string.Format("{0}:{1}", pOrder.ExchangeID, pOrder.OrderSysID); switch (pOrder.OrderStatus) { /// 不用处理 case TThostFtdcOrderStatusType.PartTradedQueueing: break; /// 第一个状态,要注册 case TThostFtdcOrderStatusType.NoTradeQueueing: OnRtnOrderFirstStatus(item, pOrder, strSysID, strKey); break; /// 最后一个状态,要清理 case TThostFtdcOrderStatusType.AllTraded: case TThostFtdcOrderStatusType.PartTradedNotQueueing: case TThostFtdcOrderStatusType.NoTradeNotQueueing: OnRtnOrderLastStatus(item, pOrder, strSysID, strKey); break; /// 其它情况 case TThostFtdcOrderStatusType.Canceled: //分析此报单是否结束 switch (pOrder.OrderSubmitStatus) { case TThostFtdcOrderSubmitStatusType.InsertRejected: EmitRejected(item, pOrder.StatusMsg); break; default: EmitCancelled(item); break; } OnRtnOrderLastStatus(item, pOrder, strSysID, strKey); break; case TThostFtdcOrderStatusType.Unknown: switch (pOrder.OrderSubmitStatus) { case TThostFtdcOrderSubmitStatusType.InsertSubmitted: OnRtnOrderFirstStatus(item, pOrder, strSysID, strKey); break; } break; case TThostFtdcOrderStatusType.NotTouched: //没有处理 break; case TThostFtdcOrderStatusType.Touched: //没有处理 break; } } }
private void OnRspQryOrder_callback(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder, ref CThostFtdcRspInfoField pRspInfo, int nRequestID, bool bIsLast) { if (null != OnRspQryOrder) { OnRspQryOrder(this, new OnRspQryOrderArgs(pTraderApi, ref pOrder, ref pRspInfo, nRequestID, bIsLast)); } }
public static extern void TD_CancelOrder(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder);
private void OnRtnOrder_callback(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder) { if (null != OnRtnOrder) { OnRtnOrder(this, new OnRtnOrderArgs(pTraderApi, ref pOrder)); } }
public OnRtnOrderArgs(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder) { this.pTraderApi = pTraderApi; this.pOrder = pOrder; }
private void OnRtnOrder(IntPtr pTraderApi, ref CThostFtdcOrderField pOrder) { tdlog.Info("{0},{1},{2},开平{3},价{4},原量{5},成交{6},提交{7},状态{8},前置{9},会话{10},引用{11},报单编号{12},{13}", pOrder.InsertTime, pOrder.InstrumentID, pOrder.Direction, pOrder.CombOffsetFlag, pOrder.LimitPrice, pOrder.VolumeTotalOriginal, pOrder.VolumeTraded, pOrder.OrderSubmitStatus, pOrder.OrderStatus, pOrder.FrontID, pOrder.SessionID, pOrder.OrderRef, pOrder.OrderSysID, pOrder.StatusMsg); // 加上这句只是为了在一个账号多会话高频交易时提前过滤 if (pOrder.SessionID != _RspUserLogin.SessionID || pOrder.FrontID != _RspUserLogin.FrontID) { return; } SingleOrder order; string strKey = string.Format("{0}:{1}:{2}", pOrder.FrontID, pOrder.SessionID, pOrder.OrderRef); if (_OrderRef2Order.TryGetValue(strKey, out order)) { order.Text = string.Format("{0}|{1}", order.Text.Substring(0, Math.Min(order.Text.Length, 64)), pOrder.StatusMsg); order.OrderID = pOrder.OrderSysID; //找到对应的报单回应 Dictionary <string, CThostFtdcOrderField> _Ref2Action; if (!_Orders4Cancel.TryGetValue(order, out _Ref2Action)) { //没找到,自己填一个 _Ref2Action = new Dictionary <string, CThostFtdcOrderField>(); _Orders4Cancel[order] = _Ref2Action; } lock (_Ref2Action) { string strSysID = string.Format("{0}:{1}", pOrder.ExchangeID, pOrder.OrderSysID); switch (pOrder.OrderStatus) { case TThostFtdcOrderStatusType.AllTraded: //已经是最后状态,不能用于撤单了 _Ref2Action.Remove(strKey); break; case TThostFtdcOrderStatusType.PartTradedQueueing: //只是部分成交,还可以撤单,所以要记录下来 _Ref2Action[strKey] = pOrder; break; case TThostFtdcOrderStatusType.PartTradedNotQueueing: //已经是最后状态,不能用于撤单了 _Ref2Action.Remove(strKey); break; case TThostFtdcOrderStatusType.NoTradeQueueing: // 用于收到成交回报时定位 _OrderSysID2OrderRef[strSysID] = strKey; if (0 == _Ref2Action.Count()) { _Ref2Action[strKey] = pOrder; EmitAccepted(order); } else { _Ref2Action[strKey] = pOrder; } break; case TThostFtdcOrderStatusType.NoTradeNotQueueing: //已经是最后状态,不能用于撤单了 _Ref2Action.Remove(strKey); break; case TThostFtdcOrderStatusType.Canceled: //已经是最后状态,不能用于撤单了 _Ref2Action.Remove(strKey); //分析此报单是否结束,如果结束分析整个Order是否结束 switch (pOrder.OrderSubmitStatus) { case TThostFtdcOrderSubmitStatusType.InsertRejected: //如果是最后一个的状态,同意发出消息 if (0 == _Ref2Action.Count()) { EmitRejected(order, pOrder.StatusMsg); } else { Cancel(order); } break; default: //如果是最后一个的状态,同意发出消息 if (0 == _Ref2Action.Count()) { EmitCancelled(order); } else { Cancel(order); } break; } break; case TThostFtdcOrderStatusType.Unknown: switch (pOrder.OrderSubmitStatus) { case TThostFtdcOrderSubmitStatusType.InsertSubmitted: // 有可能头两个报单就这状态,就是报单编号由空变为了有。为空时,也记,没有关系 _OrderSysID2OrderRef[strSysID] = strKey; //新单,新加入记录以便撤单 if (0 == _Ref2Action.Count()) { _Ref2Action[strKey] = pOrder; EmitAccepted(order); } else { _Ref2Action[strKey] = pOrder; } break; } break; case TThostFtdcOrderStatusType.NotTouched: //没有处理 break; case TThostFtdcOrderStatusType.Touched: //没有处理 break; } //已经是最后状态了,可以去除了 if (0 == _Ref2Action.Count()) { _Orders4Cancel.Remove(order); } } } else { //由第三方软件发出或上次登录时的剩余的单子在这次成交了,先不处理,当不存在 } }
private void CTPOnRtnOrder(ref CThostFtdcOrderField pOrder) { TimeSpan ts; if (!IsLogin) { _rtnOrderTime = DateTime.Now; //登录前接收所有旧的 order } if (string.IsNullOrEmpty(pOrder.InstrumentID)) { return; } string id = string.Format("{0}|{1}|{2}", pOrder.SessionID, pOrder.FrontID, pOrder.OrderRef); //_dicLocalidSfrId.TryAdd(pOrder.OrderLocalID, id);//防止因此项未赋值,导致成交响应里无法更新 long tmp; if (DicOrderField.TryAdd(id, new OrderField { Custom = (int)(long.TryParse(pOrder.OrderRef, out tmp) ? tmp % 1000000 : 0), //修复: 值为null会导致界面显示错误 InsertTime = string.IsNullOrEmpty(pOrder.InsertTime) ? DateTime.Now.ToString("HH:mm:ss") : pOrder.InsertTime, InstrumentID = pOrder.InstrumentID, //SysID = string.Empty, //为null会导致界面显示错误 //TradeTime = string.Empty, IsLocal = pOrder.SessionID == _session, LimitPrice = pOrder.LimitPrice, OrderID = id, Volume = pOrder.VolumeTotalOriginal, VolumeLeft = pOrder.VolumeTotalOriginal, // pOrder->VolumeTotal; //f->VolumeLeft = pOrder->VolumeTotal; //由ontrade处理 Status = OrderStatus.Normal, StatusMsg = pOrder.StatusMsg, Direction = pOrder.Direction == TThostFtdcDirectionType.THOST_FTDC_D_Buy ? DirectionType.Buy : DirectionType.Sell, Hedge = (TThostFtdcHedgeFlagType)pOrder.CombHedgeFlag[0] == TThostFtdcHedgeFlagType.THOST_FTDC_HF_Speculation ? HedgeType.Speculation : (TThostFtdcHedgeFlagType)pOrder.CombHedgeFlag[0] == TThostFtdcHedgeFlagType.THOST_FTDC_HF_Arbitrage ? HedgeType.Arbitrage : HedgeType.Hedge, Offset = (TThostFtdcOffsetFlagType)pOrder.CombOffsetFlag[0] == TThostFtdcOffsetFlagType.THOST_FTDC_OF_Open ? OffsetType.Open : (TThostFtdcOffsetFlagType)pOrder.CombOffsetFlag[0] == TThostFtdcOffsetFlagType.THOST_FTDC_OF_CloseToday ? OffsetType.CloseToday : OffsetType.Close, })) //首次响应 { //if (pOrder.OrderLocalID.Length > 0) //成交响应时用 if (IsLogin) { _OnRtnOrder?.Invoke(this, new OrderArgs { Value = DicOrderField[id] }); } } else { OrderField f = DicOrderField[id]; //修复: 值为null会导致界面显示错误 f.InsertTime = string.IsNullOrEmpty(pOrder.InsertTime) ? DateTime.Now.ToString("HH:mm:ss") : pOrder.InsertTime; if (_excTime == DateTime.MinValue && TimeSpan.TryParse(f.InsertTime, out ts)) //首次的onrtnorder时间有问题,故放在此处更新_exctime { _excTime = DateTime.Today.Add(ts); _sw.Restart(); } if (TThostFtdcOrderStatusType.THOST_FTDC_OST_Canceled == pOrder.OrderStatus) { f.Status = OrderStatus.Canceled; f.StatusMsg = pOrder.StatusMsg; if (!string.IsNullOrEmpty(pOrder.CancelTime)) { f.TradeTime = pOrder.CancelTime; } else if (IsLogin)//成撤时间:此处为撤单时间 { f.TradeTime = DateTime.Now.ToString("HH:mm:ss"); } if (IsLogin) { //委托被拒绝的撤单按错误处理 if (pOrder.StatusMsg.IndexOf(@"被拒绝") >= 0) { _OnRtnErrOrder?.Invoke(this, new ErrOrderArgs { ErrorID = -1, ErrorMsg = pOrder.StatusMsg, Value = f }); } else { _OnRtnCancel?.Invoke(this, new OrderArgs { Value = f, }); } } //撤单次数等规则由业务层处理 //_dicCancelTimes.AddOrUpdate(f.InstrumentID, 1, (k, v) => v + 1); //if (_dicCancelTimes[f.InstrumentID] >= 450 && _dicCancelTimes[f.InstrumentID] % 10 == 0) //{ // if (IsLogin && _caller._OnRtnErrCancel != null) // _caller._OnRtnErrOrder(_caller, new ErrOrderArgs // { // ErrorID = -1, // ErrorMsg = string.Format("撤单次数将要达到上限500次[{0}]", _dicCancelTimes[f.InstrumentID]), // Value = f, // }); //} } } //委托到交易所 if (!string.IsNullOrEmpty(pOrder.OrderSysID)) { DicOrderField[id].SysID = pOrder.OrderSysID; if (_dicSysidSfrId.TryAdd(pOrder.OrderSysID, id)) { List <CThostFtdcTradeField> list; //成交先至,则在此处再调成交 if (_sysidTrade.TryGetValue(pOrder.OrderSysID, out list)) { foreach (CThostFtdcTradeField t1 in list) { var t = t1; //再调用rtntrade: 成交响应在rtntrade中完成 CTPOnRtnTrade(ref t); } list.Clear(); } } } }
/// <summary> /// 构造函数 /// </summary> public OrderField(CThostFtdcOrderField of) { OrderFieldInstance = of; }