返回列表 上一主題 發帖

[發問] 如何在股價圖下方應用 VBA 增列一拉霸?

本帖最後由 alexliou 於 2012-5-14 14:31 編輯

回復 3# c_c_lai
製作 Scrolling Chart時
重點是把ScrollBar的Value 和圖表的資料來源的位置連在一起

當ScrollBar 的Change事件發生時
圖表就必須將資料來源重設一次

附件中檔案有一個利用長短均線值來決定買賣訊號的K線圖,
其中有兩個重點:
1. 因為資料量很多, 都放在一張圖裡會顯得很擁擠, 所以一張圖裡限定只放150根K棒
    K線圖下設計了一個捲軸, 讓使用者可以捲動捲軸來檢視不同時期的資料
2. 當有買賣訊號出現時, K棒上會出現"買進"或"賣出"的標籤
    但當捲軸移動時,這些標籤也要跟著移動

均線策略測試環境1.zip (155.06 KB)

Alex

TOP

另一種版本
圖停留在WorkSheet中
差別在Scroll Event Handler 中加入某些環境變數的設定

均線策略測試環境2.zip (170.24 KB)

Alex

TOP

本帖最後由 alexliou 於 2012-5-14 20:59 編輯

回復 6# c_c_lai
上傳的程式是整個均線策略回測器Project的一部份
它的功能僅處理繪製K線圖

股價的基本資料放在Access 資料庫裡    (也是靠VBA從網路上擷取而來)
可以根據某個UserForm 或 某些Cell的內容決定要Load
哪一個商品  哪一段期間的資料進來
這可以用一個Sub來處理

長短期均線是根據基本資料來計算
要用多少天的移動平均 也可以根據某個UserForm 或 某些Cell的內容來決定
這個例子用的是四日和五十日(隨便設的)
移動平均的計算可以用另一個Sub來處理

買賣訊號根據移動平均線的狀況來決定
例如當短期均線上穿長期均線則產生"買進"訊號
反之則"賣出"
這可以用另一個Sub來處理
....
....
....
Alex

TOP

本帖最後由 alexliou 於 2012-5-15 20:38 編輯

回復 10# c_c_lai
1.用VBA code 產生的 表單控制項 它的名稱是由Excel 決定的 (ex. "卷軸 7")
為了掌控這個控制項, 你最好是幫它重新命名
這可利用 .Name 屬性來達成
(ex.  .Name = "MyScrollBar1")


2. 設定此一控制項的Event Handler
這可利用 .OnAction 屬性來達成
(ex.  .OnAction =  "MySrollBar1_Change"

3. 撰寫 MyScrollBar1_Change 程序的程式碼

4. 第一步可省略, 但做了會使一致性(控制項的名稱和它的Event Handler 名稱)提高
你可把 .Name = "MyScrollBar1" 那行 Mark掉
程式可以運作
只不過 "捲軸 x"的事件處理器是 MyScrollBar1_Change
兩者名稱不一致

5. ScrollBar 有兩種  可以是表單控制項或是Active X 控制項
樓上GBKEE大大有Demo
兩者用VBA Code建立與處理方法不同
你用的是表單控制項

拉霸事件產生器2.zip (11.89 KB)

Alex

TOP

本帖最後由 alexliou 於 2012-5-16 03:09 編輯

回復 13# c_c_lai
那些附屬在物件(如ThisWorkBook, 工作表1, .......)下的變數或程序
即使宣告為Public , 要去存取或呼叫,  需透過物件的階層  
如Thisworkbook.VariableA, 工作表1.ScrollBarChange,.....

但在模組(Module)中宣告的變數或程序
如宣告為Public, 即使是在Module外取用或呼叫
也不用加上模組的名稱

像你前述的問題
如果把ScrollBarChange 程序 放在模組表1中
並把它宣告為Public (這裡不宣告也行  此情形是特例)
那你使用   .OnAction = "ScrollBarChange" 也會work

工作表上的控制項的Event Handler 通常會放在附屬於工作表的程序裡
因為同一類別的控制項可能會在不同的工作表中出現
如果能確保每個控制項稱都不同名
Event Handlers全都放在模組表裡亦可
Alex

TOP

回復 15# c_c_lai
我的Access 資料庫中所存的都是歷史資料
資料源並非券商的DDE

但在需要即時交易資料的狀況下
券商的DDE資料源則是個不錯的選擇
至少跟其他一般免費的資料源(如交易所的網頁)
它的穩定性和即時性(更新頻率)都較佳
Alex

TOP

本帖最後由 alexliou 於 2012-5-22 19:39 編輯

回復 17# c_c_lai
先回答你有關於ScrollBar 顏色的問題

1. 前面說過  工作表可使用的控制項可分兩種:
表單控制項和ActiveX控制項
在不使用VBA來自動建立ScrollBar控制項的狀況下
也就是在工作表環境中  我們選擇[開發人員] > [插入]時
就可以發現 EXCEL提供兩種選擇 : 表單控制項和ActiveX控制項
而且表單控制項的屬性較少  
ActiveX控制項的屬性選擇較多 (當Mouse 在ActiveX控制項上時按右鍵, 你會發現多了一個[內容]標籤)
這兩種控制項在用VBA 建立時及操作時
使用的Code也不一樣
附件中用VBA code 建立了兩種不同的ScrollBar控制項 敬請參考

拉霸事件產生器3.zip (28.09 KB)
2. 表單控制項的ScrollBar 並無BackColor 和 ForeColor等屬性
所以無法改變它的顏色
如果你要讓ScrollBar 有顏色
就只能使用ActiveX控制項ScrollBar了
它的BackColor屬性可以調整Bar的顏色
它的ForeClor屬性可以調整Bar兩端箭頭的顏色

3. 當你用VBA Code自動建立ActiveX控制項時
會遇到一個麻煩   是它不支援中斷模式
會讓你偵錯很不方便
(但我還是比較喜歡用ActiveX控制項)

4. ActiveX控制項的名稱還有一些Tricky的地方
(你可以在VBA 的 IDE下 利用Help查ActiveX控制項)
所以盡量在設計階段時建置
而不要在程式執行階段利用VBA Code建置它
Alex

TOP

本帖最後由 alexliou 於 2012-5-22 21:34 編輯

回復 17# c_c_lai

折線圖並沒直接的辦法來設定不同的顏色
也就是說  InvertIfNegative 與折線圖合用時並不會發揮作用
(線段是連接兩點, InvertIfNegtative 是針對"點")

若要處理折線圖在不同的範圍(可以是X軸, 也可以是不同的Y值)顯示不同的顏色
一般解法是把一個資料數列根據範圍拆成不同的數列
每個序列賦予不同的顏色

PS. 以上說得很簡單 但Implement起來會有新的問題發生
假設第一點的Y值是 10, 第二點的Y值是-5
你想要在0以上的線段和0以下的線段呈現不同的顏色
這樣就得人工插入一個點0 (分界點又會形成一個資料數列)
你可以朝這個方向去思考
這是一個不算小的工程
Alex

TOP

        靜思自在 : 【時間成就一切】時間可以造就人格,可以成就事業,也可以儲積功德。
返回列表 上一主題