65.9K
CodeProject 正在变化。 阅读更多。
Home

接收 FIX 协议的交易捕获(AE)报告

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2018年9月29日

CPOL

2分钟阅读

viewsIcon

6232

交易确认报告 (AE) 是一种事后交易消息,由经纪商或交易所发送,用于向参与者报告交易。

交易确认报告 (AE) 消息是一种事后交易消息,由经纪商或交易所发送,用于向参与者报告交易。

如何请求交易确认报告?

客户可以使用 交易确认报告请求 (AD) 根据交易确认报告请求中提供的选择标准订阅交易确认报告。

服务器将通过 TradeRequestStatus (750) 和 TradeRequestResult (749) 字段回复一个 交易确认报告请求确认 (AR),以指示请求是否成功。有时,如果由于某些验证原因拒绝了交易确认报告请求消息,则可以生成一个 Reject 消息作为响应。

交易确认报告请求 (AD) 消息结构

Tag 字段名 Req 描述
568 TradeRequestID Y 请求唯一标识符
569 TradeRequestType Y 请求类型
  • 0:所有交易
  • 1:匹配指定标准的交易。如果未指定以下任何标准,则将返回所有交易。
150 ExecType N 请求特定执行类型的全部交易
  <Instrument> 块 N 请求列表中的所有工具的交易
  =>Symbol   股票代码
  => SecurityId   证券ID
  =>……    

请记住,这些是交易确认报告请求 (AD) 消息的标准字段,受支持的字段列表可能因不同的FIX格式而异。

此外,在实施FIX消息之前,请务必遵循经纪商提供的《行为准则》文档。

交易确认报告请求确认 (AC) 消息

这是对 交易确认报告请求 (AD) 的确认消息

Tag FieldName Req 描述
568 TradeRequestID Y 被确认请求的标识符
569 TradeRequestType Y 被确认请求的标识符
750 TradeRequestStatus Y 请求是否接受或拒绝
0:接受
1:拒绝
749 TradeRequestResult Y 拒绝请求的原因。
0:成功
9:未授权
100:无法匹配选择标准 200:当日请求限制已达到

交易确认报告

这是对 TradeCapture 报告请求 (AD) 的响应消息,报告交易对手之间的交易。

消息结构

Tag 字段名 Req 描述
568 TradeRequestID Y 请求唯一标识符
571 TradeReportID Y 响应消息的唯一ID
17 ExecId Y 交易标识符
48 SecurityId N 工具ID
55 符号 N 股票代码
32 LastQty Y 交易数量
31 LastPx Y 交易价格
75 TradeDate Y 交易日期
60 TransactTime Y 交易时间

实现

TradeCaptureReportRequest (AD)

TradeCaptureReportRequest request = new TradeCaptureReportRequest();

string requestId = DateTime.UtcNow.ToString("yyyyMMddHHmmssfff");//generate unique request ID
request.TradeRequestID = new TradeRequestID(requestId);
request.TradeRequestType = new TradeRequestType
(TradeRequestType.MATCHED_TRADES_MATCHING_CRITERIA_PROVIDED_ON_REQUEST);

request.NoDates = new NoDates(2);
//Criteria to get trades between two dates
var noDatesGroup = new TradeCaptureReportRequest.NoDatesGroup();
noDatesGroup.TransactTime = new TransactTime(start);
request.AddGroup(noDatesGroup);
noDatesGroup = new TradeCaptureReportRequest.NoDatesGroup();
noDatesGroup.TransactTime = new TransactTime(end);
request.AddGroup(noDatesGroup);
<br>Session.SendToTarget(request, sessionId);

TradeCaptureReportRequest Ack (AC)

public void OnMessage(TradeCaptureReportRequestAck ackReport, SessionID session)
{
	if (ackReport.TradeRequestStatus.getValue() == TradeRequestStatus.REJECTED)
	{
	  if (OnReject != null)
	   Console.WriteLine("TradeReportRequest Rejected");
	}
	else if (ackReport.TradeRequestStatus.getValue() == TradeRequestStatus.ACCEPTED)
	{
	   Console.WriteLine("TradeReportRequestStatus Accepted");
	}
	else if (ackReport.TradeRequestStatus.getValue() == TradeRequestStatus.COMPLETED)
	{
	  Console.WriteLine("TradeReportRequestStatus COMPLETED");
	}
}

TradeCaptureReport (AE)

public override void OnMessage(TradeCaptureReport ackReport, SessionID session)
{
    //Capturing data in DTO
	TradeReport tradeReport = new TradeReport
	{
	  Id = ackReport.ExecID.getValue(),
	  LastQty = ackReport.LastQty.getValue(),
	  TransactTime = ackReport.IsSetTransactTime() ? 
                     ackReport.TransactTime.getValue() : DateTime.UtcNow,
	  LastPrice = ackReport.LastPx.getValue(),
	  InstrumentId = Convert.ToInt32(ackReport.SecurityID.getValue())
	};

	NoSides noSides = ackReport.NoSides;
	tradeReport.Symbol = _symbolMap[tradeReport.InstrumentId];

	var group = new TradeCaptureReport.NoSidesGroup();
	group = (TradeCaptureReport.NoSidesGroup)ackReport.GetGroup(1, group);
	if (group.IsSetSide())
	{
		switch (group.Side.getValue())
		{
		 case Side.BUY:
		  tradeReport.Side = BuySellType.Buy;
		  break;
		  case Side.SELL:
		   tradeReport.Side = BuySellType.Sell;
		  break;
		}
	}
	tradeReport.OrderId = group.OrderID.getValue();
	tradeReport.ClientOrderId = group.ClOrdID.getValue();
}

您可以从Github 这里 下载代码。

© . All rights reserved.