
等级: 新手上路
- 注册:
- 2025-3-11
- 曾用名:
|
# -*- coding: utf-8 -*-
from PythonApi import *
import numpy as np
from datetime import datetime, timedelta
# 金字塔环境适配修改 -------------------------------------------------
try:
# 尝试加载金字塔内置的vnpy模块
from vnpy.trader.utility import BarData
from vnpy.app.cta_strategy import CtaTemplate
except ImportError:
# 如果失败则使用精简版策略模板
class CtaTemplate:
def __init__(self, *args, **kwargs):
self.engine = kwargs.get('cta_engine')
self.strategy_name = kwargs.get('strategy_name')
self.vt_symbol = kwargs.get('vt_symbol')
def on_init(self): pass
def on_start(self): pass
def on_stop(self): pass
def put_event(self): pass
class MyStrategy(CtaTemplate):
def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
"""符合金字塔7.1的初始化方法"""
super().__init__(cta_engine, strategy_name, vt_symbol, setting)
# 策略参数配置
self.total_capital = 1000000
self.etf_list = [ # 直接指定ETF列表
'510300.SH',
'510050.SH',
'159915.SZ',
'588000.SH',
'510500.SH',
'159901.SZ'
]
self.position_records = {}
# 金字塔7.1专用订阅方法
self.Subscribe = self.cta_engine.Subscribe # 从引擎获取订阅方法
def on_init(self):
"""策略初始化"""
self.write_log("策略启动")
self.subscribe_blocks()
def subscribe_blocks(self):
"""金字塔7.1合规订阅方法"""
try:
# 订阅ETF行情
for etf in self.etf_list:
self.Subscribe(etf, '1d', self.on_bar)
self.write_log(f"ETF订阅成功: {etf}")
# 订阅认购期权
calls = get_options(etf, 'CALL')
for call in calls[:5]: # 前5个活跃合约
vt_symbol = self.format_option_symbol(call)
self.Subscribe(vt_symbol, '1m', self.on_bar)
self.write_log(f"期权订阅成功: {vt_symbol}")
except Exception as e:
self.write_log(f"订阅失败: {str(e)}")
def _format_option_symbol(self, option):
"""生成金字塔标准期权代码"""
# 示例: 510300C2209M03500 -> 510300.SH-202209-C-3.500
return (
f"{option.underlying}.SH-"
f"{option.expiry}-"
f"C-"
f"{option.strike_price/1000:.3f}"
)
def on_bar(self, bar):
"""行情回调"""
try:
if 'SH-' in bar.symbol or 'SZ-' in bar.symbol: # 期权
self._process_option(bar)
else: # ETF
self._process_etf(bar)
except Exception as e:
self.write_log(f"on_bar错误: {str(e)}")
# 后续处理函数保持不变。。。。。。。#金字塔初始化函数保持不变
def init(context):
context.strategy = MyStrategy(
cta_engine=context, # 参数名修正
strategy_name="ETF_CALL_SELLER",
vt_symbol="510300.SH,510050.SH", # 参数名修正为vt_symbol
setting={}
)
context.strategy.on_init()
def handle_bar(context):
context.strategy.handle_bar(context)
|
|