mysql - 净头寸计算

标签 mysql sql

我有一个如下所示的订单表:

Ticket  Open Time               Close Time              Type    Size
253199  2010-09-09 20:40:00     2010-09-09 20:41:00     sell    0.1
255406  2010-09-13 19:30:00     2010-09-14 04:30:00     buy     0.1
258089  2010-09-15 07:00:00     2010-09-15 09:15:00     sell    0.1
258197  2010-09-15 09:15:00     2010-09-15 14:50:00     buy     0.1
258203  2010-09-15 09:20:00     2010-09-15 14:50:00     buy     0.1
259659  2010-09-16 04:35:00     2010-09-16 18:35:00     sell    0.1
261065  2010-09-17 07:05:00     2010-09-20 00:02:00     buy     0.1

对于每个订单,我想获得同时打开的所有订单(相同类型)的累计总数。换句话说,在给定订单之前打开并在给定订单之后关闭的任何订单的所有Size 的总和。

这是我的代码:

DROP TABLE
IF EXISTS LongOrders;

CREATE TABLE LongOrders SELECT 
    B.Ticket AS Ticket,
    SUM(B.`Size`)AS `Cumulative Long`
FROM
    `orders`.eurusd_fx AS A
JOIN `orders`.eurusd_fx AS B ON(
    B.`Close Time` >= A.`Open Time`
    AND B.`Open Time` <= A.`Open Time`
    AND A.Type = B.Type
    AND A.Type = 'buy'
)
GROUP BY
    A.`Open Time`
ORDER BY
    A.`Open Time`;

DROP TABLE
IF EXISTS ShortOrders;

CREATE TABLE ShortOrders SELECT
    B.Ticket AS Ticket,
    SUM(B.`Size`)AS `Cumulative Short`
FROM
    `orders`.eurusd_fx AS A
JOIN `orders`.eurusd_fx AS B ON(
    B.`Close Time` >= A.`Open Time`
  AND B.`Open Time` <= A.`Open Time`
    AND A.Type = B.Type
    AND A.Type = 'sell'
)
GROUP BY
    A.`Open Time`
ORDER BY
    A.`Open Time`;

DROP TABLE
IF EXISTS CumLong;

CREATE TABLE CumLong SELECT
    A.*
FROM
    LongOrders AS A
JOIN `orders`.eurusd_fx AS B USING(Ticket);

DROP TABLE
IF EXISTS CumShort;

CREATE TABLE CumShort SELECT
    A.*
FROM
    ShortOrders AS A
JOIN `orders`.eurusd_fx AS B USING(Ticket);

SELECT DISTINCT
    A.*, CumLong.`Cumulative Long`,
    CumShort.`Cumulative Short`
FROM
    `orders`.eurusd_fx AS A
JOIN(CumShort, CumLong)ON(
    A.Ticket = CumLong.Ticket
    OR A.Ticket = CumShort.Ticket
) GROUP  BY A.`Open Time`;

输出:

+--------+---------------------+------+------+--------+---------------------+------------+-----------------+------------------+
| Ticket | Open Time           | Type | Size | Item   | Close Time          | Commission | Cumulative Long | Cumulative Short |
+--------+---------------------+------+------+--------+---------------------+------------+-----------------+------------------+
| 253199 | 2010-09-09 20:40:00 | sell |  0.1 | eurusd | 2010-09-09 20:41:00 | -0.89      |         0.10000 |          0.10000 |
| 255406 | 2010-09-13 19:30:00 | buy  |  0.1 | eurusd | 2010-09-14 04:30:00 | -0.9       |         0.10000 |          0.10000 |
| 258089 | 2010-09-15 07:00:00 | sell |  0.1 | eurusd | 2010-09-15 09:15:00 | -0.91      |         0.10000 |          0.10000 |
| 258197 | 2010-09-15 09:15:00 | buy  |  0.1 | eurusd | 2010-09-15 14:50:00 | -0.91      |         0.10000 |          0.10000 |
| 259659 | 2010-09-16 04:35:00 | sell |  0.1 | eurusd | 2010-09-16 18:35:00 | -0.91      |         0.10000 |          0.10000 |
| 261065 | 2010-09-17 07:05:00 | buy  |  0.1 | eurusd | 2010-09-20 00:02:00 | -0.92      |         0.10000 |          0.10000 |
| 262121 | 2010-09-20 03:00:00 | sell |  0.1 | eurusd | 2010-09-20 05:55:00 | -0.91      |         0.10000 |          0.10000 |
| 262192 | 2010-09-20 05:50:00 | buy  |  0.1 | eurusd | 2010-09-20 09:50:00 | -0.92      |         0.10000 |          0.10000 |
| 262739 | 2010-09-20 16:55:00 | sell |  0.1 | eurusd | 2010-09-20 18:45:00 | -0.91      |         0.10000 |          0.90000 |
| 262822 | 2010-09-20 18:40:00 | buy  |  0.1 | eurusd | 2010-09-21 02:05:00 | -0.92      |         0.10000 |          0.10000 |
| 263801 | 2010-09-21 13:05:00 | buy  |  0.1 | eurusd | 2010-09-21 21:25:00 | -0.92      |         0.40000 |          0.10000 |

它似乎不能正常工作。例如,第一个卖出 的 Cumulative Long 应该是 0。

非常感谢您的帮助!谢谢。

编辑:还有 1 个问题:如何获取 ABS(Cumulative Long-Cumulative Short) 的值?我需要 NET 累积头寸规模。

最佳答案

SELECT 
    A.*
  , SUM(CASE WHEN B.Type = 'buy'  THEN B.Size ELSE 0 END)
    AS `Cumulative Long`
  , SUM(CASE WHEN B.Type = 'sell' THEN B.Size ELSE 0 END) 
    AS `Cumulative Short`
FROM
  orders.eurusd_fx AS A
    JOIN
  orders.eurusd_fx AS B
      ON  B.`Open Time` <= A.`Open Time` 
      AND A.`Open Time` <= B.`Close Time` 
GROUP BY
    A.Ticket
ORDER BY
    A.`Open Time`
  , A.Ticket ;

SELECT 
    A.*
  , ( SELECT COALESCE(SUM(B.Size),0)
      FROM orders.eurusd_fx AS B
      WHERE B.`Open Time` <= A.`Open Time` 
        AND A.`Open Time` <= B.`Close Time` 
        AND B.Type = 'buy' 
    ) AS `Cumulative Long`
  , ( SELECT COALESCE(SUM(C.Size),0)
      FROM orders.eurusd_fx AS C
      WHERE C.`Open Time` <= A.`Open Time` 
        AND A.`Open Time` <= C.`Close Time` 
        AND C.Type = 'sell' 
    ) AS `Cumulative Short`
FROM
  orders.eurusd_fx AS A
ORDER BY
    A.`Open Time`
  , A.Ticket ;

要获得额外的计算,您可以添加另一个计算列或添加一个额外的层(将 ORDER BY 推到该外层):

SELECT tmp.*
     , ABS(`Cumulative Long` - `Cumulative Short`) AS NetCumulativeSize 
FROM
  ( SELECT 
        A.*
      , SUM(CASE WHEN B.Type = 'buy'  THEN B.Size ELSE 0 END)
        AS `Cumulative Long`
      , SUM(CASE WHEN B.Type = 'sell' THEN B.Size ELSE 0 END) 
        AS `Cumulative Short`
    FROM
      orders.eurusd_fx AS A
        JOIN
      orders.eurusd_fx AS B
          ON  B.`Open Time` <= A.`Open Time` 
          AND A.`Open Time` <= B.`Close Time` 
    GROUP BY
        A.Ticket
  ) AS tmp
ORDER BY
    tmp.`Open Time`
  , tmp.Ticket ;

关于mysql - 净头寸计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6766523/

相关文章:

mysql - 按一列分组并计算 matlab 中各组的中位数

sql - Arel 查询 CAST 操作

sql - 关于传感器/读取/警报数据库设计的意见

java - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : YES) IN WAMPSERVER

php - 在 Valetina studio 中获取 mysql 中的当前时间戳

mysql - 如何将欧洲格式的字符串日期转换为有效的mysql日期格式?

PHP mysql在创建上传图片到blob未定义索引_FILES时出现问题

mysql - SQL 仅选择列上具有最大值的行

mysql - 是否可以在 MySQL 表上执行内联 GROUP BY?

sql - 如何从一系列数字中检查任何缺失的数字?