本文讲解期货策略中两类可配置参数:
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 合约信息查询]

评论
登录后参与讨论,与站内账号体系共用。