# 大偉系統 (Visual Stock)
## 待修
* 工具列新增日期選擇
2. 透過前一日以及後一日的按鍵方便的切換日期

(按重要性排列)
### 完成
* [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`