vnpy 查询持仓量_VNPY源码(四)DataRecorder

本文介绍了VNPY数据记录器的源码,包括如何注册并处理EVENT_TICK和EVENT_CONTRACT事件,以及如何保存Tick和Bar数据。详细讲解了RecorderEngine类的功能,如添加、移除记录,以及数据库管理接口的使用。同时讨论了数据存储的相关方法save_tick_data和save_bar_data。
摘要由CSDN通过智能技术生成

VNPY源码学习系列文章:

一、源码

"""

注册EVENT_TICK、EVENT_CONTRACT,当有EVENT_TICK的时候,调用process_contract_event函数(其实就是record_tick函数),

将task put到queue

通过run函数,从self.queue获得task(Tick、Bar),调用database_manager的方法储存数据

"""

from threading import Thread

from queue import Queue, Empty

from copy import copy

from vnpy.event import Event, EventEngine

from vnpy.trader.engine import BaseEngine, MainEngine

from vnpy.trader.object import (

SubscribeRequest,

TickData,

BarData,

ContractData

)

from vnpy.trader.event import EVENT_TICK, EVENT_CONTRACT

from vnpy.trader.utility import load_json, save_json, BarGenerator

from vnpy.trader.database import database_manager

APP_NAME = "DataRecorder"

EVENT_RECORDER_LOG = "eRecorderLog"

EVENT_RECORDER_UPDATE = "eRecorderUpdate"

class RecorderEngine(BaseEngine):

""""""

setting_filename = "data_recorder_setting.json"

def __init__(self, main_engine: MainEngine, event_engine: EventEngine):

""""""

super().__init__(main_engine, event_engine, APP_NAME)

self.queue = Queue()

self.thread = Thread(target=self.run)

self.active = False

self.tick_recordings = {}

self.bar_recordings = {}

self.bar_generators = {}

self.load_setting()

self.register_event()

self.start()

self.put_event()

def load_setting(self):

""""""

setting = load_json(self.setting_filename

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要安装好vnpy库,并在vnpy的安装目录下找到vn.trader\app\cta_strategy\strategy_template.py文件,这是vnpy的策略模板文件。 接下来,我们根据期货套利策略的需求,对策略模板进行修改。具体而言,我们需要重写以下方法: 1. on_init(self): 用于策略初始化,包括设置参数、订阅合约等。 2. on_start(self): 策略启动时执行的方法。 3. on_stop(self): 策略停止时执行的方法。 4. on_tick(self, tick: TickData): 处理行情数据的方法,用于更新策略的状态。 5. on_trade(self, trade: TradeData): 处理成交数据的方法。 6. on_order(self, order: OrderData): 处理委托数据的方法。 7. on_bar(self, bar: BarData): 处理K线数据的方法,用于实现基于K线的策略。 下面是一个简单的期货套利策略示例,以两个相同品种但不同到期日的期货合约为例。假设当前时间为t,合约A的到期日为t1,合约B的到期日为t2,我们的策略目标是通过买入A合约,卖出B合约来实现套利。当t1-t2的时间差小于某个阈值时,我们就认为A和B之间存在套利机会,此时我们就执行套利交易。 ```python from vnpy.app.cta_strategy import ( CtaTemplate, StopOrder, TickData, BarData, TradeData, OrderData, Direction ) class FuturesArbitrageStrategy(CtaTemplate): """""" author = "Your name" strategy_name = "FuturesArbitrageStrategy" # 策略参数 spread_threshold = 5 # 时间差阈值,以分钟为单位 # 策略变量 long_pos = 0 # 多头持仓 short_pos = 0 # 空头持仓 last_tick_A = None # A合约最新tick数据 last_tick_B = None # B合约最新tick数据 last_trade_A = None # A合约最新成交数据 last_trade_B = None # B合约最新成交数据 parameters = ["spread_threshold"] variables = [ "long_pos", "short_pos", "last_tick_A", "last_tick_B", "last_trade_A", "last_trade_B" ] def on_init(self): """ 策略初始化 """ self.write_log("策略初始化") # 订阅合约 self.subscribe(self.symbol_A, "") self.subscribe(self.symbol_B, "") def on_start(self): """ 策略启动 """ self.write_log("策略启动") def on_stop(self): """ 策略停止 """ self.write_log("策略停止") def on_tick(self, tick: TickData): """ 处理行情数据 """ if tick.vt_symbol == self.symbol_A: self.last_tick_A = tick else: self.last_tick_B = tick # 如果A和B的最新tick数据都存在,就进行套利判断 if self.last_tick_A is not None and self.last_tick_B is not None: t1 = self.last_tick_A.datetime t2 = self.last_tick_B.datetime if abs((t1 - t2).total_seconds() / 60) < self.spread_threshold: self.arbitrage() def on_trade(self, trade: TradeData): """ 处理成交数据 """ if trade.vt_symbol == self.symbol_A: self.last_trade_A = trade else: self.last_trade_B = trade def on_order(self, order: OrderData): """ 处理委托数据 """ pass def on_bar(self, bar: BarData): """ 处理K线数据 """ pass def arbitrage(self): """ 套利交易 """ # 如果A和B的最新成交数据都存在,就进行套利交易 if self.last_trade_A is not None and self.last_trade_B is not None: price_A = self.last_trade_A.price price_B = self.last_trade_B.price if price_A > price_B: # A合约价格高于B合约,执行买入A合约,卖出B合约 self.buy(self.symbol_A, 1, price_A) self.short(self.symbol_B, 1, price_B) else: # A合约价格低于B合约,执行卖出A合约,买入B合约 self.short(self.symbol_A, 1, price_A) self.buy(self.symbol_B, 1, price_B) ``` 以上就是一个简单的期货套利策略的实现,可以使用vnpy的回测引擎进行回测。需要注意的是,这个策略只是一个示例,实际的套利策略需要根据具体的市场情况和交易规则进行设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值