Board logo

標題: [發問] (已解決)股市買賣點可以用字典做嗎 [打印本頁]

作者: freeffly    時間: 2012-5-24 21:35     標題: (已解決)股市買賣點可以用字典做嗎

本帖最後由 freeffly 於 2012-5-25 16:29 編輯

S欄市收盤價>10均且>20均得出的結果
T欄則是上面的相反
我本來是想直接抓出U欄的資料(第一個符合的資料及最後一個)
但是我不知道在VBA中是否有方法直接抓出來
做出U欄的資料我想做出W2:Y2這樣的資料
就是算出每一次符合的情況下的差異
不知道這個有辦法寫出來嗎
最近在學字典不過還在接觸當中還沒一個想法
請高手協助


[attach]11131[/attach]
作者: register313    時間: 2012-5-24 23:35

回復 1# freeffly
  1. Sub 買()
  2. With Sheets("100000市加權日線")
  3.   Union(.[U:U], .[W:Y]) = ""
  4.   For I = 2 To Range("A65536").End(xlUp).Row
  5.     .Cells(I, "S").End(xlDown).Offset(, 2) = .Cells(I, "S").End(xlDown)
  6.   Next
  7.   Dim Ar()
  8.   S = 1
  9.   C = Application.CountA([U:U])
  10.   ReDim Ar(1 To C, 1 To 3)
  11.   For Each U In .Range("U2:U" & .[A2].End(xlDown).Row).SpecialCells(xlCellTypeConstants)
  12.     Ar(S, 1) = Format(U.Offset(0, -20), "yyyy/m/d")
  13.     Ar(S, 2) = U
  14.     If S > 1 And U.Offset(1, -2) = "" Then
  15.       If Ar(S - 1, 3) = 0 Then Ar(S, 3) = Ar(S, 2) - Ar(S - 1, 2)
  16.     End If
  17.     S = S + 1
  18.   Next
  19.   .[W2].Resize(UBound(Ar), 3) = Ar
  20. End With
  21. End Sub
複製代碼

作者: Hsieh    時間: 2012-5-25 08:37

回復 1# freeffly

S欄市收盤價>10均且>20均得出的結果
但是以公式判斷出來好像不太相同
圖中藍框部分S欄與V欄有所出入
V欄紅色代表符合條件"市收盤價>10均且>20均"
請說明判斷邏輯應何者正確?
[attach]11135[/attach]
作者: freeffly    時間: 2012-5-25 08:40

回復 2# register313


    大大redim後面就看不太懂
   雖然有試著去跑結果但不知道為什麼可以那樣出結果
   這邊可能我還要再研究

   大大的方式是用我弄出來的結果去跑U還有W:Y欄
   請問可以不先跑S欄直接讓S欄的結果等於U欄嗎?
作者: register313    時間: 2012-5-25 11:05

本帖最後由 register313 於 2012-5-25 12:14 編輯

回復 4# freeffly
  1. Sub 買()
  2. With Sheets("100000市加權日線")
  3.   .[S2:Y65536] = ""
  4.   For I = 2 To Range("A65536").End(xlUp).Row
  5.     X = .Cells(I, "E") > .Cells(I, "H") And .Cells(I, "H") > .Cells(I, "I") And .Cells(I, "H") <> "" And .Cells(I, "I") <> ""
  6.     XU = .Cells(I - 1, "E") > .Cells(I - 1, "H") And .Cells(I - 1, "H") > .Cells(I - 1, "I") And .Cells(I - 1, "H") <> "" And .Cells(I - 1, "I") <> ""
  7.     XD = .Cells(I + 1, "E") > .Cells(I + 1, "H") And .Cells(I + 1, "H") > .Cells(I + 1, "I") And .Cells(I + 1, "H") <> "" And .Cells(I + 1, "I") <> ""
  8.     If (X And Not XU) Or (X And Not XD) Then Cells(I, "S") = .Cells(I, "E")
  9.   Next
  10.   Dim Ar()
  11.   C = 1
  12.   T = Application.CountA([S:S])
  13.   ReDim Ar(1 To T, 1 To 3)
  14.   For Each S In .Range("S2:S" & .[A2].End(xlDown).Row).SpecialCells(xlCellTypeConstants)
  15.     Ar(C, 1) = Format(S.Offset(0, -18), "yyyy/m/d")
  16.     Ar(C, 2) = S
  17.     XU = S.Offset(1, -14) > S.Offset(1, -11) And S.Offset(1, -11) > S.Offset(1, -10) And S.Offset(1, -11) <> "" And S.Offset(1, -10) <> ""
  18.     If C > 1 And Not XU Then
  19.       If Ar(C - 1, 3) = 0 Then Ar(C, 3) = Ar(C, 2) - Ar(C - 1, 2)
  20.     End If
  21.     C = C + 1
  22.   Next
  23.   .[W2].Resize(UBound(Ar), 3) = Ar
  24. End With
  25. End Sub
複製代碼

作者: freeffly    時間: 2012-5-25 11:51

回復 3# Hsieh
版主附上原始公式
剛看一下結果還是跟我弄得一樣
是我公式有錯嗎
剛看公式應該是跟你的一樣

   

[attach]11139[/attach]
作者: register313    時間: 2012-5-25 12:22

回復 6# freeffly
回復 3# Hsieh

收盤>均價10  且 均價10>均價20 且 均價10>0        且 均價20>0
條件是這樣嗎?
作者: freeffly    時間: 2012-5-25 12:43

回復 7# register313


    大大沒錯
   剛剛試了你的新代碼跑很久
   也許只能用輔助欄了
作者: freeffly    時間: 2012-5-25 13:17

回復 3# Hsieh


    版主
   我的條件是收盤>10均  10均>20均 10均>0 20均>0
    你的應該是收盤>10均  收盤>20均 10均>0 20均>0
    暫且不論哪一種比較好
   我想知道的是怎樣取出條件起始跟結尾值
作者: Hsieh    時間: 2012-5-25 14:48

回復 9# freeffly
  1. Sub ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. Dim f$
  4. With Sheet1
  5. ar = .UsedRange.Offset(1).Value
  6. For i = 2 To UBound(ar, 1) - 1
  7.    If ar(i, 5) > ar(i, 8) And ar(i, 8) > ar(i, 9) And ar(i, 8) > 0 And ar(i, 9) > 0 Then
  8.       If ar(i - 1, 9) = 0 Or ar(i - 1, 8) = 0 Or _
  9.       Not (ar(i - 1, 5) > ar(i - 1, 8) And ar(i - 1, 8) > ar(i - 1, 9)) Or _
  10.       Not (ar(i + 1, 5) > ar(i + 1, 8) And ar(i + 1, 8) > ar(i + 1, 9)) Then
  11.       f = IIf(d.Count > 0 And d.Count Mod 2 > 0, "=RC[-1]-R[-1]C[-1]", "")
  12.       d(ar(i, 1)) = Array(ar(i, 1), ar(i, 5), f)
  13.       End If
  14.    End If
  15. Next
  16.      .[W2].Resize(d.Count, 3) = Application.Transpose(Application.Transpose(d.items))
  17. End With
  18. End Sub
複製代碼

作者: freeffly    時間: 2012-5-25 15:24

回復 10# Hsieh


    版主
   這是我要的
   而且不用經過S欄
   字典果然很快
    不過下面對我而言有點玄
    f = IIf(d.Count > 0 And d.Count Mod 2 > 0, "=RC[-1]-R[-1]C[-1]", "")
      d(Ar(i, 1)) = Array(Ar(i, 1), Ar(i, 5), f)
      .[W2].Resize(d.Count, 3) = Application.Transpose(Application.Transpose(d.items))

    看暸幾天的字典 我以為有點理解字典現在又感覺離我更遙遠
   我以為d.count 是去計算專案數 應該要先有東西讓他算吧?
   d.items在這裡是什麼項目?
   可以從哪裡看到嗎?
作者: Hsieh    時間: 2012-5-25 16:09

回復 11# freeffly


    字典顧名思義,每個索引值(key)會對應一個內容(item)
就如同國語字典,若以部首查詢,同部首的字會很多
部首就是索引值,而這些不同的字就是內容
如果索引值對應的內容是單一項目,那就比較容易理解
dictionary(key)=item
當對應內容不只一個的時候,你就要看你的內容要的是甚麼?
在此範例中,key是日期
當條件成立的時候要把這日期的收盤價紀錄下來
當然這是單一內容,不過,當你要寫入工作表時
是要有3欄的資料:1.日期,2.收盤價,3.價差
這個價差是2個日期的差額,若要在字典內取得前一個的價格,會增加許多困難
所以,將第3欄用公式帶入,在該有公式的時候讓陣列的第3個元素寫入公式
這樣跑完全部資料後,字典就會有若干個key
字典的count屬性就是key的數量
keys則表示所有的索引值,所形成的陣列
items則表示所有的內容
因為此範例中每個item都是一個一維陣列
所以items就等於是二維陣列
這邊要注意一點,如果二維陣列,原本只要直接寫入儲存格即可
在這邊items這個二維陣列,實際上他是一維陣列,只不過這個一維陣列的每個元素都包含著一個一維陣列
所以必須使用兩次的轉置(Transpose)動作,才會變成真正的二維陣列,才可直接寫入工作表
作者: freeffly    時間: 2012-5-25 16:18

回復 12# Hsieh


    版主講的好詳細
   讓我有些理解
   我想我可能要透過很多例子才能自己運用
   
   雖然字典不是唯一方法
   但是字典很炫
   而且速度很快
   讓我想要學習
   
   再來爬文...
    路途還真遙遠
作者: jsleee    時間: 2012-5-26 17:53

回復 1# freeffly


請教大大,你檔案中的 大盤資料 是如何取得的?
是透過擷取網頁資料的方式嗎?有無相關的程式碼可以分享
謝謝
作者: freeffly    時間: 2012-5-28 08:59

回復 14# jsleee


    免費交易軟體裡面的資料




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)