pyeventbt

PyPI version Python versions License: Apache 2.0 Code style: black

PyEventBT 是一个机构级的事件驱动回测与实盘交易框架,基于 Python 构建,原生对接 MetaTrader 5 平台。

框架提供了完整的 MT5 API 模拟层,使回测与实盘之间可以无缝切换,让交易者能够轻松开发多规则、多周期、多品种的交易策略。

无论你是构建简单的均线交叉策略,还是复杂的多规则、多周期策略,PyEventBT 都能为你提供开发、测试和部署所需的全部工具。

其模块化架构允许你将信号源、仓位管理逻辑和风控层设计为独立且可互换的组件。

为什么选择 PyEventBT?

如果你希望用 Python 连接 MetaTrader 5 进行算法交易,PyEventBT 为你提供了一套完整的事件驱动回测与实盘交易框架,无需编写任何 MQL5 代码。

它的核心设计理念是 一套代码,两种模式:框架提供了完整的 MT5 API 模拟,因此你在回测中使用的策略代码无需修改即可直接用于实盘交易。这从根本上消除了回测与实盘表现不一致的常见问题,让你可以专注于策略逻辑,而非基础设施。

  • 原生 MT5 集成 — 将 Python 连接至 MetaTrader 5,实现实时订单执行、仓位管理和实时数据获取
  • 真实回测 — 事件驱动处理确保策略只看到当前时刻可用的数据,从设计上杜绝了前视偏差
  • 模块化引擎 — 信号生成、仓位管理和风控逻辑均可作为独立且可互换的组件自由插拔
  • 全面多维度 — 在单个策略中同时处理多个时间周期、多个品种和多个交易规则
  • Python 生态 — 基于 Polars、NumPy 和 Pandas 构建,可在策略中使用任何 Python 库

核心概念

PyEventBT 通过事件管道处理市场数据。你只需编写信号逻辑——框架负责处理其余一切:

BarEvent → 你的策略 → SignalEvent → 仓位引擎 → 风控引擎 → OrderEvent → 执行引擎 → FillEvent → 投资组合
组件 功能说明
信号引擎(Signal Engine) 你的策略逻辑——接收市场数据,返回交易信号
仓位引擎(Sizing Engine) 计算仓位大小(最小手数、固定手数或基于风险百分比)
风控引擎(Risk Engine) 在订单执行前,根据风控规则验证订单有效性
执行引擎(Execution Engine) 将订单路由至模拟经纪商(回测)或 MT5(实盘)
投资组合(Portfolio) 跟踪持仓、余额、权益和盈亏
数据提供者(Data Provider) 提供历史K线数据(CSV)或实时数据(MT5)

安装

pip install pyeventbt

快速开始

以下为简要指南。完整文档请访问 pyeventbt.com。

1. 定义你的策略

使用 @strategy.custom_signal_engine 装饰器来创建策略。

from pyeventbt import (
    Strategy,
    BarEvent,
    SignalEvent,
    Modules,
    StrategyTimeframes,
    PassthroughRiskConfig,
    MinSizingConfig
)
from pyeventbt.events.events import OrderType, SignalType
from pyeventbt.strategy.core.account_currencies import AccountCurrencies
from pyeventbt.indicators import SMA

from datetime import datetime
from decimal import Decimal
import logging

logger = logging.getLogger("pyeventbt")

# 策略配置
strategy_id = "123456"
strategy = Strategy(logging_level=logging.INFO)

# 时间周期
signal_timeframe = StrategyTimeframes.ONE_DAY

strategy_timeframes = [signal_timeframe]

# 交易配置
symbols_to_trade = ['EURUSD']
starting_capital = 100000

# 策略参数
fast_ma_period = 10
slow_ma_period = 30

@strategy.custom_signal_engine(strategy_id=strategy_id, strategy_timeframes=strategy_timeframes)
def ma_crossover_strategy(event: BarEvent, modules: Modules):
    """
    均线优势策略:
    - 快线在慢线之上时持有多头
    - 快线在慢线之下时持有空头
    - 两线相等时平仓(或保持当前仓位)
    - 始终最多持有一个未平仓仓位
    """
    
    if event.timeframe != signal_timeframe:
        return
    
    symbol = event.symbol

    signal_events = []
    
    # 获取计算均线所需的K线数据
    bars_needed = slow_ma_period + 10
    bars = modules.DATA_PROVIDER.get_latest_bars(symbol, signal_timeframe, bars_needed)
    
    if bars is None or bars.height < bars_needed:
        return
    
    # 计算移动平均线
    close_prices = bars.select('close').to_numpy().flatten()
    fast_ma_values = SMA.compute(close_prices, fast_ma_period)
    slow_ma_values = SMA.compute(close_prices, slow_ma_period)
    
    current_fast_ma = fast_ma_values[-1]
    current_slow_ma = slow_ma_values[-1]
    
    # 确定目标持仓状态
    if current_fast_ma > current_slow_ma:
        desired_position = "LONG"
    elif current_fast_ma < current_slow_ma:
        desired_position = "SHORT"
    else:
        return

    # 检查当前持仓(在当前K线时刻——无前视偏差)
    open_positions = modules.PORTFOLIO.get_number_of_strategy_open_positions_by_symbol(symbol)
    
    signal_type = None
    
    
    # 信号生成
    if open_positions['LONG'] == 0 and desired_position == "LONG":
        if open_positions['SHORT'] > 0:
            modules.EXECUTION_ENGINE.close_strategy_short_positions_by_symbol(symbol)
        signal_type = SignalType.BUY

    if open_positions['SHORT'] == 0 and desired_position == "SHORT":
        if open_positions['LONG'] > 0:
            modules.EXECUTION_ENGINE.close_strategy_long_positions_by_symbol(symbol)
        signal_type = SignalType.SELL
    
    if signal_type == None:
        return
    
    # 信号生成时间(针对下一根K线)
    if modules.TRADING_CONTEXT == "BACKTEST":
        time_generated = event.datetime + signal_timeframe.to_timedelta()
    else:
        time_generated = datetime.now()

    last_tick = modules.DATA_PROVIDER.get_latest_tick(symbol)
    
    # 根据目标持仓生成信号
    signal_events.append(SignalEvent(
        symbol=symbol,
        time_generated=time_generated,
        strategy_id=strategy_id,
        signal_type=signal_type,
        order_type=OrderType.MARKET,
        order_price=last_tick['ask'] if signal_type == SignalType.BUY else last_tick['bid'],
        sl=Decimal(str(0.0)),
        tp=Decimal(str(0.0)),
    ))
    
    return signal_events

2. 配置并运行回测


# 配置策略
strategy.configure_predefined_sizing_engine(MinSizingConfig())
strategy.configure_predefined_risk_engine(PassthroughRiskConfig())

# 回测配置
from_date = datetime(year=2020, month=1, day=1)
to_date = datetime(year=2023, month=12, day=1)
# csv_dir = './data'  # 替换为你自己的 CSV 数据路径
csv_dir = None  # 如果没有 CSV 数据,可以设置为 None

# 启动回测
backtest = strategy.backtest(
    strategy_id=strategy_id,
    initial_capital=starting_capital,
    symbols_to_trade=symbols_to_trade,
    csv_dir=csv_dir,
    backtest_name=strategy_id,
    start_date=from_date,
    end_date=to_date,
    export_backtest_parquet=False,
    account_currency=AccountCurrencies.USD
)

backtest.plot()

示例策略

以下是一个完整的布林带突破策略示例:

from pyeventbt import (
    Strategy,
    BarEvent,
    SignalEvent,
    Modules,
    StrategyTimeframes,
    PassthroughRiskConfig,
    MinSizingConfig
)
from pyeventbt.events.events import OrderType, SignalType
from pyeventbt.indicators.indicators import BollingerBands
from pyeventbt.strategy.core.account_currencies import AccountCurrencies

from datetime import datetime, time
from decimal import Decimal
import logging
import numpy as np

logger = logging.getLogger("pyeventbt")

# 策略配置
strategy_id = "1234"
strategy = Strategy(logging_level=logging.INFO)

# 时间周期
signal_timeframe = StrategyTimeframes.ONE_HOUR
daily_timeframe = StrategyTimeframes.ONE_DAY

strategy_timeframes = [signal_timeframe, daily_timeframe]

# 交易配置
symbols_to_trade = ['EURUSD']
starting_capital = 100000

# 策略参数
bb_period = 20
bb_std_dev = 2.5
close_hour = 21
close_minute = 0
order_placement_hour = 8
order_placement_minute = 0

# 每日追踪
orders_placed_today: dict[str, bool] = {symbol: False for symbol in symbols_to_trade}
current_trading_date: dict[str, datetime|None] = {symbol: None for symbol in symbols_to_trade}


@strategy.custom_signal_engine(strategy_id=strategy_id, strategy_timeframes=strategy_timeframes)
def bbands_breakout(event: BarEvent, modules: Modules):
    """
    布林带突破策略:
    - 突破位:布林带上轨和下轨
    - 退出:21:00 全部平仓
    """
    
    symbol = event.symbol
    signal_events = []
    
    # 获取当前时间和日期
    current_time = event.datetime.time()
    current_date = event.datetime.date()
    
    # 新交易日重置每日追踪
    if current_trading_date[symbol] != current_date:
        current_trading_date[symbol] = current_date
        orders_placed_today[symbol] = False
    
    # 获取持仓和挂单
    open_positions = modules.PORTFOLIO.get_number_of_strategy_open_positions_by_symbol(symbol)
    pending_orders = modules.PORTFOLIO.get_number_of_strategy_pending_orders_by_symbol(symbol)
    
    # 在收盘时间平仓并取消挂单
    if current_time >= time(close_hour, close_minute):
        if open_positions['TOTAL'] > 0:
            logger.info(f"{event.datetime} - 正在平仓 {symbol} 的所有持仓")
            modules.EXECUTION_ENGINE.close_all_strategy_positions()
        
        if pending_orders['TOTAL'] > 0:
            logger.info(f"{event.datetime} - 正在取消 {symbol} 的所有挂单")
            modules.EXECUTION_ENGINE.cancel_all_strategy_pending_orders()
        
        return
    
    # 在下单时间放置订单
    if (current_time >= time(order_placement_hour, order_placement_minute) and 
        not orders_placed_today[symbol] and 
        pending_orders['TOTAL'] == 0 and
        event.timeframe == signal_timeframe):
        
        # 获取计算布林带所需的K线数据
        bars_needed = bb_period + 10
        indicator_bars = modules.DATA_PROVIDER.get_latest_bars(symbol, signal_timeframe, bars_needed)
        
        if indicator_bars is None or indicator_bars.height < bars_needed:
            return
        
        # 计算布林带
        close = indicator_bars.select('close').to_numpy().flatten()
        upper, middle, lower = BollingerBands.compute(close, bb_period, bb_std_dev)
        
        current_upper = upper[-1]
        current_lower = lower[-1]
        
        if np.isnan(current_upper) or np.isnan(current_lower):
            return
        
        upper_breakout = Decimal(str(current_upper))
        lower_breakout = Decimal(str(current_lower))
        
        # 信号生成时间
        if modules.TRADING_CONTEXT == "BACKTEST":
            time_generated = event.datetime + signal_timeframe.to_timedelta()
        else:
            time_generated = datetime.now()
        
        # 放置 BUY STOP 订单
        signal_events.append(SignalEvent(
            symbol=symbol,
            time_generated=time_generated,
            strategy_id=strategy_id,
            signal_type=SignalType.BUY,
            order_type=OrderType.STOP,
            order_price=upper_breakout,
            sl=Decimal(str(0.0)),
            tp=Decimal(str(0.0)),
        ))
        
        # 放置 SELL STOP 订单
        signal_events.append(SignalEvent(
            symbol=symbol,
            time_generated=time_generated,
            strategy_id=strategy_id,
            signal_type=SignalType.SELL,
            order_type=OrderType.STOP,
            order_price=lower_breakout,
            sl=Decimal(str(0.0)),
            tp=Decimal(str(0.0)),
        ))
        
        orders_placed_today[symbol] = True
    
    return signal_events


# 配置策略
strategy.configure_predefined_sizing_engine(MinSizingConfig())
strategy.configure_predefined_risk_engine(PassthroughRiskConfig())

# 回测配置
from_date = datetime(year=2020, month=1, day=1)
to_date = datetime(year=2023, month=12, day=1)
# csv_dir = '/Users/marticastany/Desktop/long_data'  # 替换为你自己的 CSV 数据路径
csv_dir = None  # 如果没有 CSV 数据,可以设置为 None

# 启动回测
backtest = strategy.backtest(
    strategy_id=strategy_id,
    initial_capital=starting_capital,
    symbols_to_trade=symbols_to_trade,
    csv_dir=csv_dir,
    backtest_name=strategy_id,
    start_date=from_date,
    end_date=to_date,
    export_backtest_csv=True,
    export_backtest_parquet=False,
    account_currency=AccountCurrencies.USD
)

print("回测完成")
backtest.plot()

框架对比

Python 生态中有多个优秀的回测框架,各有侧重。以下是它们的区别:

PyEventBT Backtrader Zipline VectorBT
架构 事件驱动 事件驱动 事件驱动 向量化
MetaTrader 5 集成 原生支持 — — —
实盘交易 支持(通过 MT5) 社区经纪商 — —
回测与实盘同代码 支持(完整 MT5 API 模拟) 部分支持 — —
语言 仅 Python 仅 Python 仅 Python 仅 Python
前视偏差防护 设计层面杜绝 设计层面杜绝 设计层面杜绝 需手动处理
多周期 支持 支持 有限 支持
挂单(限价/止损) 支持 支持 有限 —

何时选择 PyEventBT:你使用 MetaTrader 5 进行交易,并希望完全用 Python 开发、回测和部署策略——在回测和生产环境中使用相同的代码和相同的 MT5 API,无需编写任何 MQL5。

何时选择其他框架:如果你不使用 MetaTrader 5 作为经纪商,或者需要向量化回测来进行高频逐笔级别的研究,其他框架可能更加适合。

文档

完整文档请访问 pyeventbt.com。

文档内容包括:

  • 完整的 API 参考
  • 详细的示例和教程
  • 导入模式与最佳实践
  • 高级配置选项
  • 实盘交易设置指南

面向 LLM 友好的文档,请参阅 llms.txt 和 llms-full.txt。

功能特性

  • 事件驱动架构,实现真实回测
  • 内置技术指标(ATR、SMA、RSI 等),并集成 pandas-ta-classic(284 种指标)
  • 回测到实盘无缝切换
  • 全面的绩效指标与可视化
  • 灵活的风控与仓位管理引擎
  • MetaTrader 5 集成,支持实盘交易

技术指标参考

PyEventBT 集成了 pandas-ta-classic,共提供 284 种技术指标(224 个类别指标 + 62 种蜡烛图形态,其中 cdl_doji 和 cdl_inside 同时计入两者),按以下分类组织:

类别 数量 说明
Candles(蜡烛图) 5 + 62 蜡烛图形态识别,62 种形态全部为原生 Python 实现
Cycles(周期) 8 周期分析与希尔伯特变换指标
Momentum(动量) 53 动量与振荡器指标
Overlap(重叠) 46 移动平均线与趋势跟踪指标
Performance(绩效) 3 绩效与收益指标
Statistics(统计) 14 统计分析函数
Trend(趋势) 26 趋势识别与方向指标
Volatility(波动率) 18 波动率与区间指标
Volume(成交量) 20 成交量分析指标
Math(数学) 31 逐元素数学运算与变换

Candles — 蜡烛图(5 个包装器 + 62 种原生形态)

所有 62 种 CDL 形态均为原生 Python 实现,无需 TA-Lib。

# 一次性计算全部 62 种形态
df = df.ta.cdl_pattern(name="all")

# 计算单个形态
df = df.ta.cdl_pattern(name="engulfing")

# 计算多个形态
df = df.ta.cdl_pattern(name=["hammer", "morningstar", "engulfing"])

# 专用访问器方法
result = df.ta.cdl_doji()
result = df.ta.cdl_inside()

可用形态: 2crows, 3blackcrows, 3inside, 3linestrike, 3outside, 3starsinsouth, 3whitesoldiers, abandonedbaby, advanceblock, belthold, breakaway, closingmarubozu, concealbabyswall, counterattack, darkcloudcover, doji, dojistar, dragonflydoji, engulfing, eveningdojistar, eveningstar, gapsidesidewhite, gravestonedoji, hammer, hangingman, harami, haramicross, highwave, hikkake, hikkakemod, homingpigeon, identical3crows, inside, inneck, invertedhammer, kicking, kickingbylength, ladderbottom, longleggeddoji, longline, marubozu, matchinglow, mathold, morningdojistar, morningstar, onneck, piercing, rickshawman, risefall3methods, separatinglines, shootingstar, shortline, spinningtop, stalledpattern, sticksandwich, takuri, tasukigap, thrusting, tristar, unique3river, upsidegap2crows, xsidegap3methods

其他蜡烛图指标: cdl_pattern(统一形态调度器)、cdl_doji(十字星专用)、cdl_inside(内包线专用)、ha(Heikin-Ashi 蜡烛图)、cdl_z(Z-score 标准化)

Cycles — 周期(8)

指标 函数 说明
去趋势合成价格 dsp Detrended Synthetic Price
更优正弦波 ebsw Even Better Sinewave
HT 主导周期 ht_dcperiod Hilbert Transform — Dominant Cycle Period
HT 主导周期相位 ht_dcphase Hilbert Transform — Dominant Cycle Phase
HT 相量分量 ht_phasor Hilbert Transform — Phasor Components
HT 正弦波 ht_sine Hilbert Transform — SineWave
HT 趋势/周期模式 ht_trendmode Hilbert Transform — Trend vs Cycle Mode
MESA 正弦波 msw Mesa Sine Wave

Momentum — 动量(53)

指标 函数 说明
动量 mom Momentum
变化率 roc Rate of Change
变化率百分比 rocp Rate of Change Percentage
变化率比率 rocr Rate of Change Ratio
相对强弱指数 rsi Relative Strength Index
相对强度 Xtra rsx Relative Strength Xtra
随机振荡器 stoch Stochastic Oscillator
快速随机 stochf Stochastic Fast
随机 RSI stochrsi Stochastic RSI
威廉 %R willr Williams %R
商品通道指数 cci Commodity Channel Index
资金流量指数 mfi Money Flow Index
MACD macd Moving Average Convergence Divergence
MACD 扩展 macdext MACD Extended(可控 MA 类型)
MACD 固定 macdfix MACD Fixed(12/26 固定周期)
成交量加权 MACD vwmacd Volume Weighted MACD
绝对价格振荡器 apo Absolute Price Oscillator
百分比价格振荡器 ppo Percentage Price Oscillator
百分比成交量振荡器 pvo Percentage Volume Oscillator
偏差 bias Bias
KST 振荡器 kst KST Oscillator
Trix trix Trix
Trix 直方图 trixh TRIX Histogram
真实强度指数 tsi True Strength Index
终极振荡器 uo Ultimate Oscillator
钱德动量振荡器 cmo Chande Momentum Oscillator
Coppock 曲线 coppock Coppock Curve
费雪变换 fisher Fisher Transform
惯性 inertia Inertia
KDJ kdj KDJ
线性回归 RSI lrsi Linear Regression RSI
QQE qqe Quantitative Qualitative Estimation
挤压指标 squeeze Squeeze(John Carter's / Lazybear's)
挤压 Pro squeeze_pro Squeeze Pro
Schaff 趋势周期 stc Schaff Trend Cycle
Awesome 振荡器 ao Awesome Oscillator
买卖力平衡 bop Balance of Power
BRAR brar BRAR
钱德预测振荡器 cfo Chande Forecast Oscillator
重心 cg Center of Gravity
相关性趋势指标 cti Correlation Trend Indicator
方向运动 dm Directional Movement
效率比率 er Efficiency Ratio
艾尔德射线 eri Elder Ray Index
预测振荡器 fosc Forecast Oscillator
漂亮好振荡器 pgo Pretty Good Oscillator
投影振荡器 po Projection Oscillator
心理线 psl Psychological Line
相对活力指数 rvgi Relative Vigor Index
斜率 slope Slope
SMC 流动性扫荡 smc_sweep Smart Money Concept Liquidity Sweep
SMI 遍历 smi SMI Ergodic
TD 序列 td_seq TD Sequential

Overlap — 重叠(46)

指标 函数 说明
简单移动平均 sma Simple Moving Average
指数移动平均 ema Exponential Moving Average
双指数移动平均 dema Double Exponential Moving Average
三指数移动平均 tema Triple Exponential Moving Average
T3 移动平均 t3 T3 Moving Average
三角移动平均 trima Triangular Moving Average
加权移动平均 wma Weighted Moving Average
成交量加权移动平均 vwma Volume Weighted Moving Average
成交量加权均价 vwap Volume Weighted Average Price
Hull 移动平均 hma Hull Exponential Moving Average
零滞后移动平均 zlma Zero Lag Moving Average
正弦加权移动平均 sinwma Sine Weighted Moving Average
对称加权移动平均 swma Symmetric Weighted Moving Average
斐波那契加权移动平均 fwma Fibonacci's Weighted Moving Average
帕斯卡加权移动平均 pwma Pascal's Weighted Moving Average
Kaufman 自适应均线 kama Kaufman's Adaptive Moving Average
可变指数动态均线 vidya Variable Index Dynamic Average
Wilder 移动平均 rma WildeR's Moving Average
Jurik 移动平均 jma Jurik Moving Average
ALMA alma Arnaud Legoux Moving Average
MAMA mama MESA Adaptive Moving Average
MAVP mavp Moving Average with Variable Period
McGinley 动态 mcgd McGinley Dynamic
超级趋势 supertrend Supertrend
通用移动平均 ma Generic Moving Average Selector
Holt-Winter 移动平均 hwma Holt-Winter Moving Average
超级平滑滤波器 ssf Ehler's Super Smoother Filter
彩虹移动平均 rainbow Rainbow Moving Average
马德里均线带 mmar Madrid Moving Average Ribbon
一目均衡表 ichimoku Ichimoku Kinkō Hyō
HT 瞬时趋势线 ht_trendline Hilbert Transform Instantaneous Trendline
甘氏高低激活器 hilo Gann High-Low Activator
时间序列预测 tsf Time Series Forecast
线性回归 linreg Linear Regression
线性回归角度 linregangle Linear Regression Angle
线性回归截距 linregintercept Linear Regression Intercept
线性回归斜率 linregslope Linear Regression Slope
平均价格 avgprice Average Price (OHLC/4)
中位价格 medprice Median Price (H+L)/2
典型价格 typprice Typical Price (H+L+C)/3
加权收盘价 wcp Weighted Closing Price
高低平均 hl2 High-Low Average
高低收平均 hlc3 High-Low-Close Average
开高低收平均 ohlc4 Open-High-Low-Close Average
中点 midpoint Midpoint
中间价 midprice Midprice

Performance — 绩效(3)

指标 函数 说明
回撤 drawdown Draw Down
对数收益 log_return Log Return
百分比收益 percent_return Percent Return

Statistics — 统计(14)

指标 函数 说明
标准差 stdev Standard Deviation
方差 variance Variance
标准误差 stderr Standard Error
平均绝对偏差 mad Mean Absolute Deviation
均值偏差 md Mean Deviation
中位数 median Median
分位数 quantile Quantile
偏度 skew Skew
峰度 kurtosis Kurtosis
Z 分数 zscore Z Score
熵 entropy Entropy
Beta beta Beta(相对基准波动率)
皮尔逊相关系数 correl Pearson Correlation Coefficient
TOS 标准差 tos_stdevall Think or Swim Standard Deviation All

Trend — 趋势(26)

指标 函数 说明
ADX adx Average Directional Movement Index
ADXR adxr ADX Rating
方向指数 dx Directional Index
正向运动 plus_dm Plus Directional Movement
负向运动 minus_dm Minus Directional Movement
Aroon aroon Aroon & Aroon Oscillator
PSAR psar Parabolic Stop and Reverse
PSAR 扩展 sarext Parabolic SAR Extended
去趋势价格振荡器 dpo Detrended Price Oscillator
波动指数 chop Choppiness Index
垂直水平过滤器 vhf Vertical Horizontal Filter
漩涡指标 vortex Vortex
Q Stick qstick Q Stick
趋势信号 tsignals Trend Signals
交叉信号 xsignals Cross Signals
AMAT amat Archer Moving Averages Trends
衰减 decay Decay(线性衰减)
指数衰减 edecay Exponential Decay
递增 increasing Increasing
递减 decreasing Decreasing
长跑 long_run Long Run
短跑 short_run Short Run
价格最大 pmax Price Max
TTM 趋势 ttm_trend TTM Trend
中枢位范围 cpr Central Pivot Range(4 种方法)
钱德 Kroll 止损 cksp Chande Kroll Stop

Volatility — 波动率(18)

指标 函数 说明
平均真实波幅 atr Average True Range
标准化 ATR natr Normalized Average True Range
真实波幅 true_range True Range
布林带 bbands Bollinger Bands
肯特纳通道 kc Keltner Channel
唐奇安通道 donchian Donchian Channel
加速带 accbands Acceleration Bands
Holt-Winter 通道 hwc Holt-Winter Channel
吊灯止损 ce Chandelier Exit
历史波动率 hvol Historical Volatility(年化)
年化波动率 avolume Annualised Volatility
相对波动率指数 rvi Relative Volatility Index
质量指数 massi Mass Index
Chaikin 波动率 cvi Chaikins Volatility
价格距离 pdist Price Distance
艾尔德温度计 thermo Elder's Thermometer
溃疡指数 ui Ulcer Index
偏差 aberration Aberration

Volume — 成交量(20)

指标 函数 说明
OBV obv On-Balance Volume
AOBV aobv Archer On-Balance Volume
累积/派发线 ad Accumulation/Distribution Index
累积/派发振荡器 adosc Accumulation/Distribution Oscillator
Chaikin 资金流 cmf Chaikin Money Flow
艾尔德力度指数 efi Elder's Force Index
易动性 eom Ease of Movement
EMV emv Ease of Movement (EMV)
Klinger 成交量振荡器 kvo Klinger Volume Oscillator
市场便利指数 marketfi Market Facilitation Index
负成交量指数 nvi Negative Volume Index
正成交量指数 pvi Positive Volume Index
价格成交量 pvol Price-Volume
价格成交量排名 pvr Price Volume Rank
价格成交量趋势 pvt Price Volume Trend
成交量流指标 vfi Volume Flow Indicator
成交量振荡器 vosc Volume Oscillator
成交量分布 vp Volume Profile
Williams 累积/派发 wad Williams Accumulation/Distribution

Math — 数学(31)

指标 函数 说明
加法 add 两序列逐元素相加
减法 sub 两序列逐元素相减
乘法 mult 两序列逐元素相乘
除法 div 两序列逐元素相除
滚动最大值 rolling_max / max 滚动窗口最大值
滚动最小值 rolling_min / min 滚动窗口最小值
滚动求和 rolling_sum / sum 滚动窗口求和
最大索引 maxindex 滚动最大值索引
最小索引 minindex 滚动最小值索引
最小最大值 minmax 滚动最小值和最大值
最小最大索引 minmaxindex 滚动最小值/最大值索引
正弦 sin Sine
余弦 cos Cosine
正切 tan Tangent
反正弦 asin Inverse Sine
反余弦 acos Inverse Cosine
反正切 atan Inverse Tangent
双曲正弦 sinh Hyperbolic Sine
双曲余弦 cosh Hyperbolic Cosine
双曲正切 tanh Hyperbolic Tangent
指数 exp Exponential
自然对数 ln Natural Logarithm
以10为底对数 log10 Logarithm Base 10
平方根 sqrt Square Root
上取整 ceil Ceiling
下取整 floor Floor
绝对值 npabs Absolute Value
四舍五入 npround Round
截断 trunc Truncate
转角度 todeg 弧度转角度
转弧度 torad 角度转弧度

使用方式

在策略中通过 TaIndicator 直接调用任意指标:

from pyeventbt.indicators import TaIndicator

ta = TaIndicator(bars)

# 趋势指标
ta.sma(length=50)
ta.ema(length=20)
ta.macd()
ta.supertrend(length=7, multiplier=3)
ta.adx(length=14)

# 波动率指标
ta.atr(length=14)
ta.bbands(length=20, std=2)
ta.kc(length=20)

# 动量指标
ta.rsi(length=14)
ta.stoch()
ta.cci(length=20)
ta.willr(length=14)

# 蜡烛图形态
ta.cdl_pattern(name="engulfing")
ta.cdl_doji()
ta.ha()

# 成交量指标
ta.obv()
ta.mfi(length=14)

# 读取指标值
current_rsi = ta.last('RSI_14')
current_sma = ta.last('SMA_50')

许可证

Apache 2.0

作者

由 Martí Castany 为社区倾心打造 ❤️

S
Description
No description provided
Readme Apache-2.0
2.5 MiB
Languages
Python 100%