首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#算法股票交易

C#算法股票交易
EN

Stack Overflow用户
提问于 2016-11-04 05:33:39
回答 4查看 5.8K关注 0票数 3

我们正在用C#开发一个算法交易软件。我们监测市场价格,然后根据一定的条件,我们想购买股票。

用户输入可以从图形用户界面(WPF)获取并发送到后端进行监视.

后端不断从证券交易所接收数据,并检查用户输入的价格是否满足一定的限制和条件。如果大家都满意,那么我们将买卖股票(在期货期货)。

现在,我想设计我的后端服务。

  1. 我需要任务并行库或自定义线程池,其中我希望在应用程序启动时创建任务/线程/池(可能是增量的或固定的,比如5000)。
  2. 一切都将处于等待状态。
  3. 一旦用户创建了一个算法,我们将从池中激活一个线程,并监视每个传入字符串的价格。如果匹配,则买入/卖出,然后再次进入等待状态。(我不想创建和销毁线程/任务,因为这很费时)。

所以你们能在这方面帮我吗?如果上面的方法是好的,还是我们有其他的方法?

我被这个想法深深地打动了,不能跳出框框去思考这个问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-04 17:28:03

5000线程是不好的,不要这样做,您会降低性能与上下文开关的损失远远超过并行执行时间的改善。传统上,应用程序的线程数在默认情况下应该等于系统中的核心数。还有其他可能的变体,但它们可能不是您的最佳选择。

因此,您可以使用带有无限循环的ThreadPool和一些工作项方法,这是非常低的级别,但是您可以控制您的系统中发生的事情。回调函数可以更新UI,以便将交易结果通知用户。

但是,如果您说您可以使用TPL,我建议您考虑以下两个选项:

  1. 使用永远运行的任务集合来检查新的交易请求。您仍然应该调整同时运行的任务的数量,因为您可能不希望它们为了CPU时间而相互争斗。由于LongRunning任务是使用专用后台线程创建的,其中许多任务也会降低应用程序的性能。也许在这种方法中,您应该为在任务中运行的算法引入一个策略模式实现。
  2. 在应用程序中设置TPL Dataflow进程。对于这种方法,您应该将有关算法的信息封装在DTO对象中,并引入一个管道:
代码语言:javascript
复制
- [`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章。

票数 2
EN

Stack Overflow用户

发布于 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%的价格一样--事件发生在第一栏( ),在那里你根本看不到任何单一事件!

票数 4
EN

Stack Overflow用户

发布于 2016-11-04 16:05:17

在C# 5.0中,自然的方法是使用运行在默认线程池之上的async方法。

通过这种方式,您可以经常创建Task,但其中最显著的成本在GC中。除非你有很高的性能要求,否则这个成本应该是可以接受的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40415903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档