SQL для следующего уравнения. Сегодняшний EMA = (Цена * (2/11)) + ((1 - (2/11)) * Вчера EMA)
Могу ли я попросить вас помочь со следующим, пожалуйста?
Я хочу создать MS Jet/Ace/Access Query, который возвращает 10-дневную экспоненциальную скользящую среднюю (EMA) из таблицы данных о ценах. Формат таблицы и небольшой набор ее данных выглядит следующим образом...
TableName = Spot
ID (AutoNumber) aDate (DateTime) Settle (Double)
1 01/10/2007 16.056
2 02/10/2007 15.625
3 03/10/2007 15.655
4 04/10/2007 15.686
5 05/10/2007 15.810
6 08/10/2007 15.665
7 09/10/2007 15.908
8 10/10/2007 16.004
9 11/10/2007 16.319
10 12/10/2007 16.233
В случае, если вы не знаете о экспоненциальных скользящих средних, следующие сайты могут помочь объяснить их...
http://stockcharts.com/help/doku.php?id=chart_school:technical_indicators:moving_averages
http://www.pandacash.com/technical-analysis/moving-average/exponential.htm
Однако, надеюсь, я смогу объяснить вам это уравнение.
Todays EMA = (Settle * Exponent) + ((1 - Exponent) * Yesterdays EMA)
куда
Settle = Closing price of the Stock / Asset
Exponent = (2 / (10 Days + 1)) ie 0.1818
У меня есть запрос, который возвращает некоторые значения, которые мне нужны, но я не могу найти решение для всего этого.
Мой запрос, пока (надеюсь, форматирование сделает чтение более понятным)
SELECT aDate, Settle,
(SELECT((SELECT Settle
FROM SPOT AS SubQ
WHERE SubQ.ID = SS.ID))
FROM SPOT AS SS
WHERE SS.ID = Spot.ID - 1) AS YesterdaySettle,
( 2 / 11 ) AS Exponent,
(SELECT Settle
FROM SPOT AS SS
WHERE SS.ID = Spot.ID) * ( Exponent ) AS [Part A],
( 1 - Exponent ) AS [Part B],
(SELECT ((SELECT Settle
FROM SPOT AS SubQ
WHERE SubQ.ID = SS.ID) * ( 2 / 11 ))
FROM SPOT AS SS
WHERE SS.ID = Spot.ID - 1) AS [Yesterdays Part A],
(SELECT SUM(Settle)
FROM SPOT AS SubQ
WHERE ID BETWEEN Spot.ID AND Spot.ID -9) / Iif(Spot.id > 10, 10, Spot.id) AS [10DMA]
FROM SPOT
ORDER BY aDate;
Основываясь на именах полей моего запроса, мое уравнение будет...
Todays EMA = ([Part A]) + ([Part B] * [Part C])
И я ожидал бы результаты, подобные следующим.
[10DMA] [Exponent] [Part A] [Part B] [Part C] (Previous EMA) [EMA]
15.896 0.181818182 2.919272727 0.818181818 USE 10DMA ie 15.896 15.925
15.911 0.181818182 2.840909091 0.818181818 15.925 15.871
15.945 0.181818182 2.846363636 0.818181818 15.871 15.831
15.985 0.181818182 2.852 0.818181818 15.831 15.805
16.027 0.181818182 2.874545455 0.818181818 15.805 15.806
16.037 0.181818182 2.848181818 0.818181818 15.806 15.780
16.052 0.181818182 2.892363636 0.818181818 15.780 15.803
16.054 0.181818182 2.909818182 0.818181818 15.803 15.840
16.039 0.181818182 2.967090909 0.818181818 15.840 15.927
16.025 0.181818182 2.951454545 0.818181818 15.927 15.983
Проблема в том, что я не могу понять, как создать поле [Часть C].
Некоторые моменты...
- Если в течение дня не существует EMA, то значение [Part C] должно быть [10DMA]. Например, первая запись не будет иметь EMA, поэтому мне нужно использовать [10DMA].
- Если есть EMA со вчерашнего дня, то используйте это значение для сегодняшних дней [Часть C].
Могу ли я попросить совета, пожалуйста. Я как-то наткнулся на то, что у меня есть, но я озадачен ценностью Части C.
Я думал, что могу сделать что-то вроде...
iif (EMA <> 0, EMA, [10DMA]) AS [Part C],
(([Part A]) + ([Part B] * [Part C])) AS EMA
Тем не менее, я получаю ошибку, связанную с
Circular reference caused by alias 'Part C'.
Любой совет будет с благодарностью получен. Большое спасибо за ваше время.
Джон.