无意中发现盈透接口是提供了下载五分钟,三十分分钟线历史数据的功能的。放着不用就可惜了。
于是开始修改。

我只下载十天的数据,够用就行,免得数据多了下载太慢。

在这里加入5分钟,30分钟的数据定义。这里最后要作为参数传递给函数。

在这里继续修改

然后这里下载可以看见5分钟三十分钟的选择了。

下载的数据保存在数据库的日线分类中,我也不知道为什么,反正能用了。
然后使用下面代码
from datetime import datetime
import numpy as np
from typing import List, Tuple, Dict
from vnpy.trader.ui import create_qapp, QtCore
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.database import database_manager
from vnpy.chart import ChartWidget, VolumeItem, CandleItem
import pyqtgraph as pg
import talib
from vnpy.trader.ui import create_qapp, QtCore, QtGui, QtWidgets
from vnpy.trader.object import BarData
from vnpy.chart.item import ChartItem
from vnpy.chart.manager import BarManager
from vnpy.chart.base import NORMAL_FONT
class SmaItem(CandleItem):
    """"""
    def __init__(self, manager: BarManager):
        """"""
        super().__init__(manager)
        self.blue_pen: QtGui.QPen = pg.mkPen(color=(100, 100, 255), width=2)
        self.sma_window = 10
        self.sma_data: Dict[int, float] = {}
    def get_sma_value(self, ix: int) -> float:
        """"""
        if ix < 0:
            return 0
        # When initialize, calculate all rsi value
        if not self.sma_data:
            bars = self._manager.get_all_bars()
            close_data = [bar.close_price for bar in bars]
            sma_array = talib.SMA(np.array(close_data), self.sma_window)
            for n, value in enumerate(sma_array):
                self.sma_data[n] = value
        # Return if already calcualted
        if ix in self.sma_data:
            return self.sma_data[ix]
        # Else calculate new value
        close_data = []
        for n in range(ix - self.sma_window, ix + 1):
            bar = self._manager.get_bar(n)
            close_data.append(bar.close_price)
        sma_array = talib.SMA(np.array(close_data), self.sma_window)
        sma_value = sma_array[-1]
        self.sma_data[ix] = sma_value
        return sma_value
    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        sma_value = self.get_sma_value(ix)
        last_sma_value = self.get_sma_value(ix - 1)
        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)
        # Set painter color
        painter.setPen(self.blue_pen)
        # Draw Line
        start_point = QtCore.QPointF(ix-1, last_sma_value)
        end_point = QtCore.QPointF(ix, sma_value)
        painter.drawLine(start_point, end_point)
        # Finish
        painter.end()
        return picture
    def get_info_text(self, ix: int) -> str:
        """"""
        if ix in self.sma_data:
            sma_value = self.sma_data[ix]
            text = f"SMA {sma_value:.1f}"
        else:
            text = "SMA -"
        return text
if __name__ == "__main__":
    app = create_qapp()
    symbol = "CL-20210322-USD-FUT"
    exchange = Exchange.NYMEX
    interval = Interval.MINUTE_5
    start = datetime(2021, 3, 1)
    end = datetime(2021, 3, 16)
    bars = database_manager.load_bar_data(
        symbol=symbol,
        exchange=exchange,
        interval=interval,
        start=start,
        end=end
    )
    widget = ChartWidget()
    widget.add_plot("candle", hide_x_axis=True)
    widget.add_plot("volume", maximum_height=250)
    widget.add_item(CandleItem, "candle", "candle")
    widget.add_item(SmaItem, "SmaItem", "candle")
    widget.add_item(VolumeItem, "volume", "volume")
    widget.add_cursor()
    history = bars
    widget.update_history(history)
    def update_bar():
        bar = new_data.pop(0)
        widget.update_bar(bar)
    timer = QtCore.QTimer()
    timer.timeout.connect(update_bar)
    widget.show()
    app.exec_()可以看见下载的数据了。
其中,

这个参数是自己前面定义的。
大概就是这么个,下一步的任务是把自己编写的指标能显示出来




