0

我有一个包含交易列表的表格:

Security ;   Quantity ; Price ;  Consid
 1. IBM  ;    +1,000 ;   20  ;  -20k
 2. IBM  ;    +2,000 ;   22  ;  -44k
 3. IBM  ;    -1,000 ;   30  ;  +30k
 4. IBM  ;    -2,000 ;   20  ;  +40k
 5. IBM  ;    -2,000 ;   20  ;  -20k

所以 PnL 基本上是 Consid 列的总和,所以在添加 Trade#5 之前,PnL 将为 +6k。

添加交易 #5 后,这显示 PnL 为 -14k,这并不能真正反映我们所处的位置。

我想要的是某种过滤掉未平仓交易的方法?因此,仅当我们将购买 2k IBM 股票添加到表中时,交易#5 才会被允许计入总和。

我最初的尝试是:

set @Ret = @Ret + isnull((SELECT SUM(GC) AS GS
FROM  (SELECT SUM(GrossConsid) * - 1 AS GC
                     FROM   Trades AS CT
                     WHERE  (SpecialCond = 'Prop') AND (SettType <> 'Futures') AND (TrdDt <= @Date) AND (TrdDt >=@StartDate) AND (Name = 'my_Comp')
                     GROUP BY ABS(Quantity)
                     HAVING (SUM(Quantity) = 0)) AS dt),0)

但我还没有弄清楚有一个边缘条件,如果我有一个数量为 +5、+5、-5 的交易,它不会被计算在内,因为(SUM(Quantity) = 0)) 评估为假。

关于如何纠正这个问题的任何想法?

谢谢克里斯

4

3 回答 3

0

除了使用 SQL 来匹配您的库存,您是否可以让您的应用在额外的“已关闭”列中设置一个标志?然后你可以这样做:

SELECT Security, SUM(Consid)
FROM mytable
WHERE Closed = 1
GROUP BY Security
于 2011-04-14T15:11:53.830 回答
0

不能说你的逻辑,只是修正你所说的错误:

HAVING (case when SUM(Quantity) = 0 then 1 else 0 end)
于 2011-04-14T16:23:21.673 回答
0

可运行示例

DECLARE @tbl AS TABLE (Seq int, Security varchar(3), Quantity int, Price int, Consid int) ;
INSERT INTO @tbl VALUES
(1, 'IBM', 1000, 20, -20000)
,(2, 'IBM', 2000, 22, -44000)
,(3, 'IBM', -1000, 30, 30000)
,(4, 'IBM', -2000, 20, 40000)
,(5, 'IBM', -2000, 20, -20000);

WITH RunningInventory AS (
SELECT l.Seq, SUM(r.Quantity) AS Inv
FROM @tbl AS l
LEFT JOIN @tbl r
ON r.Seq <= l.Seq
GROUP BY l.Seq
)
SELECT *
FROM @tbl AS trx
INNER JOIN RunningInventory
    ON trx.Seq = RunningInventory.Seq
WHERE RunningInventory.Inv >= 0 ;
于 2011-04-14T16:40:03.097 回答