---
# System prepended metadata

title: 大偉系統 (Visual Stock)
tags: [jss-dev]

---

# 大偉系統 (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`