2017-06-07 38 views
0

我有幾年的FOREX歷史數據,但它是逐分列出的。我想知道如何將它轉換爲M2,M5和M15。我嘗試了很多東西和方法,但都沒有成功。如何轉換外匯從M1到M2,M5和M15時限的歷史數據?

歡迎使用Excel函數或SQL腳本。

下面列出了一些數據格式的示例。

Date  Time Open High Low  Close 
2016.01.03 17:00 1.08701 1.08713 1.08701 1.08713 
2016.01.03 17:01 1.08712 1.08712 1.08712 1.08712 
2016.01.03 17:02 1.08708 1.08722 1.08708 1.08722 
2016.01.03 17:03 1.08717 1.08723 1.08717 1.08723 
2016.01.03 17:04 1.08718 1.08718 1.08711 1.08711 
2016.01.03 17:05 1.08703 1.08716 1.08701 1.08712 
2016.01.03 17:06 1.08721 1.08721 1.0871 1.0871 
2016.01.03 17:07 1.08712 1.08715 1.08712 1.08712 
2016.01.03 17:08 1.08711 1.0872 1.08711 1.08713 
2016.01.03 17:09 1.08716 1.08723 1.08708 1.08708 

回答

1

以下是M2的示例。它應該很容易,看看如何改變它M5和M15

declare @forexDate table 
(
recDate datetime, 
openVal float, 
highVal float, 
lowVal float, 
closeVal float 
) 
INSERT INTO @forexDate VALUES('2016.01.03 17:00', 1.08701, 1.08713, 1.08701, 1.08713) 
INSERT INTO @forexDate VALUES('2016.01.03 17:01', 1.08712, 1.08712, 1.08712, 1.08712) 
INSERT INTO @forexDate VALUES('2016.01.03 17:02', 1.08708, 1.08722, 1.08708, 1.08722) 
INSERT INTO @forexDate VALUES('2016.01.03 17:03', 1.08717, 1.08723, 1.08717, 1.08723) 
INSERT INTO @forexDate VALUES('2016.01.03 17:04', 1.08718, 1.08718, 1.08711, 1.08711) 
INSERT INTO @forexDate VALUES('2016.01.03 17:05', 1.08703, 1.08716, 1.08701, 1.08712) 
INSERT INTO @forexDate VALUES('2016.01.03 17:06', 1.08721, 1.08721, 1.0871, 1.0871) 
INSERT INTO @forexDate VALUES('2016.01.03 17:07', 1.08712, 1.08715, 1.08712, 1.08712) 
INSERT INTO @forexDate VALUES('2016.01.03 17:08', 1.08711, 1.0872, 1.08711, 1.08713) 
INSERT INTO @forexDate VALUES('2016.01.03 17:09', 1.08716, 1.08723, 1.08708, 1.08708) 

SELECT o.recDate, o.openVal, c.closeVal, mx.highVal, mn.lowVal FROM 
(SELECT recDate, openVal, highVal, lowVal, closeVal, 
CAST((RowNum + 1)/2 as int) AS Batch, (RowNum + 1) % 2 AS BatchPos FROM 
(SELECT *, ROW_NUMBER() OVER (ORDER BY recDate) AS RowNum FROM @forexDate) x) o 
inner join 
(SELECT recDate, openVal, highVal, lowVal, closeVal, 
CAST((RowNum + 1)/2 as int) AS Batch, (RowNum + 1) % 2 AS BatchPos FROM 
(SELECT *, ROW_NUMBER() OVER (ORDER BY recDate) AS RowNum FROM @forexDate) x) c 
on o.Batch = c.Batch 
inner join 
(SELECT Batch, MAX(highVal) as highVal FROM 
(SELECT recDate, openVal, highVal, lowVal, closeVal, 
CAST((RowNum + 1)/2 as int) AS Batch, (RowNum + 1) % 2 AS BatchPos FROM 
(SELECT *, ROW_NUMBER() OVER (ORDER BY recDate) AS RowNum FROM @forexDate) x) mxpre GROUP BY Batch) mx 
on mx.Batch = o.Batch 
inner join 
(SELECT Batch, MIN(lowVal) as lowVal FROM 
(SELECT recDate, openVal, highVal, lowVal, closeVal, 
CAST((RowNum + 1)/2 as int) AS Batch, (RowNum + 1) % 2 AS BatchPos FROM 
(SELECT *, ROW_NUMBER() OVER (ORDER BY recDate) AS RowNum FROM @forexDate) x) mnpre GROUP BY Batch) mn 
on mn.Batch = o.Batch 
WHERE o.BatchPos = 0 AND c.BatchPos = 1 

結果應該是這樣的:

recDate openVal closeVal highVal lowVal 
2016-01-03 17:00:00.000 1.08701 1.08712 1.08713 1.08701 
2016-01-03 17:02:00.000 1.08708 1.08723 1.08723 1.08708 
2016-01-03 17:04:00.000 1.08718 1.08712 1.08718 1.08701 
2016-01-03 17:06:00.000 1.08721 1.08712 1.08721 1.0871 
2016-01-03 17:08:00.000 1.08711 1.08708 1.08723 1.08708 

我希望這是你所追求的!

在實踐中,您會希望將批處理和BatchPos預結果插入臨時表中,然後執行一系列自連接,而不是像上面那樣進行一切操作!

1

我認爲數據透視表將爲您完成這項工作,但由於「自動」選擇的組大小限制在幾天(我不知道爲什麼),所以需要一些黑客提供一些需要仔細解釋的結果,儘管改變分組的大小將是容易的:

SO44420634 example

ColumnA具有B2和向下複製到花色:

=INT(B2)-42372+MOD(B2,1)*60*24 

該選擇的小區可以解釋回間隔的開始帶有突出顯示的VLOOKUP,但對於沒有現有數據點的時間開始的任何範圍來說,這並不那麼簡單。

這需要每個區間的所有可用讀數的平均值,而不是第一個。