交易引擎填充或杀死

时间:2014-12-31 20:43:51

标签: php sql algorithm trading

我目前正在尝试实施一个交易引擎。我的代码可以成功创建和填写限价和市场订单。此外,我希望我的引擎能够成功填写“填充或杀死”订单。不幸的是,我不知道如何为这种“填充或杀戮”编写算法。有谁知道是否有一个有效的算法来做到这一点?

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

Price      Amount  
$200       3  
$300       4
$350       2.5
$400       1.11

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

现在,某些卖家可能会选择“填充或杀死”。这意味着不能部分购买给定的行。所以现在让我们说第二行被指定为“填充或杀死”:

Price           Amount       
$200            3  
$300            4  (Fill or Kill)    
$350            2.5
$400            1.11

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

这些表将在SQL中实现并按价格排序。我试图在PHP中实现此算法。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

“填写或终止”订单的目的是确保以期望的​​价格向市场提供头寸。因此,交易应该立即完全或根本不进入市场。 FOK命令禁止经纪人部分填写。在将订单放入队列/账簿之前,您需要1:1的市场匹配订单。

“无部分履行”是“立即或取消”订单中“填充或终止”(和“全部或无”)订单的区别。 IoC订单允许部分填写并在书中等待增加更多库存,直到订单到期时间。

FOK订单和AON订单之间的区别在于,AON在执行或取消之前无法立即执行。 AON一直在书中等待完全匹配。 如果没有立即完全匹配,FOK会被丢弃。


填充或杀死的高效算法?

“Multi Fill Or Kill”和“Single Fill or Kill”有两种形式。

  1. 单次填充或杀死
  2. 这可能更容易。这是订单与市场的1:1匹配。如果没有直接订单匹配,就杀了。如果使用SQL命令执行此操作,则WHERE等于比较。

    单一意味着:如果订单无法立即填写相同或更大的单个订单,则该订单将被拒绝。

    1. 多次填充或杀死
    2. 这可能是您追求的算法。

      多种方式:填写多个内部订单。

      据说FOK命令禁止经纪人部分填补。 这是唯一正确的,因为订单簿与外界的沟通。 在内部,发生“直接内部部分填充”,直到订单被“填充”。

      对于传入的FOK订单,您创建一个OrderEventGroup。 匹配器可能有多个订单坐在书上,允许满足传入的FOK订单,但只有如果共同添加。在MatchEvent上,OrderEventGroup填充了与订单约束匹配的对冲订单。您在订单簿中匹配订单,其中数量/价格低于或等于请求的金额和价格。您填充OrderEventGroup,直到FOK.order.amount等于OrderEventGroup.amountTogether。如果OrderEventGroup.amountTogether根本没有总结和/或花费的时间超过你定义的“立即”执行时间,那么FOK命令就会被终止。

      您将获得单个交易,可能有多个匹配步骤,价格可能不同。但那没有传达。订单报告包含:“已填充”和“价格”,“数量” - 其中price是OrderEventGroup的平均价格。订单提交者甚至不知道他的订单是针对多个其他订单填写的。

      好处:消除订单提交者的执行风险。 不好的是:你得到的是平均价格,没有关于OrderEventGroup中最小最高价格或收集的反对订单数量的线索。

      1. 填写并杀死
      2. 然后,有“填充和杀戮”。 订单按照要求的价格立即填写的数量填写。订单的其余部分被杀死/取消。这些订单可能以“部分填充”状态结束。算法与2下的相同,除了FOK.order.amount不必等于OrderEventGroup.amountTogether。允许OrderEventGroup.amountTogether较低(部分填充)。


        所使用的匹配算法主要是纯时间优先级(FIFO)算法,因为这种算法最大化了有效订单的数量。 (有些市场使用Pro-Rata匹配。介于两者之间的是LIFFE和CME算法,两者都是来自fifo和pro-rata的元素。)

答案 1 :(得分:0)

您可以使用“填充或终止”属性跳过优惠,然后选择下一个产品。然后重复跳过的报价,找到两种解决方案之间最便宜的组合。

答案 2 :(得分:0)

应该有一个伪多项式动态编程解决方案,类似于背包。保持一个表格,对于所有数量< =所需数量,给出该数量可以购买的最低成本。从表格中的所有条目开始,只使用普通优惠即可获得最佳条目。依次获取每个填充或终止报价并使用此表来修改表:新的最便宜的价格到数量k是min(k的先前价格,kx的先前价格加上根据您当前正在考虑的报价提供x股的成本) 。保留足够的回溯信息,以便在考虑所有填充或终止优惠后,以最便宜的价格为目标数量提供回报。例如,对于每个报价,这可能是一个纸币,它是最便宜价格的一部分。

答案 3 :(得分:0)

首先,FOK不要坐在订单簿上。它们就像IOC(立即或取消)并且有一个零时间。如果他们不执行,他们会立即取消。

所有或者没有订单,甚至更少支持和更低标准,可能有一天结束的TIF或良好的取消。在这种情况下,它们不会显示,并且会在能够执行时执行。

现在有了我们的方式,你是在试图遵守证券法,还是只是一个玩具系统? FOK不是标准限额,市场或IOC订单。有些场地可能甚至没有实施它们,有些场所也有不同的定义。

但是,如果你试图服从RegNMS,你不能跳过书的内部来填补更深层次(通过要求的交易)。我只看到在NBBO上填写的FOK订单(最好的报价/报价,内部),但我想我一次只使用它们,我只记得。

因此,算法很容易看出书的内部是否有足够的大小,如果是,则执行它。如果你想要更宽松一点,你可以工作到一个新的水平,但是在RegNMS下,如果另一个场地也在那个级别显示大小(再次通过罢工交易),那么场地就不能这样做。这就是订单类型的一点,以防止您的买/卖意图泄露。