vn.py官网
开源量化社区
Member
avatar
加入于:
帖子: 102
声望: 2

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

description

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

description

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

description

在这里继续修改

description

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

description

下载的数据保存在数据库的日线分类中,我也不知道为什么,反正能用了。

然后使用下面代码

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_()

可以看见下载的数据了。

其中,

description

这个参数是自己前面定义的。

大概就是这么个,下一步的任务是把自己编写的指标能显示出来

Member
avatar
加入于:
帖子: 102
声望: 2

description

最后的效果,

下一步是想把自己编写的指标用这个图显示出来,用python编写指标和以往的文华完全不同,不显示出来看看,心里总是不安稳。

Administrator
avatar
加入于:
帖子: 4985
声望: 291

给你加个精华

Member
avatar
加入于:
帖子: 6
声望: 0

description
你好,我把INTERVAL这些更改了,下载数据报错呢,数据订阅都是正常的。是有其他地方修改了吗?

Member
avatar
加入于:
帖子: 5
声望: 0

你盈透订阅了哪些付费数据?

Member
avatar
加入于:
帖子: 102
声望: 2

summerkey wrote:

description
你好,我把INTERVAL这些更改了,下载数据报错呢,数据订阅都是正常的。是有其他地方修改了吗?

只改了上面几部分就可以了

Member
avatar
加入于:
帖子: 102
声望: 2

毛头 wrote:

你盈透订阅了哪些付费数据?

在盈透开户,然后付费才可以订阅付费数据。

Member
avatar
加入于:
帖子: 5
声望: 0

黄裳 wrote:

毛头 wrote:

你盈透订阅了哪些付费数据?

在盈透开户,然后付费才可以订阅付费数据。

嗯嗯,了解了,多谢啦,没有订阅数据,ib模拟账户,也一样可以用vnpy是么?

Member
avatar
加入于:
帖子: 3027
声望: 174

是的,可参考https://www.vnpy.com/forum/topic/1945-vn-pykuai-su-ru-men-4-hai-wai-shi-chang-ib

Member
avatar
加入于:
帖子: 5
声望: 0

xiaohe wrote:

是的,可参考https://www.vnpy.com/forum/topic/1945-vn-pykuai-su-ru-men-4-hai-wai-shi-chang-ib
谢谢!

Member
avatar
加入于:
帖子: 1
声望: 0

亚太区域没有看到国内期货市场哦

Member
avatar
加入于:
帖子: 3027
声望: 174

IB没有国内期货,交易国内期货请使用CTP接口

© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3

沪公网安备 31011502017034号