我有一个如下所示的订单表:
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/