Php 交易引擎加油或熄火

Php 交易引擎加油或熄火,php,sql,algorithm,trading,Php,Sql,Algorithm,Trading,我目前正在尝试实现一个交易引擎。我的代码可以成功创建和填写限额和市场订单。此外,我希望我的引擎能够成功完成“填充或杀死”订单。不幸的是,我不知道如何为这个“填充或杀死”编写算法。有没有人知道有没有一种有效的算法可以做到这一点 以下是你们这些缺乏交易知识的人的一些背景。通常,购买资产的订购方式如下: Price Amount $200 3 $300 4 $350 2.5 $400 1.11 如果一个人想要购买资产,一个简单的算法从

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

以下是你们这些缺乏交易知识的人的一些背景。通常,购买资产的订购方式如下:

Price      Amount  
$200       3  
$300       4
$350       2.5
$400       1.11
如果一个人想要购买资产,一个简单的算法从上到下进行,以便给客户提供最佳价值。一整排不一定要全部买下来。例如,如果我想要4个苹果,代码将以200美元的价格卖给我3个,以300美元的价格卖给我1个(从上到下)

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

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


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

您可以跳过带有“填充或杀死”属性的报价,选择下一个产品。然后重复跳过的报价,并在两种解决方案之间找到最便宜的组合。

填写或终止订单的目的是确保以所需价格向市场投放头寸。因此,交易应立即完成或根本不进入市场。FOK指令禁止经纪人部分填充。在将订单放入队列/书籍之前,您需要1:1的订单才能进行市场匹配

“不部分履行”是“填写或终止”(以及“全部或无”)订单与“立即或取消”订单的区别。IoC订单允许部分填写,并在订单到期之前,在账簿中以增量方式获取更多库存

FOK订单和AON订单之间的区别在于,无法立即执行的AON在执行或取消之前保持活动状态。怡安一直在书中等待全场比赛。 如果没有立即的全场比赛,霍克将被淘汰


填充或杀死的有效算法

有两种形式“多填充或压井”和“单填充或压井”

  • 单次填充或压井
  • 这可能是最简单的一个。这是订单与市场的1:1匹配。如果没有直接命令匹配,则杀死。如果使用SQL命令执行此操作,则可以进行WHERE equals比较

    单一意味着:如果不能立即针对相同或更大的单一订单填写订单,则订单将被拒绝

  • 多填充或压井
  • 这可能就是您所追求的算法

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

    据说FOK指令禁止经纪人部分填充。 这是唯一正确的,因为订单簿与外部的通信。 在内部,“立即内部部分填充”发生,直到订单“填充”

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

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

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

  • 填杀
  • 然后是“填充和杀死”。 订单的填写量应达到可立即按要求价格填写的数量。订单的其余部分被终止/取消。这些订单可能以“部分已填写”状态结束。除了FOK.order.amount不必等于OrderEventGroup.amountTogether之外,algo与2下的相同。OrderEventGroup.amountTogether允许更低(部分填充)



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

    应该有一个伪多项式动态规划解决方案,类似于背包。维护一张表格,给出所有数量首先,FOK不要坐在订单簿上。他们就像国际奥委会(立即或取消),时间为零。如果不执行,则会立即取消

    所有或无订单,即使支持度更低,标准更低,也可能会有TIF的一天结束或良好,直到取消。在这种情况下,它们不是d
    Price           Amount       
    $200            3  
    $300            4  (Fill or Kill)    
    $350            2.5
    $400            1.11