我们正在用C#开发一个算法交易软件。我们监测市场价格,然后根据一定的条件,我们想购买股票。
用户输入可以从图形用户界面(WPF)获取并发送到后端进行监视.
后端不断从证券交易所接收数据,并检查用户输入的价格是否满足一定的限制和条件。如果大家都满意,那么我们将买卖股票(在期货期货)。
现在,我想设计我的后端服务。
所以你们能在这方面帮我吗?如果上面的方法是好的,还是我们有其他的方法?
我被这个想法深深地打动了,不能跳出框框去思考这个问题。
发布于 2016-11-04 17:28:03
5000线程是不好的,不要这样做,您会降低性能与上下文开关的损失远远超过并行执行时间的改善。传统上,应用程序的线程数在默认情况下应该等于系统中的核心数。还有其他可能的变体,但它们可能不是您的最佳选择。
因此,您可以使用带有无限循环的ThreadPool和一些工作项方法,这是非常低的级别,但是您可以控制您的系统中发生的事情。回调函数可以更新UI,以便将交易结果通知用户。
但是,如果您说您可以使用TPL,我建议您考虑以下两个选项:
LongRunning任务是使用专用后台线程创建的,其中许多任务也会降低应用程序的性能。也许在这种方法中,您应该为在任务中运行的算法引入一个策略模式实现。TPL Dataflow进程。对于这种方法,您应该将有关算法的信息封装在DTO对象中,并引入一个管道:- [`BufferBlock`](https://msdn.microsoft.com/en-us/library/mt604455.aspx) for storing all the incoming requests. Maybe you can use here a [`BroadcastBlock`](https://msdn.microsoft.com/en-us/library/mt604434.aspx), if you want to check the `sell` or `buy` options in parallel. You can link the block with a boolean predicate here so the different block will process different types of requests.
- [`ActionBlock`](https://msdn.microsoft.com/en-us/library/mt604417.aspx) (maybe one block for each algorithm from user) for processing the algorithmic check for a pattern based on which you are providing the decision.
- [`ActionBlock`](https://msdn.microsoft.com/en-us/library/mt604417.aspx) for storing all the `buy / sell` requests for a data successfully passed by the algorithm.
- [`BufferBlock`](https://msdn.microsoft.com/en-us/library/mt604455.aspx) for UI reaction with a [Reactive Extensions](https://gist.github.com/valm/7467295) ([Introductory book for Rx](http://www.introtorx.com/content/v1.0.10621.0/01_WhyRx.html), if you aren't familiar with it) 这个解决方案仍然需要使用块创建选项进行调整,并且为您提供更多的信息,您的数据到底是如何在交易算法中流动、决策的速度和总体性能。您应该正确地检查TPL数据流块的默认值,您可以在正式文件中找到它们。其他好的起点是Stephen的介绍性博客文章(第1部分,第2部分,第三部分)和关于他的书库的第4章。
发布于 2016-11-04 19:25:24
以上方法绝对不是“好”。
鉴于上述想法,该体系结构在许多基本方面都是错误的。如果你的项目想要在2017+市场生存,试着从2007-2016年已经犯的错误中吸取教训。

这一比例显示了2007-01 ~ 2012-01年间所有美国股票的NBBO波动。(数值越低意味着更好的NBBO稳定性。更高的价值:不稳定)(提供NANEX )
金融市场运行在纳秒级。
是的,几英寸的玻璃纤维信号传输延迟决定了盈亏.
如果你计划在股票市场交易,你的系统会观察高频交易人群,在你的鼻子前面做肮脏的填充物和真空清洗操作,就在这样的规模下,你的单机多线程执行将只是在你的本地主机CPU上做出决定之前,在空隙中消失的稀薄空气中移动。

2007-01 ~ 2012-01年间高频交易的兴起(提供NANEX )。
五月。
见相对于交易水平的报价的扩大:

(由NANEX提供)
即使一个人决定在外汇交易单一工具,时间是令人望而却步的(超过20%的ToB出价在不到2毫秒的时间内被改变,并且在你的交易算法做出相应反应之前不会到达你的本地主机)。
如果你的塔玛拉-测量与此类似,在你的本地主机,只是忘了交易在任何HF/MF/LF-HFT仪器--你根本看不到真正的市场(冰山一角) --就像+20%的价格一样--事件发生在第一栏( ),在那里你根本看不到任何单一事件!

发布于 2016-11-04 16:05:17
在C# 5.0中,自然的方法是使用运行在默认线程池之上的async方法。
通过这种方式,您可以经常创建Task,但其中最显著的成本在GC中。除非你有很高的性能要求,否则这个成本应该是可以接受的。
https://stackoverflow.com/questions/40415903
复制相似问题