# 大偉系統 (Visual Stock) ## 待修 * 工具列新增日期選擇 2. 透過前一日以及後一日的按鍵方便的切換日期 ![](https://i.imgur.com/7YEeR2R.png) (按重要性排列) ### 完成 * [2023/10/23] * 修正分K指定日期有時無法顯示問題。 * [2023/07/18] * 支援 「期貨歷史資料」 * 修正指定日期無資料時的行為 * [2023/07/06] * 支援自選 Panel 批次儲存截圖 * [2023/07/05] * Setting 無法儲存 * 修改只存顏色 Setting, 不存子圖、疊圖 Setting * 工具列新增日期選擇 * 可以透過DateTimePicker選擇指定的日期 * K棒叫出來之後,輸入的日期會在圖形至中 * 可以加上 Mark 顯示輸入的日期點 * ~~日K數量可以另外設定(前後N,M個K棒)~~ * 圖形截圖 * 多代碼呈現 * 可匯入代碼列表,用戶點某一列,可顯示圖形出來。 * 每一列都有 symbol,date * [2022/10/13] * 副圖的 indicators 要能切換是否顯示 * 程式第一次開啟後,按下[Go]之後並不會顯示資料(訊息列會顯示找不到對應的時序檔案,但是點選[資料設定]並且直接按下[OK]之後,按下[Go]就會顯示正確的資料 * 股票代碼的TextBox請支援按下[Enter]鍵等於按下[Go] * [2022/10/03] * volume ma 顯示 bug * [2022/09/29] * 重構副圖 static ExtremeUpper -> UpperTag * TrueRange 副圖加上 indicator ATR(N) * [2022/09/28] * 加入 TrueRange 副圖 * [2022/09/27] - 副圖資訊可在 ChartInfo 動態顯示 * [2022/09/26] - CandleChart 增加 `ObservableCollection<UserControl>`,顯示副圖 - 副圖可在 SettingWindow 新增/調整/刪除 * [2022/09/23] * 作完整一點的讀資料系統,要能支援不同頻率的資料讀取 * 資料整理:整理不同頻率資料 * 1m, 5m, 15m * 1d tick 和證交所公布不同,考慮用證交所資料,歷史也較長 * [2022/09/21] * 往後拉到底動態載入新的 Candle * UI 應該改成滑鼠點住拖曳來改變範圍較好,scrollBar 改範圍會造成:拉到最左邊載入新 candles 時會影響 candle 顯示的連續性 * 可調整 K 棒頻率 * 在主圖點擊、拖曳滑鼠,可以移動可視範圍 * [2022/09/20] * 時間軸加上滑鼠所在處的 Label * MouseHover 資訊打到 「報價 Panel」上顯示,可以顯示 TOHLCV、Indicator 資訊 * [2022/09/19] * 重構 Price Volume TickElement * 做成 TickElementTemplate, 讓 Price/Volume TickElement 繼承並微調即可。副圖加上 TickElement 會變得比較輕鬆 * VisibleCandlesExtremums type 從寫死的 struct 改成 `dictionary<string,double>`,方便以後加入副圖時,讓每種副圖抓到目前可視範圍的Y軸上下界 ## Requirement * 數據呈現 * 可以看到每隻股票的 tick 或 K 線走勢 * 可以在走勢圖上加上指標 * 可以在走勢圖下加上附圖,繪製指標,附圖也能加上指標 * 回測 * 可以一次對每支股票進行回測 * 回測結果儲存成特定格式,可以用其他程式開起來分析並繪圖 * 回測分析 * 可以看到每筆交易前後的走勢,每筆交易的走勢可以縮小成小圖,用戶可一次看到很多交易的走勢 * 可透過條件篩選出走勢 **回測資料格式** ```xml= <StockBacktest> <Execute> <Start>2022-04-01</Start> <End>2022-04-03</End> </Execute> <Strategy> <Name>測試策略</Name> <Param1>20</Param1> <Param2>12</Param2> </Strategy> <Trade> <Record stg="1" symbol="2330" time="2022-04-01 09:01:03.000" bs="B" price="230.50" tag="" /> <Record stg="1" symbol="2330" time="2022-04-01 09:02:04.000" bs="S" price="231.50" tag="" /> <Record stg="1" symbol="1789" time="2022-04-01 09:01:03.000" bs="B" price="230.50" tag="" /> <Record stg="1" symbol="1789" time="2022-04-01 09:02:04.000" bs="S" price="231.50" tag="" /> </Trade> </StockBacktest> ``` **資料儲存格式** ``` stock twse 2330 tick 202101 20210102.zip 20210103.zip 1s 202101.zip 202102.zip 15s 202101.zip 202102.zip 1m 2021.csv 2022.csv 1d 2330.csv ``` **技術圖** ```plantuml class CandleChart { AxisLabelSettings TimeLabelSettings SplitPanel -- OpenSettings(CandleChart) Load/SaveSetting() } class GraphBase { CandleSource YAxis.Max / Min YAxis.Width ChartElement TickElement MouseLabel __ BindCandleSource(CandleSource) BindMainChartSetting(CandleChart) BindMainChartMethods(CandleChart) } class VolumeChart extends UserControl { } class VolumeChartSetter extends UserControl { chart : VolumeChart __ SetTarget(VolumeChart) } ``` **資料源** ```plantuml class CandleSourceProvider { Root __ + GetCandleSource(id, freq) : CS + HasNext(cs) : bool + GetNextCandleSource(cs) : CS + HasPrev(cs) : bool + GetPrevCandleSource(cs) : CS - GetCsFromFile(id, freq) } class CandleSource { filename id timeframe } class ChartPane { csProvider List<cs> cslist -- Load(symbol, freq) LoadPrev() } ChartPane --> CandleSourceProvider ChartPane --> CandleSource CandleSourceProvider .> CandleSource : <<create>> ``` ```c# class ChartPane { void LoadNewCandleSource { var cs = cslist.Last(); if (csProvider.HasPrev(cs)) { cs.InsertRange(csProvider.GetPrevCs(cs)); cs = new CandleSource(cs); } } } ``` --- ###### tags: `jss-dev`