title: 交易经纪商 API description: 完整的经纪商类 API 参考文档


交易经纪商 API

Broker 类负责 Backtrader 中的订单执行、持仓跟踪和资金管理。它在回测期间模拟经纪商行为,支持多种订单类型、佣金方案和保证金要求。

类定义

class backtrader.BrokerBase:
    """经纪商实现的基类。"""

class backtrader.brokers.BackBroker:
    """回测用的经纪商模拟器(别名:BrokerBack)。"""

```bash

## 经纪商参数

### `cash`(默认:10000.0)

回测的初始资金

```python
cerebro = bt.Cerebro()
cerebro.broker.setcash(100000.0)

```bash

### `commission`(默认:CommInfoBase(percabs=True))

所有资产的默认佣金方案

```python

# 百分比佣金

cerebro.broker.setcommission(commission=0.001)  # 0.1%

# 固定佣金

cerebro.broker.setcommission(commission=2.0, commtype=bt.CommInfoBase.COMM_FIXED)

```bash

### `checksubmit`(默认:True)

是否在接受订单前检查保证金/资金

### `eosbar`(默认:False)

将与收盘时间相同的柱视为收盘柱

### `filler`(默认:None)

用于部分订单执行的数量填充器可调用对象

### 滑点参数

| 参数 | 类型 | 默认值 | 描述 |

|-----------|------|---------|-------------|

| `slip_perc` | float | 0.0 | 百分比滑点0.01 = 1% |

| `slip_fixed` | float | 0.0 | 固定滑点价格单位 |

| `slip_open` | bool | False | 对开盘价格应用滑点 |

| `slip_match` | bool | True | 将滑点限制在最高/最低价格 |

| `slip_limit` | bool | True | 允许限价订单与滑点匹配 |

| `slip_out` | bool | False | 在最高-最低范围外提供滑点 |

### `coc`(默认:False)

作弊收盘将市价订单与同一柱的收盘价匹配

### `coo`(默认:False)

作弊开盘将市价订单与开盘价匹配

### `fundmode` / `fundstartval`(默认:False / 100.0)

类基金业绩跟踪模式

## 资金和价值方法

### `getcash()` / `get_cash()`

获取当前可用资金

```python
cash = cerebro.broker.getcash()

# 或从策略中

cash = self.broker.getcash()

```bash

### `setcash(amount)` / `set_cash(amount)`

设置经纪商资金金额

```python
cerebro.broker.setcash(100000.0)

```bash

### `getvalue(datas=None)` / `get_value(datas=None)`

获取投资组合价值如果 `datas`  None则返回总投资组合价值

```python

# 总价值

total_value = self.broker.getvalue()

# 特定数据的价值

data_value = self.broker.getvalue([self.data])

```bash

### `add_cash(amount)` / `add_cash(amount)`

向系统添加或移除资金

```python

# 添加资金

cerebro.broker.add_cash(50000.0)

# 移除资金

cerebro.broker.add_cash(-10000.0)

```bash

## 持仓管理

### `getposition(data)`

获取特定数据源的持仓

```python
position = self.broker.getposition(self.data)
size = position.size  # 正值=多头,负值=空头

price = position.price  # 平均入场价格

```bash

- *持仓属性**

| 属性 | 类型 | 描述 |

|-----------|------|-------------|

| `size` | float | 持仓规模正值=多头负值=空头 |

| `price` | float | 平均入场价格 |

| `price_adj` | float | 调整后价格用于股票 |

| `adjbase` | float | 期货的调整基准 |

## 佣金设置

### `setcommission(...)`

设置交易的佣金方案

```python

# 股票类 + 百分比佣金

cerebro.broker.setcommission(
    commission=0.001,      # 0.1% 佣金
    stocklike=True
)

# 期货 + 保证金 + 固定佣金

cerebro.broker.setcommission(
    commission=2.0,        # 每张合约 $2
    margin=5000,           # 每张合约 $5000 保证金
    mult=10,               # 乘数
    stocklike=False,       # 期货
    commtype=bt.CommInfoBase.COMM_FIXED
)

# 杠杆交易

cerebro.broker.setcommission(
    commission=0.0005,
    leverage=2.0,          # 2 倍杠杆
    margin=0.5             # 50% 保证金

)

```bash

- *参数**

| 参数 | 类型 | 默认值 | 描述 |

|-----------|------|---------|-------------|

| `commission` | float | 0.0 | 佣金金额 |

| `margin` | float | None | 保证金要求 |

| `mult` | float | 1.0 | 价值/利润的乘数 |

| `commtype` | int | None | COMM_PERC (0)  COMM_FIXED (1) |

| `stocklike` | bool | False | 股票类 (True) 或期货类 (False) |

| `percabs` | bool | True | 百分比为绝对值 (0.01 = 1%) |

| `interest` | float | 0.0 | 空头年利率 |

| `leverage` | float | 1.0 | 杠杆乘数 |

| `automargin` | bool/float | False | 自动保证金计算 |

| `name` | str | None | 资产名称None = 默认 |

### `addcommissioninfo(comminfo, name=None)`

添加自定义 CommissionInfo 对象

```python
class MyCommInfo(bt.CommInfoBase):
    def _getcommission(self, size, price, pseudoexec):
        return abs(size) * 5.0  # 固定 $5 佣金

cerebro.broker.addcommissioninfo(MyCommInfo(), name='AAPL')

```bash

## 订单管理

### `buy(owner, data, size, **kwargs)`

创建买单

```python

# 从策略中

order = self.buy(size=10)

# 从 cerebro 中

order = cerebro.broker.buy(
    owner=strategy,
    data=data,
    size=10,
    price=100.0
)

```bash

- *参数**

| 参数 | 类型 | 默认值 | 描述 |

|-----------|------|---------|-------------|

| `owner` | Strategy | 必需 | 创建订单的策略 |

| `data` | Data feed | 必需 | 订单的数据源 |

| `size` | float | 必需 | 订单规模正数 |

| `price` | float | None | 限价 |

| `plimit` | float | None | 止损限价的限价 |

| `exectype` | Order.ExecType | None | 执行类型 |

| `valid` | Order.Valid | None | 有效期 |

| `tradeid` | int | 0 | 交易标识符 |

| `oco` | Order | None | 一键取消其他订单 |

| `trailamount` | float | None | 追踪金额 |

| `trailpercent` | float | None | 追踪百分比 |

| `parent` | Order | None | 父订单括号订单 |

| `transmit` | bool | True | 立即传输 |

### `sell(owner, data, size, **kwargs)`

创建卖单参数与 `buy()` 相同

```python

# 卖出全部持仓

order = self.sell()

# 止损

order = self.sell(price=95.0, exectype=bt.Order.Stop)

```bash

### `cancel(order, bracket=False)`

取消挂单

```python
self.cancel(order)

```bash

### `get_orders_open(safe=False)`

获取挂单的可迭代对象

```python

# 获取订单(只读)

open_orders = self.broker.get_orders_open()

# 获取可编辑副本

open_orders = self.broker.get_orders_open(safe=True)

```bash

## 订单类型

### 市价单

以下一个可用价格执行

```python
order = self.buy()  # 市价单

```bash

### 限价单

以指定价格或更优价格执行

```python

# 以 100 或更低价格买入

order = self.buy(price=100.0, exectype=bt.Order.Limit)

```bash

### 止损单

当止损价达到时转换为市价单

```python

# 止损价 95

order = self.sell(price=95.0, exectype=bt.Order.Stop)

```bash

### 止损限价单

当止损价达到时转换为限价单

```python

# 止损 95,限价 94.5

order = self.sell(price=94.5, plimit=95.0, exectype=bt.Order.StopLimit)

```bash

### 收盘单

在交易日收盘价格执行

```python
order = self.buy(exectype=bt.Order.Close)

```bash

### 追踪止损单

止损价格随价格变动调整

```python
order = self.sell(trailamount=2.0, exectype=bt.Order.StopTrail)
order = self.sell(trailpercent=0.05, exectype=bt.Order.StopTrail)

```bash

## 滑点配置

### 百分比滑点

```python
cerebro.broker.set_slippage_perc(
    perc=0.001,        # 0.1% 滑点
    slip_open=True,
    slip_limit=True,
    slip_match=True,
    slip_out=False
)

```bash

### 固定滑点

```python
cerebro.broker.set_slippage_fixed(
    fixed=0.02,        # 每股 $0.02
    slip_open=True,
    slip_limit=True,
    slip_match=True
)

```bash

## 基金模式

### `set_fundmode(fundmode, fundstartval=None)`

启用类基金业绩跟踪

```python

# 启用基金模式,初始净值 $100

cerebro.broker.set_fundmode(True, fundstartval=100.0)

# 获取基金价值

fund_value = cerebro.broker.get_fundvalue()
fund_shares = cerebro.broker.get_fundshares()

```bash

### `set_fundstartval(fundstartval)`

设置基金跟踪的起始值

```python
cerebro.broker.set_fundstartval(100.0)

```bash

## 其他配置方法

### `set_coc(coc)`

启用/禁用作弊收盘

```python
cerebro.broker.set_coc(True)  # 允许当日执行

```bash

### `set_coo(coo)`

启用/禁用作弊开盘

```python
cerebro.broker.set_coo(True)

```bash

### `set_checksubmit(checksubmit)`

启用/禁用提交前的资金/保证金检查

```python
cerebro.broker.set_checksubmit(False)  # 禁用检查

```bash

### `set_filler(filler)`

设置部分执行的数量填充器

```python
def my_filler(order, price, ago):

# 基于成交量返回可执行数量
    volume = order.data.volume[ago]
    return min(order.executed.remsize, volume *0.1)

cerebro.broker.set_filler(my_filler)

```bash

## 历史订单

### `add_order_history(orders, notify=True)`

向经纪商添加历史订单

```python

# 格式:[datetime, size, price, data_index]

orders = [
    [datetime(2023, 1, 1), 100, 150.0, 0],
    [datetime(2023, 1, 2), -100, 155.0, 0],
]
cerebro.broker.add_order_history(orders, notify=False)

```bash

### `set_fund_history(fund)`

设置用于跟踪的基金历史

```python

# 格式:[datetime, share_value, net_asset_value]

fund_history = [
    [datetime(2023, 1, 1), 100.0, 100000.0],
    [datetime(2023, 1, 2), 101.5, 101500.0],
]
cerebro.broker.set_fund_history(fund_history)

```bash

## 佣金信息类

### CommInfoBase

基础佣金方案类

```python
comminfo = bt.CommInfoBase(
    commission=0.001,
    margin=5000,
    mult=10,
    stocklike=False,
    commtype=bt.CommInfoBase.COMM_PERC,
    leverage=2.0
)

```bash

### CommissionInfo

标准佣金方案默认 percabs=True)。

### ComminfoDC

数字货币佣金方案

```python
cerebro.broker.setcommission(
    commission=0.001,
    margin=0.1,
    mult=10,
    interest=3.0
)

```bash

### ComminfoFuturesPercent

期货百分比佣金

### ComminfoFuturesFixed

期货固定佣金

### ComminfoFundingRate

永续合约的资金费率

## 内置经纪商实现

### BackBroker

默认的回测经纪商

```python

# 自动(默认)

cerebro = bt.Cerebro()

# 手动

broker = bt.brokers.BackBroker(cash=100000)
cerebro.setbroker(broker)

```bash

### CCXTBroker

加密货币交易所经纪商需要 ccxt)。

```python
import ccxt
exchange = ccxt.binance()

broker = bt.brokers.CCXTBroker(
    exchange=exchange,
    wallet_exposure=0.33  # 使用 33% 的钱包

)
cerebro.setbroker(broker)

```bash

### CTPBroker

中国期货经纪商需要 ctpbee)。

### IBBroker

Interactive Brokers 经纪商需要 ibpy)。

### OandaBroker

OANDA 经纪商需要 oandapy)。

### VCBroker

VisualChart 经纪商

## 完整示例

```python
import backtrader as bt
from datetime import datetime

class MyStrategy(bt.Strategy):
    def __init__(self):
        self.sma = bt.indicators.SMA(self.data.close, period=20)
        self.order = None

    def next(self):
        if self.order:
            return

        if not self.position:
            if self.data.close[0] > self.sma[0]:

# 使用限价单买入
                cash = self.broker.getcash()
                size = int(cash / self.data.close[0]*0.95)
                self.order = self.buy(
                    size=size,
                    price=self.data.close[0]*0.99,
                    exectype=bt.Order.Limit
                )
        else:
            if self.data.close[0] < self.sma[0]:

# 使用止损卖出
                self.order = self.sell(
                    size=self.position.size,
                    exectype=bt.Order.Stop,
                    price=self.position.price* 0.95
                )

    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            return

        if order.status == order.Completed:
            if order.isbuy():
                print(f'买入: {order.executed.size:.2f} @ {order.executed.price:.2f}')
            else:
                print(f'卖出: {order.executed.size:.2f} @ {order.executed.price:.2f}')

        self.order = None

    def notify_trade(self, trade):
        if trade.isclosed:
            print(f'交易盈亏: {trade.pnl:.2f}, 佣金: {trade.commission:.2f}')

# 创建 cerebro

cerebro = bt.Cerebro()

# 添加策略

cerebro.addstrategy(MyStrategy)

# 添加数据

data = bt.feeds.YahooFinanceData(dataname='AAPL', fromdate=datetime(2020, 1, 1))
cerebro.adddata(data)

# 设置经纪商参数

cerebro.broker.setcash(100000.0)
cerebro.broker.setcommission(commission=0.001)  # 0.1%

# 设置滑点

cerebro.broker.set_slippage_perc(perc=0.0005)  # 0.05%

# 运行

result = cerebro.run()
print(f'最终价值: {cerebro.broker.getvalue():.2f}')

```bash

## 下一步

- [策略 API](strategy_zh.md) - 交易策略
- [指标 API](indicator_zh.md) - 技术指标
- [分析器 API](analyzer_zh.md) - 绩效分析
- [数据源 API](data-feeds_zh.md) - 数据源