问题描述
解决方案
您好!在 PTrade 量化交易平台中,进行股票买卖和撤单主要依赖于 order 系列函数和 cancel_order 函数。
以下是针对您需求的详细说明和代码示例。
核心函数说明
-
按数量买卖 (
order)- 功能:买入或卖出指定数量的股票。
- 用法:
order(security, amount, limit_price=None) - 参数:
amount:正数代表买入(如100),负数代表卖出(如-100)。limit_price:可选。如果不填,则按市价(回测中通常是收盘价或开盘价,实盘为最新价)下单;如果填了,则是限价单。
-
调整至目标持仓 (
order_target)- 功能:自动计算买卖数量,使持仓调整到指定的目标数量。
- 用法:
order_target(security, amount, limit_price=None) - 场景:比如您当前持有 500 股,想减仓到 200 股,直接调用
order_target(security, 200),系统会自动卖出 300 股。如果想清仓,则设为 0。
-
取消订单 (
cancel_order)- 功能:取消尚未成交的挂单。
- 用法:
cancel_order(order_id) - 前提:需要获取下单时返回的
order_id,或者通过get_open_orders()获取未完成的订单对象。
完整策略代码示例
您可以将以下代码复制到 PTrade 的策略编辑区进行回测或模拟运行。
def initialize(context):
# 初始化设置
g.security = '600570.SS' # 设置我们要操作的股票:恒生电子
set_universe(g.security) # 设置股票池
# 设置一个标志位,用于演示流程控制
g.step = 0
def handle_data(context, data):
# 获取当前股票代码
security = g.security
# ---------------------------------------------------
# 场景 1:买入指定数量 (例如买入 100 股)
# ---------------------------------------------------
if g.step == 0:
log.info("步骤1:尝试买入 100 股")
# 下单买入 100 股,不设限价(市价单)
order(security, 100)
g.step = 1 # 进入下一步
# ---------------------------------------------------
# 场景 2:演示挂单与撤单
# ---------------------------------------------------
elif g.step == 1:
log.info("步骤2:演示挂单与撤单")
# 获取当前价格
current_price = data[security]['close']
# 故意以一个极低的价格买入,形成“未成交”的挂单
limit_price = current_price * 0.9
# order 函数会返回一个 order_id
order_id = order(security, 100, limit_price=limit_price)
log.info("已下限价单,订单ID: %s,价格: %s" % (order_id, limit_price))
# 立即撤销刚才下的这笔订单
if order_id is not None:
cancel_order(order_id)
log.info("已请求撤销订单: %s" % order_id)
g.step = 2 # 进入下一步
# ---------------------------------------------------
# 场景 3:调整持仓到指定数量 (例如清仓/卖出到0)
# ---------------------------------------------------
elif g.step == 2:
# 获取当前持仓信息
position = get_position(security)
log.info("当前持仓数量: %s" % position.amount)
if position.amount > 0:
log.info("步骤3:触发清仓操作,目标持仓为 0")
# 无论当前有多少股,直接调整目标持仓为 0,系统会自动计算卖出数量
order_target(security, 0)
g.step = 3 # 演示结束
# 打印当前持仓情况
pos = get_position(security)
log.info("当前持仓状态 -> 股票: %s, 数量: %s, 成本: %s" % (pos.sid, pos.amount, pos.cost_basis))
代码关键点解析
-
order(security, 100):- 这是最基础的下单指令。
- 注意:A股买入必须是 100 的整数倍(1手)。
-
order_target(security, 0):- 非常实用的函数。如果您想卖出所有持仓,不需要先查询当前有多少股再填入
order的负数,直接用order_target设为 0 即可。 - 同理,如果您想加仓到固定仓位(例如总共想持有 1000 股,不管现在有 0 股还是 500 股),也可以直接写
order_target(security, 1000)。
- 非常实用的函数。如果您想卖出所有持仓,不需要先查询当前有多少股再填入
-
cancel_order(order_id):- 在实盘或模拟交易中,下单后如果价格未达到限价,订单会处于“已报”或“待报”状态。此时可以使用此函数撤单。
- 在回测中,如果使用市价单通常会立即成交,无法撤单;只有使用限价单且价格未触发时才能撤单。
-
get_position(security):- 用于查询当前的持仓详情,包含
amount(总持仓)、enable_amount(可用持仓) 等属性。
- 用于查询当前的持仓详情,包含
希望这个示例能帮助您理解 PTrade 的基础交易操作!如有其他问题,欢迎继续提问。