问题描述
我每天都需要手动申购新股,有没有办法用代码实现一键申购当天所有可打的新股和新债?
解决方案
在PTrade中,可以使用 ipo_stocks_order 函数来实现一键申购当日所有新股和新债。
这是一个纯交易功能的策略,不需要复杂的逻辑分析。我们可以通过 run_daily 函数设置一个定时任务(例如每天上午10:15),自动调用申购接口。
以下是完整的策略代码:
import time
def initialize(context):
"""
策略初始化函数
"""
# 设置每天上午 10:15 执行自动申购任务
# 建议避开开盘9:30的流量高峰,选择盘中时间
run_daily(context, auto_ipo_task, time='10:15')
def auto_ipo_task(context):
"""
自动申购执行函数
"""
log.info("========== 开始执行今日新股/新债一键申购 ==========")
# PTrade API: ipo_stocks_order(market_type=None, black_stocks=None)
# market_type参数说明:
# 0: 上证普通代码
# 1: 上证科创板代码
# 2: 深证普通代码
# 3: 深证创业板代码
# 4: 可转债代码
# 定义需要申购的市场类型列表
targets = [
(0, "上证普通股"),
(1, "上证科创板"),
(2, "深证普通股"),
(3, "深证创业板"),
(4, "可转债")
]
for m_type, m_name in targets:
try:
log.info("正在发起申购: %s" % m_name)
# 调用一键申购接口
ipo_stocks_order(market_type=m_type)
# 为了防止请求发送过快导致柜台拥堵,建议每次请求间暂停几秒
time.sleep(3)
except Exception as e:
log.error("申购 %s 时发生异常: %s" % (m_name, str(e)))
log.info("========== 今日申购任务执行完毕 ==========")
def handle_data(context, data):
# 该策略仅用于打新,无需在盘中处理行情数据
pass
代码说明:
initialize: 使用run_daily设置定时任务。这里设置为10:15,你也可以根据需要修改为其他交易时间段(如14:00)。auto_ipo_task: 这是自定义的执行函数。- 虽然
ipo_stocks_order()不传参数默认会申购全部,但为了让日志更清晰,以及避免瞬间向柜台发送过多请求,代码中将不同板块(沪深主板、科创板、创业板、可转债)分开循环调用。 time.sleep(3): 在每次申购之间增加了3秒的延时,这是一种保护机制,防止因请求频率过高被系统拒绝。
- 虽然
ipo_stocks_order: 这是PTrade专门用于打新的API,它会自动检测当日可申购的标的并按顶格(或资金允许的最大数量)进行申购。
注意事项:
- 适用环境:此代码仅在**交易(实盘/仿真)**模块有效,回测模式下无法进行打新操作。
- 资金要求:申购新股需要持有对应的底仓市值(T-2日),申购可转债(代码尾缀为4)通常不需要底仓和预缴款(中签后缴款),具体规则请以交易所和券商规定为准。
- 黑名单:如果你不想申购某只特定的新股,可以在
ipo_stocks_order中传入black_stocks=['股票代码']参数。