3

最初: この質問は重複していません。私はすでにここでこれを尋ねましたが、重複として閉じられました。これは、stackoverflow の他のスレッドと似ていますが、実際にははるかに複雑です。重複していると考える前に、投稿を読んでください。

可変日付で可変移動平均クロスオーバーを計算しようとしています。

つまり、ユーザーに 3 つの値と 1 つのオプションを求めるプロンプトが表示されます。入力は Web フロント エンドを介して行われるため、入力に基づいてクエリを作成/編集したり、必要に応じて複数のクエリを作成したりできます。

X = 1st moving average term  (N day moving average. Any number 1-N)
Y = 2nd moving average term. (N day moving average. Any number 1-N)
Z = Amount of days back from present to search for the occurance of:
option = Over/Under: (> or <. X passing over Y, or X passing Under Y)


X day moving average passing over OR under Y day moving average
within the past Z days.

私のデータベースは構造化されています:

tbl_daily_data

id
stock_id
date
adj_close

と:

tbl_stocks

stock_id
symbol

私はbtreeインデックスを持っています:

daily_data(stock_id, date, adj_close)

stock_id

私はこのクエリに行き詰まっており、それを書くのに多くの問題を抱えています。変数が固定されている場合、それは些細なことのように見えますが、X、Y、Z はすべて互いに 100% 独立しているため (たとえば、過去 100 日間の 5 日間の移動平均、または過去 5 日間の 100 日間の移動平均を見ることができます)。 ) コーディングに苦労しています。

助けてください!:(

編集:もう少しコンテキストが役立つかもしれないと言われましたか?

ユーザーがトレンド分析を実行できるオープンな株式分析システムを作成しています。私は 3500 株の株式と 1970 年までさかのぼる価格履歴を含むデータベースを持っています。

このクエリは、特定の基準に一致する株式を見つけるために毎日実行されます。たとえば、次のようになります。

10日移動平均線が5日以内に20日移動平均線を超える

20 日クロッシング UNDER 10 日移動平均線 5 日以内

100 日以内に 22 日移動平均線を下回る 55 日クロス

しかし、各ユーザーは異なる分析に関心がある可能性があるため、移動平均を各行に保存するだけではなく、計算する必要があります。

4

1 に答える 1

2

質問を完全に理解しているかどうかはわかりません...しかし、次のようなものが必要な場所にたどり着くのに役立つかもしれません:sqlfiddle

SET @X:=5;
SET @Y:=3;
set @Z:=25;
set @option:='under';

select * from ( 

SELECT stock_id,
datediff(current_date(), date) days_ago, 
     adj_close,
     (
     SELECT
          AVG(adj_close) AS moving_average
     FROM
          tbl_daily_data T2
     WHERE
          (
               SELECT
                    COUNT(*)
               FROM
                    tbl_daily_data T3
               WHERE
                    date BETWEEN T2.date AND T1.date
          ) BETWEEN 1 AND @X
     ) move_av_1,
    (
     SELECT
          AVG(adj_close) AS moving_average
     FROM
          tbl_daily_data T2
     WHERE
          (
               SELECT
                    COUNT(*)
               FROM
                    tbl_daily_data T3
               WHERE
                    date BETWEEN T2.date AND T1.date
          ) BETWEEN 1 AND @Y
     ) move_av_2

FROM
     tbl_daily_data T1

where   
datediff(current_date(), date) <= @z
) x
where 
  case when @option ='over'  and move_av_1 > move_av_2 then 1 else 0 end + 
  case when @option ='under' and move_av_2 > move_av_1 then 1 else 0 end  > 0
order by stock_id, days_ago

@Tom H の回答に基づく: MySQL を使用して移動平均を計算するにはどうすればよいですか?

于 2013-04-28T21:53:02.977 に答える