;WITH Quotes AS
(
SELECT a.CandleDateTime, a.PairID, a.AskHigh, a.AskLow, a.BidHigh, a.BidLow
FROM
(
SELECT a.CandleDateTime, a.PairID,
CASE WHEN a.BrokerServerID IS NULL THEN (a.AskClose + a.BidClose) / 2 ELSE a.AskHigh END AS AskHigh,
CASE WHEN a.BrokerServerID IS NULL THEN (a.AskClose + a.BidClose) / 2 ELSE a.AskLow END AS AskLow,
CASE WHEN a.BrokerServerID IS NULL THEN (a.AskClose + a.BidClose) / 2 ELSE a.BidHigh END AS BidHigh,
CASE WHEN a.BrokerServerID IS NULL THEN (a.AskClose + a.BidClose) / 2 ELSE a.BidLow END AS BidLow
FROM dbo.eConCandles1M AS a WITH(NOLOCK)
UNION ALL
SELECT af.CandleDateTime, af.PairID,
CASE WHEN af.BrokerServerID IS NULL THEN (af.AskClose + af.BidClose) / 2 ELSE af.AskHigh END AS AskHigh,
CASE WHEN af.BrokerServerID IS NULL THEN (af.AskClose + af.BidClose) / 2 ELSE af.AskLow END AS AskLow,
CASE WHEN af.BrokerServerID IS NULL THEN (af.AskClose + af.BidClose) / 2 ELSE af.BidHigh END AS BidHigh,
CASE WHEN af.BrokerServerID IS NULL THEN (af.AskClose + af.BidClose) / 2 ELSE af.BidLow END AS BidLow
FROM dbo.eConQuotesFlat1M AS af WITH(NOLOCK)
) as a
)
------------------------------------------------------------------------------------
--- Calculate equity low/high per each day ----------------------------------------------
SELECT CAST(sa.CandleDateTime AS date) AS [DateValue], MIN(sa.ProfitLow) AS EquityLow, MAX(sa.ProfitHigh) AS EquityHigh, MIN(sa.ProfitLowMoney) AS EquityLowMoney,
MIN(sa.ProfitLowNoBalance) AS EquityLowNoBalance, MAX(sa.ProfitHighNoBalance) AS EquityHighNoBalance,
dbo.MaxDrawdownBunch(sa.ProfitHigh, sa.ProfitLow, sa.CandleDateTime, 1, 0) AS IntradayDrawdownPercent,
dbo.MaxDrawdownBunch(sa.ProfitHighNoBalance, sa.ProfitLowNoBalance, sa.CandleDateTime, 0, 0) AS IntradayDrawdownMoney, sa.StatsAccountID
INTO #Result
FROM
(
SELECT a.CandleDateTime,
100 * (t.EquityPrev * (((a.ProfitLow - t.Balance) / NULLIF(t.Balance, 0)) + 1) - 1) AS ProfitLow,
100 * (t.EquityPrev * (((a.ProfitHigh - t.Balance) / NULLIF(t.Balance, 0)) + 1) - 1) AS ProfitHigh,
a.ProfitLowMoney, a.ProfitLowNoBalance, a.ProfitHighNoBalance, t.StatsAccountID
FROM @TWR AS t
INNER JOIN
(
SELECT tk.CandleDateTime,
tk.ProfitLow + ISNULL(st.CloseValue, 0.0) AS ProfitLow,
tk.ProfitHigh + ISNULL(st.CloseValue, 0.0) AS ProfitHigh,
tk.ProfitLow + ISNULL(st.CloseValueMoney, 0.0) AS ProfitLowMoney,
tk.ProfitLow + ISNULL(st.CloseValueMoney, 0.0) - ISNULL(b.Balance, 0.0) AS ProfitLowNoBalance,
tk.ProfitHigh + ISNULL(st.CloseValueMoney, 0.0) - ISNULL(b.Balance, 0.0) AS ProfitHighNoBalance, tk.StatsAccountID
FROM
(
SELECT tk.CandleDateTime, SUM(tk.ProfitLow) AS ProfitLow, SUM(tk.ProfitHigh) AS ProfitHigh, tk.StatsAccountID
FROM
(
SELECT ISNULL(q.CandleDateTime, st.CloseTimeUtc) AS CandleDateTime,
CASE
WHEN ISNULL(q.CandleDateTime, st.CloseTimeUtc) < st.TicketEnd THEN
CASE
WHEN st.IsSell = 1 THEN (st.OpenPrice - q.AskHigh) * st.Units
* CASE WHEN st.IsCurrency = 1 THEN 1 ELSE ISNULL(q.AskLow1, 1/q.AskLow2) END
WHEN st.IsBuy = 1 THEN (q.BidLow - st.OpenPrice) * st.Units
* CASE WHEN st.IsCurrency = 1 THEN 1 ELSE ISNULL(q.BidHigh1, 1/q.BidHigh2) END
END
WHEN q.CandleDateTime = st.TicketEnd THEN 0.0
END AS ProfitLow,
CASE
WHEN ISNULL(q.CandleDateTime, st.CloseTimeUtc) < st.TicketEnd THEN
CASE
WHEN st.IsSell = 1 THEN (st.OpenPrice - q.AskLow) * st.Units
* CASE WHEN st.IsCurrency = 1 THEN 1 ELSE ISNULL(q.AskHigh1, 1/q.AskHigh2) END
WHEN st.IsBuy = 1 THEN (q.BidHigh - st.OpenPrice) * st.Units
* CASE WHEN st.IsCurrency = 1 THEN 1 ELSE ISNULL(q.BidLow1, 1/q.BidLow2) END
END
WHEN q.CandleDateTime = st.TicketEnd THEN 0.0
END AS ProfitHigh, st.StatsAccountID
FROM #ttt0 AS st
OUTER APPLY
(
SELECT q.CandleDateTime, q.AskHigh, q.BidLow, q.AskLow, q.BidHigh,
q1.AskLow AS AskLow1, q1.BidHigh AS BidHigh1, q1.AskHigh AS AskHigh1, q1.BidLow AS BidLow1,
q2.AskLow AS AskLow2, q2.BidHigh AS BidHigh2, q2.AskHigh AS AskHigh2, q2.BidLow AS BidLow2
FROM
(
SELECT q.CandleDateTime, q.AskHigh, q.BidLow, q.AskLow, q.BidHigh
FROM Quotes as q
WHERE q.PairID = st.PairID AND q.CandleDateTime BETWEEN st.OpenTimeUtc AND st.CloseTimeUtc
) AS q
LEFT JOIN
(
SELECT q.CandleDateTime, q.AskLow, q.BidHigh, q.AskHigh, q.BidLow
FROM Quotes as q
WHERE q.PairID = st.PairID1 AND q.CandleDateTime BETWEEN st.OpenTimeUtc AND st.CloseTimeUtc
) AS q1
ON q.CandleDateTime = q1.CandleDateTime
LEFT JOIN
(
SELECT q.CandleDateTime, q.BidHigh, q.AskLow, q.AskHigh, q.BidLow
FROM Quotes as q
WHERE q.PairID = st.PairID2 AND q.CandleDateTime BETWEEN st.OpenTimeUtc AND st.CloseTimeUtc
) AS q2
ON q.CandleDateTime = q2.CandleDateTime
) AS q
--where IsCurrency = 0
) AS tk
GROUP BY tk.CandleDateTime, tk.StatsAccountID
) AS tk
OUTER APPLY
(
SELECT TOP(1) CloseValue, CloseValueMoney
FROM #CloseTimeBalances
WHERE CloseTimeUtc <= tk.CandleDateTime AND IsBalance IN (0, 2)
AND #CloseTimeBalances.StatsAccountID = tk.StatsAccountID
ORDER BY CloseTimeUtc DESC, IsBalance
) AS st
OUTER APPLY
(
SELECT SUM(CloseValue) AS Balance
FROM #CloseTimeBalances
WHERE CloseTimeUtc <= tk.CandleDateTime AND IsBalance = 1
AND #CloseTimeBalances.StatsAccountID = tk.StatsAccountID
) AS b
) AS a
ON a.CandleDateTime >= t.StartDate AND a.CandleDateTime < t.EndDate AND t.StatsAccountID = a.StatsAccountID
) AS sa
GROUP BY CAST(sa.CandleDateTime AS date), sa.StatsAccountID
|