KB / ARTICLE

外置参数与 BASE 全局变量

策略文档 · 期货版修订 R1发布于 2026-10-10

本文讲解期货策略中两类可配置参数:Params 外置参数(任务创建时填写)和 BASE_* 全局内置变量(平台自动注入)。

BASE 全局变量

期魔方在策略中会自动注入一批 BASE_* 前缀的全局变量,可直接在代码中读取:

变量名 类型 说明
BASE_MODE str 执行模式,如 "REAL" (任务)
BASE_USERID str 期货交易账户 ID
BASE_ID str 每个回测/任务后端唯一标识 ID(不在前端展示)
BASE_EXCHANGEID str 基础产品交易所,如 "simnow"
BASE_SYMBOLS list 基础产品列表,如 ['c2503', 'c2505']
BASE_SETTING dict 基础设置(含合约、周期、回测/任务参数,详见下文)
BASE_LOG_DATA list 日志数据
BASE_LOG object 写日志对象
BASE_SYMBOLS_INFO dict 产品细则对象
SYMBOLS_TICKS dict 获取产品 tick 的对象
BASE_SYMBOL_TICK dict 基础产品最新 tick 对象(字段见下文)
QMF_SUBSCRIBE_SYMBOLS str 多产品调用申明,格式:合约id1:周期1&合约id2:周期2

使用示例:

# 打印 BASE_USERID
print(BASE_USERID)
# 通过 get_userinfo() 补充更多期魔方用户信息
user = get_userinfo()

BASE_SETTING 字段详解

BASE_SETTING 为 dict,回测与任务(实盘)两种场景下包含的字段不同。

回测中:

键名 类型 说明
Instrument str 合约代码,如 "jd888"
Period str 运行周期,如 "10分钟"
StartTime str 回测开始时间,如 '2025-04-16'
EndTime str 回测结束时间,如 '2025-04-18'
BackTestMode str 回测模式,如 'on_bar'
Balance str 资金,如 1000000
MarginRatio str 保证金率,如 '15.00'
RatioByMoney str 按比例计算手续费费率,如 0.015
RatioByVolume str 按手数计算手续费,如 3
bPeriod str 交易周期,如 'M10'

任务中:

键名 类型 说明
Instrument str 合约代码,如 "jd888"
Period str 运行周期,如 "10分钟"
UserID str 当前登录的期货账户 ID,如 '123456'
bPeriod str 交易周期,如 'M10'

使用示例:

def on_init(context):
    context.base_instrument_id = BASE_SETTING.get("Instrument")  # 获取运行合约名称
    context.base_period = BASE_SETTING.get("bPeriod")  # 获取运行合约周期

BASE_SYMBOL_TICK 字段详解

BASE_SYMBOL_TICK 为基础产品运行 tick 对象,可获取当前基础产品的最新 tick。常用字段如下:

键名 说明
AskPrice1 申卖价一
AskPrice2 申卖价二
AskPrice3 申卖价三
AskPrice4 申卖价四
AskPrice5 申卖价五
AskVolume1 申卖量一
AskVolume2 申卖量二
AskVolume3 申卖量三
AskVolume4 申卖量四
AskVolume5 申卖量五
BidPrice1 申买价一
BidPrice2 申买价二
BidPrice3 申买价三
BidPrice4 申买价四
BidPrice5 申买价五
BidVolume1 申买量一
BidVolume2 申买量二
BidVolume3 申买量三
BidVolume4 申买量四
BidVolume5 申买量五
AveragePrice 当日均价
BandingLowerPrice 设定更低价格区间
BandingUpperPrice 设定更高价格区间
ClosePrice 今收盘
CurrDelta 今虚实度
ExchangeID 交易所代码
ExchangeInstID 合约在交易所的代码
HighestPrice 最高价
InstrumentID 合约代码
LastPrice 最新价
LowerLimitPrice 跌停板价
LowestPrice 最低价
OpenInterest 持仓量
OpenPrice 今开盘
PreClosePrice 昨收盘
PreDelta 昨虚实度
PreOpenInterest 昨持仓量
PreSettlementPrice 上次结算价
SettlementPrice 本次结算价
TradingDay 交易日
Turnover 成交金额
UpdateMillisec 更新毫秒数
UpdateTime 最后修改时间
UpperLimitPrice 涨停板价
Volume 数量
reserve1 / reserve2 保留字段
time_value 时间价值
intrinsic_value 内在价值
implicit_volatility 隐含波动率
leverage 杠杆比率
premium 溢价率
real_leverage 真实杠杆率
theory_price 理论价格
delta / gamma / rho / theta / vega 期权希腊字母

使用示例:

def on_tick(context):
    last_price = BASE_SYMBOL_TICK.get("LastPrice")  # 最新价
    bid1 = BASE_SYMBOL_TICK.get("BidPrice1")  # 申买价一
    ask1 = BASE_SYMBOL_TICK.get("AskPrice1")  # 申卖价一

外置参数(Params 类)

外置参数通过 pydantic.BaseModel 定义,在任务创建时可以通过 UI 界面配置,修改后不需要重新编译代码。

基本写法

from pydantic import BaseModel, Field


class Params(BaseModel, validate_assignment=True):
    """策略外置参数配置"""

    # 订阅合约:用 & 分隔多个品种,每个品种 : 后接周期
    QMF_SUBSCRIBE_SYMBOLS: str = Field(
        default="rb2510:D1&ag2510:D1",
        title="订阅合约"
    )

    # 交易参数
    volume: int = Field(default=1, title="每次交易手数")
    stop_loss: float = Field(default=0.02, title="止损比例")
    take_profit: float = Field(default=0.05, title="止盈比例")

    # 策略开关
    enable_log: bool = Field(default=True, title="启用日志")

    # 下拉条参数:default 格式为 {"options": [...], "value": 默认选中值}
    signal_mode: dict = Field(
        default={"options": ["金叉死叉", "突破", "反转"], "value": "金叉死叉"},
        title="信号模式"
    )

参数映射模型详解

Params 类支持以下字段类型:

类型 说明 UI 表现
str 字符串 文本输入框
int 整数 数字输入框
float 浮点数 数字输入框
bool 布尔 开关 / 复选框
dict 字典(格式:{"options": [...], "value": 默认值}) 下拉条

Field 参数:

参数 说明
default 默认值
title 中文标签(UI 上显示的名称)

多品种多周期支持

期魔方策略通过 QMF_SUBSCRIBE_SYMBOLS 这个全局变量实现多品种订阅,格式为:

品种代码:周期&品种代码:周期&品种代码:周期

示例:

class Params(BaseModel, validate_assignment=True):
    QMF_SUBSCRIBE_SYMBOLS: str = Field(
        default="rb2510:D1&ag2510:M15&cu2510:H1",
        title="订阅合约"
    )

注意:

订阅多周期时只支持特定的周期,不支持自定义周期。 支持的周期:5秒 "S5"、10秒 "S10"、15秒 "S15"、30秒 "S30"、1分钟 "M1"、3分钟 "M3"、5分钟 "M5"、10分钟 "M10"、 15分钟 "M15"、30分钟 "M30"、45分钟 "M45"、1小时 "H1"、2小时 "H2"、4小时 "H4"、"1天 "D1"、1周 "W1"。 另外,在回测中,由于秒周期只能在真实tick下回测,因此当多周期订阅秒级周期时只能选择真实tick回测。

在代码中读取外置参数

外置参数通过 context.xxx 访问:

def on_bar(context):
    volume = context.volume 
    stop_loss = context.stop_loss
    subscribe_str = QMF_SUBSCRIBE_SYMBOLS
    print(f"订阅品种字符串: {subscribe_str}")

多品种解析示例

def on_init(context):
    symbol_periods = QMF_SUBSCRIBE_SYMBOLS.split("&")
    context.symbols = []
    for sp in symbol_periods:
        parts = sp.split(":")
        if len(parts) == 2:
            context.symbols.append({'symbol': parts[0], 'period': parts[1]})
    print(f"已订阅 {len(context.symbols)} 个品种")

相关阅读

  • [策略生命周期与回调函数]
  • [核心API 实时行情数据]
  • [核心API 历史K线数据]
  • [核心API 账户持仓查询]
  • [核心API 衍生数据]
  • [核心API 合约信息查询]
已复制到剪贴板
策略文档 · 期货版修订 R1

返回策略文档 · 期货版板块

评论