QuoteDateAdapter.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.NetworkInformation;
  7. using System.Net.Sockets;
  8. using System.Runtime.InteropServices;
  9. using System.Runtime.Serialization.Json;
  10. using System.Text;
  11. //----------------------------------------------------------------
  12. //Module Name: $safeprojectname$
  13. //Purpose:
  14. //CopyRight: Muchinfo
  15. //History:
  16. //----------------------------------------------------------------
  17. //DateTime 2016/6/4 14:12:07
  18. //Author
  19. //Description Create
  20. //----------------------------------------------------------------
  21. using Muchinfo.MTPClient.Data;
  22. using Muchinfo.MTPClient.Data.Enums;
  23. using Muchinfo.MTPClient.Data.Model;
  24. using Muchinfo.MTPClient.Data.Model.Account;
  25. using Muchinfo.MTPClient.Data.Model.Analysis;
  26. using Muchinfo.MTPClient.Data.Model.Sale;
  27. using Muchinfo.MTPClient.Data.Quote;
  28. using Muchinfo.MTPClient.Data.Quote.Structs;
  29. namespace Muchinfo.MTPClient.Adapter.Quote
  30. {
  31. public class QuoteDateAdapter
  32. {
  33. private DateTime baseDateTime = new DateTime(1970, 1, 1, 8, 0, 0);
  34. // 一笔周期数据长度
  35. private const int CYCLE_LENGTH = 36;
  36. private const int TIK_LENGTH = 40; //一笔分笔数据
  37. private const int HEAD_LENGTH = 74;
  38. private const int LENGTH = 36;
  39. private const int c_goodsLength = 228; ////u商品字节长度
  40. private const int c_SaleGoodsLength = 56; ////发售商品长度
  41. private const int c_planheadLength = 8; ////结算计划长度
  42. private const int c_planRunSteps = 16; ////运行阶段时间数据长度
  43. /// <summary>
  44. /// 请求历史周期时间
  45. /// </summary>
  46. /// <param name="goods"></param>
  47. /// <param name="startTime"></param>
  48. /// <param name="endTime"></param>
  49. /// /// <param name="type"></param>
  50. /// <param name="count"></param>
  51. /// <returns></returns>
  52. public byte[] HistoryCycleBytesRequst(QuoteGoods goods, DateTime startTime, DateTime endTime, CycleType type, int count)
  53. {
  54. if (type == CycleType.TimeSharing)
  55. {
  56. type = CycleType.Minutes1;
  57. }
  58. var totalSeconds = (int)((endTime - baseDateTime).TotalSeconds - (startTime - baseDateTime).TotalSeconds);
  59. using (MemoryStream ms = new MemoryStream())
  60. {
  61. byte[] block = new byte[] { };
  62. Int16 exchangeCode = Convert.ToInt16(goods.ExchHqCode.Substring(0, 3));
  63. block = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(exchangeCode));
  64. ms.Write(block, 0, block.Length);
  65. block = Encoding.UTF8.GetBytes(goods.GoodsHqCode.ToUpper().PadRight(64, '\0'));
  66. ms.Write(block, 0, block.Length);
  67. block = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)type));
  68. ms.Write(block, 0, block.Length);
  69. block = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(count));
  70. ms.Write(block, 0, block.Length);
  71. Int32 utcTime = (int)(startTime - baseDateTime).TotalSeconds;
  72. block = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(utcTime));
  73. ms.Write(block, 0, block.Length);
  74. block = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(totalSeconds));
  75. ms.Write(block, 0, block.Length);
  76. return ms.ToArray();
  77. }
  78. }
  79. public GoodsHistoryCycle HistoryCycleBytesRespone(byte[] content)
  80. {
  81. if (content.Length < HEAD_LENGTH)
  82. {
  83. throw new Exception("数据长度过小Length:" + content.Length);
  84. }
  85. byte[] block = new byte[2];
  86. int index = 0;
  87. Array.Copy(content, index, block, 0, 2);
  88. index += 2;
  89. Int16 exchangeCode = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(block, 0));
  90. block = new byte[64];
  91. Array.Copy(content, index, block, 0, 64);
  92. var goodsCode = Encoding.UTF8.GetString(block);
  93. goodsCode = goodsCode.Substring(0, goodsCode.IndexOf('\0')); ///处理商品有垃圾数据问题
  94. var goodsHistory = new GoodsHistoryCycle(exchangeCode + string.Empty, goodsCode, goodsCode);
  95. index += 64;
  96. block = new byte[2];
  97. Array.Copy(content, index, block, 0, 2);
  98. goodsHistory.CycleType = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(block, 0));
  99. index += 2;
  100. Array.Copy(content, index, block, 0, 2);
  101. goodsHistory.decimalPlace = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(block, 0));
  102. index += 2;
  103. block = new byte[4];
  104. Array.Copy(content, index, block, 0, 4);
  105. goodsHistory.Count = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block, 0));
  106. index += 4;
  107. if (goodsHistory.CycleType != (int)CycleType.Tik)
  108. {
  109. block = new byte[content.Length - HEAD_LENGTH];
  110. Array.Copy(content, index, block, 0, block.Length);
  111. goodsHistory.OhlcDataPoints = ConvertOHLC(block, goodsHistory.Count, goodsHistory.decimalPlace);
  112. }
  113. else
  114. {
  115. block = new byte[content.Length - HEAD_LENGTH];
  116. Array.Copy(content, index, block, 0, block.Length);
  117. goodsHistory.SubDataPoints = ConvertTik(block, goodsHistory.Count, goodsHistory.decimalPlace);
  118. }
  119. return goodsHistory;
  120. }
  121. /// <summary>
  122. /// 历史K线
  123. /// </summary>
  124. /// <param name="OHLCContent">K线数据</param>
  125. /// <param name="count"></param>
  126. /// <param name="decimalPlace"></param>
  127. /// <returns></returns>
  128. private List<OHLCDataPoints> ConvertOHLC(byte[] OHLCContent, int count, int decimalPlace)
  129. {
  130. var results = new List<OHLCDataPoints>();
  131. if (OHLCContent.Length != LENGTH * count)
  132. {
  133. throw new Exception("历史K线数据长度错误Length:" + OHLCContent.Length);
  134. }
  135. long index = 0;
  136. var powDecimal = Math.Pow(10, decimalPlace);
  137. byte[] block = new byte[4];
  138. for (int i = 0; i < count; i++)
  139. {
  140. var ohlcPoints = new OHLCDataPoints();
  141. block = new byte[4];
  142. Array.Copy(OHLCContent, index, block, 0, 4);
  143. ohlcPoints.Open = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block, 0)) / powDecimal;
  144. index += 4;
  145. Array.Copy(OHLCContent, index, block, 0, 4);
  146. ohlcPoints.High = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block, 0)) / powDecimal;
  147. index += 4;
  148. Array.Copy(OHLCContent, index, block, 0, 4);
  149. ohlcPoints.Low = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block, 0)) / powDecimal;
  150. index += 4;
  151. Array.Copy(OHLCContent, index, block, 0, 4);
  152. ohlcPoints.Close = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block, 0)) / powDecimal;
  153. #if DEBUG
  154. Console.WriteLine(ohlcPoints.Close);
  155. #endif
  156. index += 4;
  157. block = new byte[8];
  158. Array.Copy(OHLCContent, index, block, 0, 8);
  159. ohlcPoints.Volume = BitConverter.ToDouble(block, 0);
  160. index += 8;
  161. Array.Copy(OHLCContent, index, block, 0, 8);
  162. ohlcPoints.TotleTurnovers = BitConverter.ToDouble(block, 0);
  163. index += 8;
  164. block = new byte[4];
  165. Array.Copy(OHLCContent, index, block, 0, 4);
  166. var datetime = baseDateTime.AddSeconds(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block, 0)));
  167. #if DEBUG
  168. Console.WriteLine(datetime.ToString("yyyy-MM-dd HH:mm:ss"));
  169. #endif
  170. ohlcPoints.Date = datetime.ToOADate();
  171. index += 4;
  172. results.Add(ohlcPoints);
  173. }
  174. return results;
  175. }
  176. /// <summary>
  177. /// 转换Tik数据
  178. /// </summary>
  179. /// <param name="TikContent"></param>
  180. /// <param name="count"></param>
  181. /// <param name="decimalPlace">行情小数位</param>
  182. /// <returns></returns>
  183. private List<SubPenData> ConvertTik(byte[] TikContent, int count, int decimalPlace)
  184. {
  185. var results = new List<SubPenData>();
  186. if (TikContent.Length != TIK_LENGTH * count)
  187. {
  188. throw new Exception("历史Tik线数据长度错误Length:" + TikContent.Length);
  189. }
  190. long index = 0;
  191. var powDecimal = Math.Pow(10, decimalPlace);
  192. byte[] blockPrice = new byte[4];
  193. byte[] blockVolume = new byte[8];
  194. for (int i = 0; i < count; i++)
  195. {
  196. var penPoints = new SubPenData(decimalPlace);
  197. Array.Copy(TikContent, index, blockPrice, 0, 4);
  198. penPoints.Price = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(blockPrice, 0)) / powDecimal;
  199. index += 4;
  200. Array.Copy(TikContent, index, blockVolume, 0, 8);
  201. penPoints.CompleteQte = BitConverter.ToDouble(blockVolume, 0);
  202. index += 8;
  203. Array.Copy(TikContent, index, blockPrice, 0, 4);
  204. penPoints.BidPrice = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(blockPrice, 0)) / powDecimal;
  205. index += 4;
  206. Array.Copy(TikContent, index, blockVolume, 0, 8);
  207. penPoints.BidVolume = BitConverter.ToDouble(blockVolume, 0);
  208. index += 8;
  209. Array.Copy(TikContent, index, blockPrice, 0, 4);
  210. penPoints.AskPrice = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(blockPrice, 0)) / powDecimal;
  211. index += 4;
  212. Array.Copy(TikContent, index, blockVolume, 0, 8);
  213. penPoints.AskVolume = BitConverter.ToDouble(blockVolume, 0);
  214. index += 8;
  215. Array.Copy(TikContent, index, blockPrice, 0, 4);
  216. var datetime = baseDateTime.AddSeconds(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(blockPrice, 0)));
  217. #if DEBUG
  218. Console.WriteLine(datetime.ToString("yyyy-MM-dd HH:mm:ss"));
  219. #endif
  220. penPoints.Time = datetime;
  221. index += 4;
  222. results.Add(penPoints);
  223. }
  224. results.Reverse();
  225. return results;
  226. }
  227. /// <summary>
  228. /// 从行情获取商品组与商品信息.
  229. /// </summary>
  230. /// <param name="contentBytes">数据内容</param>
  231. /// <param name="goodsGroups">商品组信息</param>
  232. /// <returns>商品信息</returns>
  233. public List<QuoteGoods> ConvertGoodsWithsGoodsGroup(byte[] contentBytes, int count, ref List<GoodsGroup> goodsGroups)
  234. {
  235. var results = new List<QuoteGoods>();
  236. var dicGoodsGroups = new Dictionary<long, GoodsGroup>();
  237. if (contentBytes.Length != c_goodsLength * count)
  238. {
  239. throw new Exception("商品数据长度错误Length:" + contentBytes.Length);
  240. }
  241. long index = 0;
  242. // var powDecimal = Math.Pow(10, decimalPlace);
  243. byte[] block4b = new byte[4];
  244. byte[] block8b = new byte[8];
  245. byte[] blockstring = new byte[64];
  246. for (int i = 0; i < count; i++)
  247. {
  248. Array.Copy(contentBytes, index, blockstring, 0, 64);
  249. var goodsCode = Encoding.UTF8.GetString(blockstring).Trim('\0');
  250. index += 64;
  251. Array.Copy(contentBytes, index, blockstring, 0, 64);
  252. var goodsName = Encoding.UTF8.GetString(blockstring).Trim('\0');
  253. index += 64;
  254. Array.Copy(contentBytes, index, block4b, 0, 4);
  255. var exchangeCode = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0));
  256. index += 4;
  257. var qouteGoods = new QuoteGoods(exchangeCode.ToString(), goodsCode, goodsCode, QuoteCategoryType.Futures);
  258. qouteGoods.Name = goodsName;
  259. Array.Copy(contentBytes, index, block8b, 0, 8);
  260. var goodsGroupId = IPAddress.NetworkToHostOrder(BitConverter.ToInt64(block8b, 0));
  261. index += 8;
  262. Array.Copy(contentBytes, index, blockstring, 0, 64);
  263. var goodsGroupName = Encoding.UTF8.GetString(blockstring).Trim('\0'); ;
  264. index += 64;
  265. Array.Copy(contentBytes, index, block4b, 0, 4);
  266. var tradeMode = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0));
  267. index += 4;
  268. qouteGoods.TradeMode = (eTradeMode)tradeMode;
  269. dicGoodsGroups[goodsGroupId] = new GoodsGroup() { GoodsGroupid = goodsGroupId, GoodsGroupName = goodsGroupName, TradeMode = (eTradeMode)tradeMode };
  270. Array.Copy(contentBytes, index, block8b, 0, 8);
  271. var agreeUint = BitConverter.ToDouble(block8b, 0);
  272. index += 8;
  273. ////价格小数位
  274. Array.Copy(contentBytes, index, block4b, 0, 4);
  275. var decimalPlace = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0));
  276. index += 4;
  277. qouteGoods.DecimalPlaces = decimalPlace;
  278. ////市场类型ID
  279. Array.Copy(contentBytes, index, block4b, 0, 4);
  280. var marketypeID = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0));
  281. index += 4;
  282. ////商品id
  283. Array.Copy(contentBytes, index, block4b, 0, 4);
  284. var goodsId = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0));
  285. index += 4;
  286. qouteGoods.GoodsId = (uint)goodsId;
  287. qouteGoods.GoodsParameters = new GoodsParameters() { GoodsId = (uint)goodsId, AgreeUnit = Convert.ToDecimal(agreeUint), HqExchFigures = decimalPlace, SortId = goodsGroupId, MarketTypeID = marketypeID };
  288. dicGoodsGroups[goodsGroupId].MarketTypeID = marketypeID;
  289. results.Add(qouteGoods);
  290. }
  291. goodsGroups = dicGoodsGroups.Values.ToList();
  292. return results;
  293. }
  294. /// <summary>
  295. /// 从行情获取发售商品参数
  296. /// </summary>
  297. /// <param name="contentBytes">数据内容</param>
  298. /// <param name="goodsGroups">商品组信息</param>
  299. /// <returns>商品信息</returns>
  300. public List<SaleGoods> ConvertSaleGoodsParam(byte[] contentBytes, int count)
  301. {
  302. var results = new List<SaleGoods>();
  303. if (contentBytes.Length != c_SaleGoodsLength * count)
  304. {
  305. throw new Exception("商品数据长度错误Length:" + contentBytes.Length);
  306. }
  307. long index = 0;
  308. // var powDecimal = Math.Pow(10, decimalPlace);
  309. byte[] block4b = new byte[4];
  310. byte[] block8b = new byte[8];
  311. byte[] blockstring = new byte[32];
  312. for (int i = 0; i < count; i++)
  313. {
  314. var saleGoods = new SaleGoods();
  315. ////商品ID
  316. Array.Copy(contentBytes, index, block4b, 0, 4);
  317. var goodsId = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0));
  318. index += 4;
  319. saleGoods.GoodsId = (uint)goodsId;
  320. ////合约单位
  321. Array.Copy(contentBytes, index, blockstring, 0, 32);
  322. var agreeUnitString = Encoding.UTF8.GetString(blockstring).Trim('\0'); ;
  323. index += 32;
  324. saleGoods.AgreeUnitString = agreeUnitString;
  325. ////发售开始时间
  326. Array.Copy(contentBytes, index, block4b, 0, 4);
  327. saleGoods.ApplyStartTime = baseDateTime.AddSeconds(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0)));
  328. index += 4;
  329. ////发售结束时间
  330. Array.Copy(contentBytes, index, block4b, 0, 4);
  331. saleGoods.ApplyEndTime = baseDateTime.AddSeconds(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0)));
  332. index += 4;
  333. ////发售阶段
  334. Array.Copy(contentBytes, index, block4b, 0, 4);
  335. saleGoods.RunSteps = (eRunStep)IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0));
  336. index += 4;
  337. ////发售价格
  338. Array.Copy(contentBytes, index, block8b, 0, 8);
  339. saleGoods.SalePrice = Convert.ToDecimal(BitConverter.ToDouble(block8b, 0));
  340. index += 8;
  341. results.Add(saleGoods);
  342. }
  343. return results;
  344. }
  345. /// <summary>
  346. /// 解析行情交易运行时间段
  347. /// </summary>
  348. /// <param name="contentBytes">数据内容</param>
  349. /// <returns></returns>
  350. public QuoteTradePlan ConvertTradePlans(byte[] contentBytes)
  351. {
  352. if (contentBytes.Length < c_planheadLength)
  353. {
  354. throw new Exception("查询结算计划数据长度过小Length:" + contentBytes.Length);
  355. }
  356. var quoteTrade = new QuoteTradePlan();
  357. uint index = 0;
  358. byte[] block4b = new byte[4];
  359. Array.Copy(contentBytes, index, block4b, 0, 4);
  360. var marketTypeid = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0));
  361. index += 4;
  362. quoteTrade.MarketTypeID = marketTypeid;
  363. Array.Copy(contentBytes, index, block4b, 0, 4);
  364. var count = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0)); ////数量
  365. index += 4;
  366. var subBlocks = new byte[contentBytes.Length - c_planheadLength];
  367. Array.Copy(contentBytes, index, subBlocks, 0, subBlocks.Length);
  368. if (subBlocks.Length != c_planRunSteps * count)
  369. {
  370. throw new Exception("结算计划时间段数据长度错误Length:" + subBlocks.Length);
  371. }
  372. index = 0;
  373. quoteTrade.OpenCloseDates = new List<OpenCloseDate>();
  374. for (int i = 0; i < count; i++)
  375. {
  376. var runSteps = new OpenCloseDate();
  377. Array.Copy(subBlocks, index, block4b, 0, 4);
  378. runSteps.TradeDay = baseDateTime.AddSeconds(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0)));
  379. index += 4;
  380. Array.Copy(subBlocks, index, block4b, 0, 4);
  381. runSteps.RunStep = (eRunStep)IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0));
  382. index += 4;
  383. Array.Copy(subBlocks, index, block4b, 0, 4);
  384. runSteps.OpenDate = baseDateTime.AddSeconds(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0)));
  385. index += 4;
  386. Array.Copy(subBlocks, index, block4b, 0, 4);
  387. runSteps.CloseDate = baseDateTime.AddSeconds(IPAddress.NetworkToHostOrder(BitConverter.ToInt32(block4b, 0)));
  388. index += 4;
  389. quoteTrade.OpenCloseDates.Add(runSteps);
  390. }
  391. return quoteTrade;
  392. }
  393. /// <summary>
  394. /// 使用json解析开收市计划
  395. /// </summary>
  396. /// <param name="contentBytes">Json数据</param>
  397. /// <param name="error">数据提示</param>
  398. /// <returns></returns>
  399. public List<QuoteTradePlan> ConvertFromJson(byte[] contentBytes, ref ErrorEntity error)
  400. {
  401. var quoteTradeList = new List<QuoteTradePlan>();
  402. try
  403. {
  404. var dataContractJson = new DataContractJsonSerializer(typeof(TimeSection[]));
  405. using (MemoryStream ms = new MemoryStream(contentBytes))
  406. {
  407. var runsteps = dataContractJson.ReadObject(ms) as TimeSection[];
  408. if (runsteps == null || !runsteps.Any())
  409. {
  410. error.ReturnDesc = "无结算计划数据!";
  411. error.ReturnCode = -1;
  412. return quoteTradeList;
  413. }
  414. var planDic = new Dictionary<uint, QuoteTradePlan>();
  415. for (int i = 0; i < runsteps.Count(); i++)
  416. {
  417. if (!planDic.ContainsKey(runsteps[i].GoodsId))
  418. {
  419. planDic[runsteps[i].GoodsId] = new QuoteTradePlan() { GoodsId = runsteps[i].GoodsId, MarketTypeID = runsteps[i].id, TradeDay = baseDateTime.AddSeconds(runsteps[i].TradeDay) };
  420. planDic[runsteps[i].GoodsId].OpenCloseDates = new List<OpenCloseDate>();
  421. }
  422. var planSection = new OpenCloseDate();
  423. planSection.OpenDate = baseDateTime.AddSeconds(runsteps[i].BeginTime);
  424. planSection.CloseDate = baseDateTime.AddSeconds(runsteps[i].EndTime);
  425. planSection.RunStep = (eRunStep)runsteps[i].RunStep;
  426. planDic[runsteps[i].GoodsId].OpenCloseDates.Add(planSection);
  427. }
  428. quoteTradeList = planDic.Values.ToList();
  429. }
  430. }
  431. catch (Exception ex)
  432. {
  433. error.ReturnDesc = ex.Message;
  434. error.ReturnCode = -1;
  435. }
  436. return quoteTradeList;
  437. }
  438. /// <summary>
  439. /// 使用json解析开收市计划
  440. /// </summary>
  441. /// <param name="contentBytes">Json数据</param>
  442. /// <param name="error">数据提示</param>
  443. /// <returns></returns>
  444. public List<MarketTypeStatus> ConvertFromMarketStatusJson(byte[] contentBytes, ref ErrorEntity error)
  445. {
  446. var quoteStatus = new List<MarketTypeStatus>();
  447. try
  448. {
  449. var dataContractJson = new DataContractJsonSerializer(typeof(MarketTypeStatus[]));
  450. using (MemoryStream ms = new MemoryStream(contentBytes))
  451. {
  452. var runsteps = dataContractJson.ReadObject(ms) as MarketTypeStatus[];
  453. if (runsteps == null || !runsteps.Any())
  454. {
  455. error.ReturnDesc = "无开收市计划数据!";
  456. error.ReturnCode = -1;
  457. return quoteStatus;
  458. }
  459. quoteStatus.AddRange(runsteps);
  460. return quoteStatus;
  461. }
  462. }
  463. catch (Exception ex)
  464. {
  465. error.ReturnDesc = ex.Message;
  466. error.ReturnCode = -1;
  467. }
  468. return quoteStatus;
  469. }
  470. /// <summary>
  471. /// 行情报文组装
  472. /// </summary>
  473. /// <param name="accountid">账号Id</param>
  474. /// <param name="token">令牌字串</param>
  475. /// <returns></returns>
  476. public byte[] QuoteCheckToken(uint accountid, string token)
  477. {
  478. using (MemoryStream ms = new MemoryStream())
  479. {
  480. byte[] block = new byte[] { };
  481. block = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(accountid));
  482. ms.Write(block, 0, block.Length);
  483. block = Encoding.UTF8.GetBytes(token.PadRight(64, '\0'));
  484. ms.Write(block, 0, block.Length);
  485. return ms.ToArray();
  486. }
  487. }
  488. }
  489. }