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'.

Любой совет будет с благодарностью получен. Большое спасибо за ваше время.

Джон.

0 ответов

Другие вопросы по тегам