1

以下の点について、ご協力をお願いしてもよろしいでしょうか?

価格データのテーブルから 10 日間の指数移動平均 (EMA) を返す MS Jet/Ace/Access クエリを作成したいと考えています。テーブル形式とそのデータの小さなセットは次のとおりです...</p>

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

指数移動平均をご存じない場合は、次の Web サイトが説明に役立つかもしれません…</p>

http://stockcharts.com/help/doku.php?id=chart_school:technical_indicators:moving_averages#exponential_moving_a

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; 

私のクエリのフィールド名に基づいて、私の方程式は…</p>

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                  

問題は、[Part C] フィールドの作成方法がわからないことです。

いくつかのポイントは…</p>

  • 1 日の EMA がない場合、[パート C] の値は [10DMA] になります。たとえば、最初のレコードには EMA がないため、[10DMA] を使用する必要があります。
  • 昨日の EMA がある場合は、今日の値を使用します [パート C]。

よろしければアドバイスをお願いします。私はこれまでに持っているものに出くわしましたが、パート C の値に困惑しています。

…の線に沿って何かできると思った</p>

iif (EMA <> 0, EMA, [10DMA]) AS [Part C],
    (([Part A]) + ([Part B] * [Part C])) AS EMA

ただし、関連するエラーが発生します

Circular reference caused by alias 'Part C'.

アドバイスをいただければ幸いです。お時間をいただきありがとうございました。

ジョン。

4

0 に答える 0