交易系统
关于交易引擎
证券交易系统是金融市场上能够提供的最有流动性,效率最高的交易场所。和传统的商品交易不同的是,证券交易系统提供的买卖标的物是标准的数字化资产,如USD、股票、BTC等,它们的特点是数字计价,可分割买卖。
交易系统通过买卖双方各自的报价,按照价格优先、时间优先的顺序,对买卖双方进行撮合,实现每秒成千上万的交易量,可以为市场提供高度的流动性和价格发现机制。
交易所本质解决的现实问题就是实现用户进行下单买卖,维持用户的交易深度,撮合交易单成交,最后完成清算划转。
交易所的复杂度来源:状态管理/维护,数据量/性能优化,健壮性等
交易所技术挑战
数据量:100 单/秒,单日千万级;10000 单/秒,单日 10 亿级
交易所的处理交易量会很大,除了常见的数据库增删改查操作优化要做,比如分库、分表。分表常见的是按日期处理,所有的交易所查询历史订单都不会无限制,一般几个月之内的可以查到,超出几个月则无法查询。
数据正确性保证:资产账本,行情数据口径,重启/部署/停机/扩容
在各种情况下,都要保证对账、资产数据的正确性。
安全:交易所要保证数字货币的安全性,不丢币、不被盗、抵抗恶意攻击
交易所被攻击事件不胜枚举,除了不停的优化,交易所也会找一些安全审计机构协助,增加安全性。
前端性能和状态管理,WebSocket 推送,营销文案配置化等
由于交易场景的因素,会有用户长时间登录盯盘进行交易,这时对内存的一些管理,要确保所有的环节没有内存溢出,大量的数据就要有上限的数据结构。交易所也会将持续推送,上币,营销等活动进行配置化。
核心服务
一个交易系统包含的最核心的几个组件:
用户服务 (user service)
基本的用户鉴权、KYC、安全设置等
账户服务 (account service)
用户的数字资产账户的管理(应该指在交易所的虚拟资产账户),比如充值、提币、冻结、转帐、解冻等
订单服务 (order service)
Place an Order,用户可以下各种类型各种交易对的委托单(Order),委托单管理
定序服务 (sequence service)
交易系统的所有订单是一个有序队列。不同的用户在同一时刻下单,也必须由定序系统确定先后顺序。
撮合引擎 (match engine service)
撮合引擎是所有撮合交易系统的核心组件,不管是股票交易系统——包括现货交易、期货交易、期权交易等,还是数字货币交易系统——包括币币交易、合约交易、杠杆交易等,以及各种不同的贵金属交易系统、大宗商品交易系统等,虽然各种不同交易系统的交易标的不同,但只要都是采用撮合交易模式,都离不开撮合引擎。
撮合引擎的设计目标是通用性,设计要遵循 SRP 原则(也就是说保证撮合引擎的通用,应当采取 SRP,撮合引擎应该只负责撮合订单)。
撮合引擎可以说是交易所的最核心的东西,撮合引擎可以根据交易对的不同分别处理;撮合引擎包含两个主要的队列:卖单队列和买单队列,通过定序服务后,对每个委托单执行撮合
数字资产交易所一般采用连续竞价的方式,采用高性能的内存撮合技术。
清算服务 (clearing service)
把撮合后的结果进行清算,包括 taker 和 maker 的资产账户对应的币的增减、根据费率收取手续费、更新订单状态,通知用户
行情服务 (quotation service)
撮合结果同步给行情服务,为用户提供市场的成交价、成交量等信息,并输出实时价格、K线图等技术数据,提供查询
通知服务 (notification service)
通知订单状态,市场行情数据等
钱包服务 (wallet service)
可以做成一个抽象的钱包服务网关,针对不同的区块链主网有不同的具体实现
做市商服务(Market Making service)
做市商(Market maker)为交易所增加了流动性,缩小了买卖价差,同时也为交易委托账本增加了深度,这些因素同时也会更加吸引交易人的加入。
一个基本的做市策略包括同时挂买单和卖单,这样当两方的订单都被市场吃掉后就挣到了买卖价差。由于加密货币的价格剧烈不稳定性,当市场价格向一个方向持续运动时,使用这种策略的做市商有可 能损失惨重。例如,做市商挂买单以300 USDT的价格买1 ETH,同时挂另一个卖单以301 USDT的价格卖1 ETH。如果这两个订单都成交了,那么做市商就赚了1 USDT。如果卖单成交,价格继续上涨至310USDT,那么做市商的买单就没有机会在短期内成交,这导致做市商面临一个潜在的9 USDT的亏损。
对账服务
财务对账
其他服务
分布式调度、监控系统,风控系统等
设计与实现
设计并实现一个功能完整的交易系统,项目名称:exchange
术语
限价单是指以特定价格或更好的价格买入或卖出股票的订单。 买入限价单只能以限价或更低的价格执行,而卖出限价单只能以限价或更高的价格执行。 限价单并不保证会被执行。 只有当股票的市场价格达到限价时,限价单才能被执行。 虽然限价单不保证执行,但它们有助于确保投资者为股票支付的价格不会超过预先确定的价格。
Market Order 市价单:是指以现价或市价尽快执行的交易
市价单是投资者提出的要求--通常是通过经纪人或经纪服务提出的--以当前市场的最佳价格买入或卖出证券。它被广泛认为是进入或退出交易的最快和最可靠的方式,并提供了最有可能快速进入或退出交易的方法。对于许多大盘流通股来说,市场订单几乎是瞬间完成的
市价订单非常适合交易量非常大的证券,如大盘股、期货或ETF。例如,E-迷你标准普尔指数或微软等股票的市价订单往往能迅速完成,不会出现问题。
对于浮动量较低和/或日均成交量极少的股票来说,情况就不同了。由于这些股票的交易量很小,买卖价差往往很大。因此,这些证券的市场订单有时会被缓慢地执行,而且往往以意想不到的价格执行,从而导致有意义的交易成本。
Stop Order 止损单:是指当股票的交易价格达到或超过指定价格("止损价")时,按市价买入或卖出股票的订单。如果股票达到止损价,该订单就成为市价订单,并在下一个可用市价成交。如果股票未能达到止损价,则该订单不会被执行。
三种类型的订单适用场景是不一样的。
Order Book (交易委托账本)
Spot Trade (现货交易,A spot trade is an asset or commodity transacted and delivered immediately)
LTP is Last Traded Price, and what is LTP in share market, LTP in stock market
Bid Ask Spread 买卖差价
Security 证券
Market maker 做市商,Price taker 价格接受者 (trader)
Ask price 卖价 (也就是 Sell);Bid price 买价 (也就是 Buy)
Stop Limit 和 Trailing Stop 比较有意思,他们是有效的风险控制工具。追踪止损单比止损单更灵活,一旦市场以规定的价格(称为价格距离)对您不利,就会执行。在进行保证金交易时,可以使用尾随止损单来保护利润。 举例说明。如果交易者处于多头仓位,当前市场价格从225快速上涨后为250,交易者可以设置一个价格距离为5的尾随止损单。这将在245点建立一个卖出止损单。与一般的止损单不同,如果市场价格继续上涨到275,那么追踪止损单也会相应上涨,始终保持在市场价格的5后面,在本例中上涨到270。
止损价格落后于市场价格的金额指定为价格距离,如果市场向有利可图的方向移动,止损单可以根据市场进行调整。如果触发了止损,则会下达市场订单。
限价止损单是在设定的时间范围内进行的一种有条件的交易,它结合了止损单和限价单的特点,用于降低风险。它与其他订单类型有关,包括限价订单(以给定价格或更好的价格买入或卖出指定数量的股票的订单)和报价止损订单(在证券价格超过指定点后买入或卖出证券的订单)
爆仓: 所谓爆仓,是指在某些特殊条件下,投资者保证金账户中的客户权益为负值的情形。 在市场行情发生较大变化时,如果投资者保证金账户中资金的绝大部分都被交易保证金占用,而且交易方向又与市场走势相反时,由于保证金交易的杠杆效应,就很容易出现爆仓。 如果爆仓导致了亏空且由投资者的原因引起,投资者需要将亏空补足,否则会面临法律追索。
做多:就是你看好大米会涨价,买入或借入大米囤起来,等大米价格上涨了就卖出去赚差价;做空:就是你看好大米会降价,跟大米老板借大米,然后卖出去换成钱,等大米降价再用钱买大米还给大米老板,赚取差价
都是为了赢利,具体的说,有的是为了投机,有的是套期保值,有的是为了交割现货。
Currency futures 货币期货
Margin Trading 保证金交易
Margin Definition 保证金的定义, 保证金是从经纪公司借来的用于购买投资的钱。它是投资者账户中持有的证券总价值与经纪人贷款额之间的差额。保证金购买是借钱购买证券的行为。这种做法包括购买资产,其中买方仅支付资产价值的一部分,其余部分则从银行或经纪人那里借钱。经纪人充当贷方,投资者账户中的证券充当抵押物。
Option 期权
FOK - The purpose of a fill or kill (FOK) order is to ensure that an entire position is executed at prevailing prices in a timely manner.
Post only Order - 只挂单的委托单。挂单是增加交易所的流动性的,而吃单是降低交易所流动性的,一般交易所会激励挂单,所以如果一个单子在下单时标记为 post only,就会只以挂单的方式执行,如果这个单子能被部分填充或者全部填充,会被立即取消掉
Post only orders always receive maker fee on execution
Only limit orders can be post-only. Since market orders execute immediately, they can’t be made post only
If a post only order will partially or fully match against an existing order in the order book, then the post only order is cancelled.
Time In Force - 有效时间是下单交易时使用的特殊指令,用于指示订单在执行或到期之前将保持有效状态的时间。
交易类型
期货合约
期货合约是一种在未来的特定时间,以预定的价格买卖商品、货币或其他资产的协议。与现货市场不同,期货市场中的交易不会立刻被结算,买卖双方交易的是一个规定了在未来某个确定时间结算的合约。
头寸:空头(空头头寸,卖出期货合约所持有的)和多头(多头头寸,买入期货合约所持有的)
参考
撮合引擎系统设计升级版 - 山哥的撮合系统设计
开源撮合引擎:mzheravin/exchange-core 这个可以研究一下
开源撮合引擎:enewhuis/liquibook
https://github.com/gitbitex/gitbitex-spot An Open Source Cryptocurrency Exchange
https://github.com/bmoscon/cryptostore A storage engine for cryptocurrency data
其他资源
撮合引擎
要设计撮合引擎,需要知道撮合引擎是如何工作的。
Risk Management 如何工作:https://www1.nseindia.com/products/content/derivatives/equities/risk_management.htm
系统进行撮合交易与交易所的交易深度息息相关。进行深度撮合之后,会产生一系列的清算划转的账目,最后交易完成。撮合服务是一个输入、输出都严格定义了的状态机。撮合服务采用了状态机的设计,所以在输入模块,一次只处理一个订单。自身的状态严格的根据当前的挂单深度,买单、卖单的价格分别是多少进行排序。输出就是清算结果,所以说撮合是输入、输出都定义了的状态机。
Hazelcast
内存格系统 Hazelcast 在交易系统中的应用 - TODO
LMAX-Exchange
Disruptor - A High Performance Inter-Thread Messaging Library
火币、币安等交易所架构
数字货币交易所架构设计 - 可以重点看一下
API
https://docs.exberry.io/market-data Exchange API protocol,主要是基于 websocket 的数据推送等