首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >交易引擎填充还是终止

交易引擎填充还是终止
EN

Stack Overflow用户
提问于 2015-01-01 04:43:51
回答 4查看 1.1K关注 0票数 3

我目前正在尝试实现一个交易引擎。我的代码可以成功地创建和满足限制和市场订单。此外,我希望我的引擎有能力成功地完成“填充或杀死”的订单。不幸的是,我不知道如何为这个“填充或杀死”写一个算法。有没有人知道有没有一种有效的算法可以做到这一点?

以下是一些交易知识较少的人的背景知识。通常,要购买的资产的排序方式如下:

代码语言:javascript
复制
Price      Amount  
$200       3  
$300       4
$350       2.5
$400       1.11

如果一个人想要购买资产,一个简单的算法从上到下,以便为客户提供最好的价值。不一定要完全买下一整行。例如,如果我想要4个苹果,代码将以200美元的价格卖给我3个,以300美元的价格卖给我1个(从上到下)。

现在,某些卖家可能会给出“填满或杀死”的选择。这意味着不能部分购买给定行。现在让我们假设第二行被指定为"Fill or Kill":

代码语言:javascript
复制
Price           Amount       
$200            3  
$300            4  (Fill or Kill)    
$350            2.5
$400            1.11

在这种情况下,如果我想要4个苹果,我不能从第二排买少于4个。所以现在我有两个明显的选择。我可以从第二排买4个苹果给4*$300=$1200,也可以从第一排买三个苹果,从第三排买一个,价格是(3*200)+(1*350)=850美元。现在,在这种情况下,第二种选择是更好的交易。不幸的是,情况并不总是如此,这取决于不同的价格和订单数量。

这些表将在SQL中实现,并按价格排序。我正在尝试在php中实现这个算法。任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2015-01-01 07:57:00

“买入或杀入”指令的目的是,确保在市场上以期望的价格持有头寸。因此,交易应该立即和完全进入市场,否则根本不进入市场。FOK订单禁止经纪人部分填写。您需要1:1的订单来匹配市场,然后才能将订单放入队列/书籍中。

“无部分履行”是"Fill Or Kill“(以及"All or None")订单与"Immediate Or Cancel”订单的区别。IoC订单允许部分填写,并在书中等待以增量方式获得更多库存,直到订单到期。

FOK订单和AON订单的不同之处在于,不能立即执行的AON一直保持活动状态,直到它们被执行或取消。永安一直在书中等待完全匹配。如果没有立即完全匹配,则丢弃FOK。

填充或终止的有效算法?

有两种形式“多次填充或终止”和“单次填充或终止”。

  1. Single Fill Or Kill

这可能是更简单的一个。这是订单与市场的1:1匹配。如果没有直接订单匹配,则将其删除。如果使用SQL命令执行此操作,则会有WHERE equals比较。

单个意味着:如果不能立即满足相同或更大尺寸的单个订单,则订单将被拒绝。

  1. 多次填充或终止

这可能就是你想要的算法。

多方式:填充多个内部订单。

据说,FOK订单禁止经纪人部分填写。这是唯一正确的,对于订单与外部沟通。在内部,“立即内部部分填充”发生,直到订单被“填充”。

对于传入的FOK订单,您需要创建一个OrderEventGroup。匹配器可能在书上有多个订单,这些订单允许满足传入的FOK订单,但只有在加在一起时才能满足。在MatchEvent上,OrderEventGroup中填充的是与订单约束匹配的反向订单。您在订单簿中匹配订单,其中数量/价格低于或等于请求的金额和价格。填充OrderEventGroup,直到FOK.order.amount等于OrderEventGroup.amountTogether。如果OrderEventGroup.amountTogether根本没有求和和/或花费的时间超过您定义的“立即”执行时间,FOK命令将被终止。

你得到一个交易,它可能有多个匹配步骤,可能有不同的价格。但这并没有传达出去。订单报告包含:“已填充”和“价格”,“数量”-其中价格是OrderEventGroup的平均价格。订单提交者甚至不会知道他的订单是针对多个其他订单填写的。

好处:消除了订单提交者的执行风险。不好的是:你得到的是平均价格,而不知道OrderEventGroup中的最小最大价格或收集到的逆价单的数量。

  1. 填充和终止

然后是"Fill and Kill“。订单的数量可以按要求的价格立即完成。订单的其余部分将被终止/取消。这些订单可能会以“部分填满”的状态结束。算法与under 2相同,只是FOK.order.amount不必等于OrderEventGroup.amountTogether。允许OrderEventGroup.amountTogether更低(部分填充)。

所使用的匹配算法主要是纯时间优先(FIFO)算法,因为这种算法最大化了有效订单的数量。(一些市场使用按比例匹配。介于两者之间的是LIFFE和CME算法,它们都结合了fifo和按比例分配的元素。)

票数 1
EN

Stack Overflow用户

发布于 2015-01-01 05:30:48

您可以跳过带有"Fill or kill“属性的优惠,然后选择下一个产品。然后重复跳过的报价,找到两个解决方案之间最便宜的组合。

票数 0
EN

Stack Overflow用户

发布于 2015-01-01 23:01:16

应该有一个伪多项式动态规划解决方案,类似于背包的解决方案。维护一个表,给出所有数量<=所需数量的最低成本,该数量可以购买。首先,将表格中的所有条目设置为仅使用普通优惠所能获得的最佳条目。轮流采取每个填充或杀死报价,并使用这一点来修正表格:新的最便宜的价格数量k是min(以前的价格为k,以前的价格为k-x加上成本,以提供x股根据您目前正在考虑的报价)。保留足够的回溯信息,以便在考虑所有填充或删除报价后,从目标数量的最便宜价格返回到报价组合。例如,这可以是每个报价的注释,说明它构成最便宜价格的一部分的数量。

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

https://stackoverflow.com/questions/27726160

复制
相关文章

相似问题

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