Pharos
Chart

KLineChart - K线图表

创建和管理K线图表,用于可视化策略运行状态。

语法

python
# 创建图表
chart = KLineChart()

# 创建叠加图表
chart = KLineChart({"overlay": True})

参数

参数名类型必选默认值说明
optionsdict{}图表配置选项

options 配置

字段类型默认值说明
overlayboolFalse是否叠加到主图(True)还是独立子图(False)

方法

add(series, data, index)

添加数据点到图表。

参数:

  • series (str): 数据系列名称
  • data (number/list): 数据值或数据数组
  • index (int, 可选): K线索引,默认为最新K线

示例:

python
# 添加单个数据点
chart.add("MA5", 50000)

# 添加多个数据点
chart.add("MA5", [49000, 49500, 50000, 50500, 51000])

# 添加到指定K线
chart.add("Signal", 1, index=-5)  # 倒数第5根K线

update()

更新图表显示。调用此方法后,数据会发送到前端显示。

示例:

python
chart.update()

reset()

清空图表所有数据。

示例:

python
chart.reset()

示例

示例1: 绘制均线

python
def init():
    global chart
    # 创建图表
    chart = KLineChart({"overlay": True})

def main():
    while True:
        # 获取K线数据
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(5000)
            continue
        
        # 计算MA5和MA10
        ma5 = sum([r['Close'] for r in records[-5:]]) / 5
        ma10 = sum([r['Close'] for r in records[-10:]]) / 10
        
        # 添加到图表
        chart.add("MA5", ma5)
        chart.add("MA10", ma10)
        chart.update()
        
        Sleep(5000)

示例2: 买卖信号标记

python
def init():
    global chart
    chart = KLineChart({"overlay": True})

def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 20:
            Sleep(5000)
            continue
        
        # 计算信号
        ma5 = sum([r['Close'] for r in records[-5:]]) / 5
        ma20 = sum([r['Close'] for r in records[-20:]]) / 20
        
        # 金叉买入信号
        if ma5 > ma20:
            chart.add("BuySignal", records[-1]['Low'] * 0.98)
            Log("✅ 买入信号")
        
        # 死叉卖出信号
        if ma5 < ma20:
            chart.add("SellSignal", records[-1]['High'] * 1.02)
            Log("❌ 卖出信号")
        
        chart.update()
        Sleep(5000)

示例3: 绘制MACD指标

python
def init():
    global macd_chart
    # 创建独立子图
    macd_chart = KLineChart({"overlay": False})

def calculate_macd(records, short=12, long=26, signal=9):
    """计算MACD指标"""
    closes = [r['Close'] for r in records]
    
    # 计算EMA
    ema_short = closes[-1]  # 简化版,实际应使用真实EMA
    ema_long = sum(closes[-long:]) / long
    
    # MACD线
    macd = ema_short - ema_long
    
    # 信号线
    signal_line = macd  # 简化版
    
    # 柱状图
    histogram = macd - signal_line
    
    return macd, signal_line, histogram

def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 30:
            Sleep(5000)
            continue
        
        # 计算MACD
        macd, signal, hist = calculate_macd(records)
        
        # 绘制到图表
        macd_chart.add("MACD", macd)
        macd_chart.add("Signal", signal)
        macd_chart.add("Histogram", hist)
        macd_chart.update()
        
        Sleep(5000)

示例4: 多条均线

python
def init():
    global chart
    chart = KLineChart({"overlay": True})

def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 60:
            Sleep(5000)
            continue
        
        # 计算多条均线
        ma5 = sum([r['Close'] for r in records[-5:]]) / 5
        ma10 = sum([r['Close'] for r in records[-10:]]) / 10
        ma20 = sum([r['Close'] for r in records[-20:]]) / 20
        ma60 = sum([r['Close'] for r in records[-60:]]) / 60
        
        # 添加到图表
        chart.add("MA5", ma5)
        chart.add("MA10", ma10)
        chart.add("MA20", ma20)
        chart.add("MA60", ma60)
        chart.update()
        
        Sleep(5000)

示例5: 布林带

python
import math

def init():
    global chart
    chart = KLineChart({"overlay": True})

def calculate_bollinger(records, period=20, std_dev=2):
    """计算布林带"""
    closes = [r['Close'] for r in records[-period:]]
    
    # 中轨(SMA)
    middle = sum(closes) / period
    
    # 标准差
    variance = sum([(c - middle) ** 2 for c in closes]) / period
    std = math.sqrt(variance)
    
    # 上轨和下轨
    upper = middle + std_dev * std
    lower = middle - std_dev * std
    
    return upper, middle, lower

def main():
    while True:
        records = exchange.GetRecords()
        if len(records) < 20:
            Sleep(5000)
            continue
        
        # 计算布林带
        upper, middle, lower = calculate_bollinger(records)
        
        # 绘制
        chart.add("BB_Upper", upper)
        chart.add("BB_Middle", middle)
        chart.add("BB_Lower", lower)
        chart.update()
        
        Sleep(5000)

注意事项

  1. 数据系列: 每个系列名称对应图表上的一条线

  2. 更新频率: 调用 update() 后数据才会显示,建议按固定间隔更新

  3. 叠加vs子图:

    • overlay=True: 绘制在主K线图上(如均线)
    • overlay=False: 独立子图(如MACD、RSI)
  4. 数据持久化: 图表数据存储在服务器,刷新页面后仍可查看

  5. 性能考虑: 过于频繁的更新可能影响性能,建议间隔至少1秒

  6. 索引说明:

    • 不指定index: 添加到最新K线
    • 负数index: 倒数第N根K线 (-1为最新)
    • 正数index: 第N根K线 (0为第一根)

相关 API