C#算法股票交易

C# Algorithmic Stock Trading

我们正在使用 C# 开发算法交易软件。我们监控市场价格,然后根据某些条件,我们想要购买股票。

可以从 GUI (WPF) 获取用户输入并发送到后端进行监控。

后端不断从证券交易所接收数据,并检查用户输入的价格是否符合某些限制和条件。如果一切都满意,那么我们将买入/卖出股票(在 Futures FUT)。

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

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

所以请你们在这方面帮助我吗?如果上面的方法好或者我们还有什么其他的方法吗?

我被这个想法打动了,无法跳出框框去思考这个问题。

我认为你使用事件循环会更好,如果你需要扩展,你总是可以按库存进行分片。

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

这样,您会经常创建 Task,但最显着的成本是在 GC 中。而且除非你有非常高的性能要求,否则这个成本应该是可以接受的。

5000 线程很糟糕,永远不要这样做,与并行执行时序改进相比,上下文切换丢失对性能的影响要大得多。传统上,默认情况下,应用程序的线程数应等于系统中的内核数。还有其他可能的变体,但它们可能不是您的最佳选择。

所以您可以使用 ThreadPool with some working item method 无限循环,这是非常低的级别,但您可以控制系统中发生的事情。回调函数可以更新 UI 因此用户将收到有关交易结果的通知。

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

  1. 使用 tasks running forever for checking the new trading request. You still should tune up the number of simultaneously running tasks because you probably don't want them to fight each other for a CPU time. As the LongRunning 任务的集合是使用专用后台线程创建的,其中许多任务也会降低您的应用程序性能。也许在这种方法中,您应该为任务中 运行 的算法引入策略模式实现。

  2. 在您的应用程序中设置一个 TPL Dataflow 进程。对于这种方法,您应该将有关算法的信息封装在一个 DTO 对象中,并引入一个管道:

    • BufferBlock for storing all the incoming requests. Maybe you can use here a BroadcastBlock,如果你想同时检查sellbuy选项。您可以在此处 link 带有布尔谓词的块,这样不同的块将处理不同类型的请求。
    • ActionBlock(可能来自用户的每个算法一个块)用于处理您提供决策所依据的模式的算法检查。
    • ActionBlock用于存储算法成功通过的所有buy / sell次数据请求。
    • BufferBlock for UI reaction with a Reactive Extensions (Introductory book for Rx,如果你不熟悉的话)

    此解决方案仍需使用 block creation options, and more informative for you how exactly your data flow across the trading algorithm, the speed of the decision making and overall performance. You should properly examine for a defaults for TPL Dataflow blocks, you can find them into the official documentation. Other good place to start is Stephen Cleary's introductory blog posts (Part 1, Part 2, Part 3) and the chapter #4 about this library in his book 进行调整。

以上做法肯定不是"good"

鉴于上述想法,架构在许多主要方面都是错误的。如果您的项目渴望在 2017+ 市场中生存,请尝试从 2007-2016 年已经犯下的错误中吸取教训。


百分比显示所有 U.S 的 NBBO 颤振。 2007-01 ~ 2012-01 库存。 (较低的值意味着更好的 NBBO 稳定性。较高的值:不稳定)(由 NANEX 提供)

金融市场以纳秒级运行

是的,几英寸 glass-fibre 信号传播传输延迟决定盈利或亏损。

如果计划在股票市场进行交易,您的系统将观察高频交易人群,进行报价堆砌的肮脏做法,Vacuum-Cleaning 他们就在您眼前,规模如此之大,以至于您的 single-machine multi-threaded 执行将仅通过 thin-air 的下降间隙,在您的本地主机 CPU.

上做出决定之前已经创建了许多微秒


2007-01 ~ 2012-01 高频交易的兴起(由 NANEX 提供)。

五月 read more about an illusion of liquidity here.

查看报价相对于交易水平的扩展: (由 NANEX 提供)

即使决定在单一工具上进行交易,在 FX 上,时间也非常短(超过 20% 的 ToB 出价在不到 2 毫秒的时间内更改,并且不会在您之前到达您的本地主机交易算法可能会做出相应反应)。

如果您的 TAMARA-measurements 与此类似,在您的本地主机上,只需忘记交易 任何 HF/MF/LF-HFT 工具 -- 您根本看不到真正的市场(冰山一角)——因为 +20% price-events 发生在第一列(1 .. 2 ms ),您根本看不到任何单个事件!