最近比较忙,一直没时间写博客。今天我们就开讲股票模拟交易软件。

股票模拟交易软件主要包括以下几个部分:

1.股票行情服务

2.交易终端

3.柜台系统

4.中间件(我们的叫法,其实就是一个中间处理流程)

5.报盘系统

6.撮合系统

7.成交回报系统

8.清算系统

一、行情服务我们采用socket长连接的方式从行情服务器上获取数据

首先我们登录行情服务器:

if (userLogin.ChenckUserLoginConnection(serverAddress, serverPort, ref socket))

{

if (userLogin.SendLoginMessage(serverUsername, serverPassword, socket))

{

marketFlags = new MarketModel.TDFDefine_Data_MarketFlag[MarketModel.MarketFlagArrayLength];

loginAnswer = new MarketModel.TDFDefine_LoginAnswer();

if (userLogin.ReceiveLoginAnswer(ref loginAnswer, ref  marketFlags, socket))

{

IOHelper.WriteLog("接收登陆信息成功");

//获取证劵代码列表

LstockModel = OfferStockCodeList(-1, ref errorMessage);

StockIndex stockIndex = new StockIndex();

//获取本日编号与股票代码索引表,建立行情空表

stockIndex.CreateStockIndexList(LstockModel, ref stockIndexLists_Code, ref immediateMarketModels, ref errorMessage);

//获取行情代码

OfferImmediateMarketModel(nReceiveDataFlags, 1012, ref errorMessage);

loginState = true;

errorMessage = 0;

}

else

{

IOHelper.WriteLog("接收登陆信息失败");

loginState = false;

errorMessage = 3;

}

}

else

{

IOHelper.WriteLog("发送登录请求失败");

loginState = false;

errorMessage = 2;

}

}

else

{

errorMessage = 1;

loginState = false;

IOHelper.WriteLog("连接行情服务器失败,请查看日志文件!");

}

}

然后填充我们需要的内存表

//获取证劵代码列表

LstockModel = OfferStockCodeList(-1, ref errorMessage);

StockIndex stockIndex = new StockIndex();

//获取本日编号与股票代码索引表,建立行情空表

stockIndex.CreateStockIndexList(LstockModel, ref stockIndexLists_Code, ref immediateMarketModels, ref errorMessage);

接下来我们获取行情:

OfferImmediateMarketModel(nReceiveDataFlags, 1012, ref errorMessage);

再看我们发送的行情数据请求

public int SendRequestMarketData(string MarketFlag, Socket socket, int nReceiveDataFlags)

{

MarketModel.TDFDefine_UnionMsgHeadMarketData unionMsgHeadMarketData = new MarketModel.TDFDefine_UnionMsgHeadMarketData();

unionMsgHeadMarketData.tmsg.sFlags = Convert.ToUInt16(MarketModel.TDFTELEFLAGS);

unionMsgHeadMarketData.tmsg.sDataType = Convert.ToUInt16(MarketModel.ID_TDFTELE_REQDATA);

unionMsgHeadMarketData.tmsg.nTime = 0;

unionMsgHeadMarketData.tmsg.nOrder = 0;

unionMsgHeadMarketData.trmd.chMarketFlag = MarketFlag;

unionMsgHeadMarketData.trmd.nFlags = nReceiveDataFlags == 1 ? MarketModel.ID_HDFDATAFLAGS_RETRANSALTE : 0x00;

unionMsgHeadMarketData.trmd.nFlags |= MarketModel.ID_HDFDATAFLAGS_NOTRANSACTION;

unionMsgHeadMarketData.trmd.nFlags |= MarketModel.ID_HDFDATAFLAGS_NOABQUEUE;

unionMsgHeadMarketData.trmd.nFlags |= MarketModel.ID_HDFDATAFLAGS_NOINDEX;

//unionMsgHeadMarketData.trmd.nFlags |= MarketModel.ID_HDFDATAFLAGS_NOMARKETOVERVIEW;

unionMsgHeadMarketData.trmd.nFlags |= MarketModel.ID_TDFTELE_CLOSE;

//unionMsgHeadMarketData.trmd.nFlags |= DataDefine.ID_HDFDATAFLAGS_COMPRESSED;                 //启用数据压缩

byte[] nbyte = StructTransform.StructToBytes(unionMsgHeadMarketData);

int i = socket.Send(nbyte, nbyte.Length, 0);

return i;

}

有的朋友可能不知道为什么会有|=了,其实unionMsgHeadMarketData.trmd.nFlags |= MarketModel.ID_HDFDATAFLAGS_NOTRANSACTION;等价于

unionMsgHeadMarketData.trmd.nFlags = unionMsgHeadMarketData.trmd.nFlags | MarketModel.ID_HDFDATAFLAGS_NOTRANSACTION;

与运算符:同位上面00得0,01得1,11得1,采用与运算符来做能够节省控制变量。不同与运算符的请自己Google上查一下。

在获取行情服务器时还有一个特点就是我们采用了大量的结构体。为什么采用结构体呢?因为结构体的长度是确定的,这样我们在发送和接收行情数据就方便很多了。

我们来看看怎么取结构体的长度:

Marshal.SizeOf(typeof(MarketModel.TDFDefine_MsgHead))
获取结构体:MarketModel.TDFDefine_MsgHead 的长度

Marshal 记得要引入命名空间 System.Runtime.InteropServices;

我们再来看看下面几个方法:

方法一:

public static byte[] StructToBytes(object structObj)

{

//得到结构体的大小

int size = Marshal.SizeOf(structObj);

//创建byte数组

byte[] bytes = new byte[size];

//分配结构体大小的内存空间

IntPtr structPtr = Marshal.AllocHGlobal(size);

//将结构体拷到分配好的内存空间

Marshal.StructureToPtr(structObj, structPtr, false);

//从内存空间拷到byte数组

Marshal.Copy(structPtr, bytes, 0, size);

//释放内存空间

Marshal.FreeHGlobal(structPtr);

//返回byte数组

return bytes;

}

方法二:

/// <summary>

/// byte数组转结构体

/// </summary>

/// <param name="bytes">byte数组</param>

/// <param name="type">结构体类型</param>

/// <returns>转换后的结构体</returns>

public static object BytesToStuct(byte[] bytes, Type type)

{

//得到结构体的大小

int size = Marshal.SizeOf(type);

//byte数组长度小于结构体的大小

if (size > bytes.Length)

{

//返回空

return null;

}

//分配结构体大小的内存空间

IntPtr structPtr = Marshal.AllocHGlobal(size);

//将byte数组拷到分配好的内存空间

Marshal.Copy(bytes, 0, structPtr, size);

//将内存空间转换为目标结构体

object obj = Marshal.PtrToStructure(structPtr, type);

//释放内存空间

Marshal.FreeHGlobal(structPtr);

//返回结构体

return obj;

}

方法三:

public static byte[] BytesCopy(byte[] bytSource, byte[] bytTag, int startIndex, int size)

{

try

{

IntPtr bytePtr = Marshal.AllocHGlobal(size);

Marshal.Copy(bytSource, 0, bytePtr, size);

Marshal.Copy(bytePtr, bytTag, startIndex, size);

Marshal.FreeHGlobal(bytePtr);

return bytTag;

}

catch { return null; }

}

方法四:

public static object BytesToStruct(byte[] structObj, int startIndex, int size, Type type)

{

IntPtr structPtr = Marshal.AllocHGlobal(size);

Marshal.Copy(structObj, startIndex, structPtr, size);

object obj = Marshal.PtrToStructure(structPtr, type);

Marshal.FreeHGlobal(structPtr);

return obj;

}

方法一:将结构体转化成为二进制数组

方法二:把二进制数组还原成为结构体

方法三:不用循环的方式拷贝数组中的部分

方法四:把二进制数组中的部分还原成为结构体

以上四个方法是常用的结构体和二进制数组中间的转化方法,有兴趣的朋友可以好好的了解一下。

本次先讲到这里吧。

股票模拟交易软件(一)待续相关推荐

  1. 股票模拟交易软件(二:交易终端)待续

    交易终端: 最简单的交易终端就是只提供了股票买卖,和ETF买卖的交易终端 当然我们做的不是这样的交易终端. 我们认为交易终端应该具有以下几个功能: 1.股票的普通买入 2.股票的普通卖出 3.撤单 4 ...

  2. 如何移植行情软件的指标到千发股票自动交易软件?

    可以把传统行情软件的指标移过来吗? 可以的,并且搬到这边来也是一件很容易的事情,我们的股票自动交易软件已经有提供了一些基础的函数. 到目前为止我们股票自动交易软件提供的函数有 MA平均 EMA滑动平均 ...

  3. python控制mt4自动交易软件排名_股票自动交易软件排名

    原标题:股票自动交易软件排名 提起股票自动交易软件,大家都很不陌生了,很多用户也使用过很多不同品牌的产品,那么谁比较好呢?接下来我们就为大家来总体排名一下: 第一名:智能A股管家股票自动交易系统 把它 ...

  4. 股票模拟交易日志(七)

    股票模拟交易日志(七) 时间:2021.12.24 主要交易活动:1.卖平贵州茅台200股,卖出价2179.99(开仓价:2133) 2.卖平绿地控股300股,卖出价4.34(开仓价:4.16) 3. ...

  5. 2021-12-15 股票模拟交易心得10

    权益:1004585.62 (视觉中国:+3123.00:皇台酒业:+1491.00:完美世界:+2217.00:华策影视:+1472.00: 蓝思科技:+5049.00) 今天是最后一天了,于是下午 ...

  6. 股票全自动交易软件的风险有哪些?

    股票全自动交易软件的风险有哪些? 1.历史数据的完整性.行情数据不完整可能导致模型与行情数据不匹配.行情数据自身风格转换,也可能导致模型失败,如交易流动性,价格波动幅度,价格波动频率等,而这一点是量化 ...

  7. 股票模拟交易日志(一)

    股票模拟交易日志(一) 时间:2021年12月2日 主要活动记录:下载同花顺模拟炒股软件,并在同花顺开户成功,创立个人模拟炒股账户(沪深交易所) 建仓:1.买入厦门象屿(600057)300股,买入价 ...

  8. 百汇BCR:为什么要使用外汇模拟交易软件?有什么好处?

    外汇模拟交易软件不仅对新手投资者很友好,帮助熟悉交易知识和积累交易经验,对专业投资者而言也同样重要,因为专业投资者可通过外汇模拟交易软件检验自己的投资策略是否合理正确.外汇模拟交易软件有什么好处? 一 ...

  9. 怎么获取机智股票自动交易软件

    想要获取机智股票自动交易软件,如果你会编程或者设计软件,也是可以自己做一个的,但是自己的做出来可能没有市面上的稳定.

最新文章

  1. DeepMind成立DMES新部门,旨在研究AI带来的社会伦理问题
  2. 这段时间Dot Text 老出错,实在没办法解决了,特来求助。[InvalidOperationException: 内部连接致命错误。]...
  3. 智能车复工日记【6】:有bug的模糊PID记录
  4. html 鼠标图标做成动画效果,纯css3实现的鼠标悬停动画按钮
  5. Django,Ajax,Vue实现文章评论功能
  6. 22 为特性 采购申请凭证类型 解决第一个矛盾
  7. Python图像处理丨OpenCV+Numpy库读取与修改像素
  8. 【转】有关Oracle随机字符串的生成方法及具体应用
  9. python展示全部好友_利用Python网络爬虫抓取微信好友的签名及其可视化展示
  10. 关于重分类工具的其他讨论
  11. win11开机占用率过高怎么办?win11开机内存占用90%
  12. 第六届中国多式联运合作与发展大会暨多式联运示范成果展在京举办
  13. 中文拼写纠错_一种中文拼写检查方法与流程
  14. python小白系列1
  15. 内存 显存,cpu,GPU,显卡
  16. 我不是学计算机专业的,想转行做程序员,怎么办?
  17. 基于springboot+bboss整合的elasticsearch(好用的一匹)
  18. PHP设计模式之观察者模式
  19. 淘宝二维码对网店推广的好处
  20. 期刊论文需要查重吗?

热门文章

  1. css iohone手机端适配,【css】适配iphoneX
  2. 解决 java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未正确结束 问题
  3. AGV智能三维数字物流库房HTML5+WebGL(Threejs)解决方案
  4. oppo应用显示服务器正忙,快应用OPPO账号服务端API
  5. 驾校考试秘笈 不用看书就能通过!! 暂时不考也先留着 别等着急的时候没处找去!!!速记方法!...
  6. 统考英语多少分可以替换学位英语?
  7. Python视频教程(Python基础)
  8. 计算机毕业设计-基于SSM的企业ERP报销系统-JavaWeb企业ERP报销系统
  9. nats服务器状态未启用,NATS服务器配置的详细介绍
  10. PDF文件怎么合并在一起?最有效的方法看这里