← 返回 Skills 市场
sarkcesscrewpay

dashboard-pnl-visualization

作者 Richard Sarkodie · GitHub ↗ · v1.0.0 · MIT-0
cross-platform ✓ 安全检测通过
99
总下载
0
收藏
0
当前安装
1
版本数
在 OpenClaw 中安装
/install dashboard-pnl-visualization
功能描述
Trading dashboard P&L visualization with profit tracker integration, win-rate overlays, R-multiples, and configurable settings
使用说明 (SKILL.md)

dashboard-pnl-visualization - Research Notes

Experiment Overview

Item Details
Date 2025-12-13
Goal Enhance trading dashboard with comprehensive P&L tracking, win-rate overlays from profit tracker, and R-multiple position visualization
Environment Python 3.10, matplotlib, alpaca-py, Alpaca Trading API
Status Success

Context

Trading dashboards often show only gross P&L without breaking down realized vs unrealized, cost coverage, or win-rate context. This skill documents patterns for integrating profit tracker data into dashboard visualizations.

Verified Workflow

1. DashboardConfig Dataclass

Create a configurable runtime settings system:

from dataclasses import dataclass, field
from typing import List
import json
from pathlib import Path

@dataclass
class DashboardConfig:
    """Runtime configuration for the monitoring dashboard."""
    symbols: List[str] = field(default_factory=lambda: ["SPY", "QQQ", "AAPL"])
    lookback_days: int = 30
    interval_seconds: int = 60
    output_dir: str = "dashboards"
    cost_data: float = 3.33        # Daily data cost
    cost_software: float = 6.67    # Daily software cost
    risk_limit_pct: float = 10.0   # Portfolio risk limit
    profit_log_dir: str = "logs/live"
    save_latest: bool = True

    @classmethod
    def from_json(cls, path: str) -> "DashboardConfig":
        if not path or not Path(path).exists():
            return cls()
        return cls(**json.loads(Path(path).read_text()))

2. Broker Equity History Integration

Fetch real portfolio equity data from Alpaca:

def get_equity_history(
    self,
    period: str = "1M",    # '1D', '1W', '1M', '3M', '1A'
    timeframe: str = "1D", # '1Min', '5Min', '15Min', '1H', '1D'
) -> List[Dict[str, Any]]:
    """Return historical equity curve from the broker."""
    from alpaca.trading.requests import GetPortfolioHistoryRequest

    request = GetPortfolioHistoryRequest(period=period, timeframe=timeframe)
    history = self._client.get_portfolio_history(request)

    if hasattr(history, "equity") and hasattr(history, "timestamp"):
        return [
            {"timestamp": ts, "value": eq}
            for ts, eq in zip(history.timestamp, history.equity)
        ]
    return []

3. Win-Rate Overlay from Profit Tracker

Load profit summary for live metrics overlay:

def load_profit_summary(log_dir: str) -> Dict:
    """Load profit tracker summary for win-rate overlays."""
    path = Path(log_dir)
    summary_files = sorted(path.glob("*/profit_summary.json"))
    if not summary_files:
        return {}

    with summary_files[-1].open() as f:
        summary = json.load(f)

    trades = summary.get("trades", [])
    pnls = [t.get("pnl", 0.0) for t in trades]
    wins = [p for p in pnls if p > 0]

    # Calculate loss streak
    loss_streak = 0
    for pnl in reversed(pnls):
        if pnl \x3C= 0:
            loss_streak += 1
        else:
            break

    return {
        "win_rate": len(wins) / len(pnls) if pnls else 0.0,
        "loss_streak": loss_streak,
        "trade_count": len(pnls),
    }

4. Realized vs Unrealized P&L Split

def get_pnl_breakdown(broker, cfg, profit_overlay, open_pnl=0.0) -> dict:
    """Get P&L breakdown with realized/unrealized split."""
    account = broker.get_account()
    equity = float(account['equity'])
    last_equity = float(account.get('last_equity', equity))

    daily_pnl = equity - last_equity
    unrealized_pnl = float(open_pnl)
    realized_pnl = daily_pnl - unrealized_pnl

    breakdown = {
        'gross_pnl': daily_pnl,
        'unrealized_pnl': unrealized_pnl,
        'realized_pnl': realized_pnl,
        'data_cost': cfg.cost_data,
        'software_cost': cfg.cost_software,
    }
    breakdown['net_pnl'] = breakdown['gross_pnl'] - cfg.cost_data - cfg.cost_software

    # Add win-rate overlay
    if profit_overlay:
        breakdown['win_rate'] = profit_overlay.get('win_rate')
        breakdown['loss_streak'] = profit_overlay.get('loss_streak')

    return breakdown

5. R-Multiple Display for Positions

def calculate_r_multiple(entry_price, current_price, stop_price, side):
    """Calculate R-multiple for position risk-reward."""
    if not stop_price:
        return None

    if side != 'short':
        risk_per_share = entry_price - stop_price
        profit_per_share = current_price - entry_price
    else:
        risk_per_share = stop_price - entry_price
        profit_per_share = entry_price - current_price

    if risk_per_share \x3C= 0:
        return None

    return profit_per_share / risk_per_share

# Color coding for R-multiples
def get_r_color(r_multiple):
    if r_multiple is None:
        return 'gray'
    elif r_multiple >= 2:
        return 'darkgreen'  # Excellent
    elif r_multiple >= 1:
        return 'green'      # Good
    else:
        return 'orange'     # Below target

Failed Attempts (Critical)

Attempt Why it Failed Lesson Learned
Using account.equity - account.last_equity directly Doesn't separate realized from unrealized Pass open_pnl from position calculations
Hardcoding cost values Different users have different infrastructure costs Use DashboardConfig dataclass
Reading profit_summary from fixed path Path varies by session date Use glob to find most recent summary
Displaying R-multiple without stop price Division by zero / meaningless value Return None and show "--" in display

Final Parameters

# CLI arguments for dashboard
parser.add_argument('--config', type=str, help='JSON config path')
parser.add_argument('--symbols', type=str, help='Comma-separated symbols')
parser.add_argument('--lookback-days', type=int, default=30)
parser.add_argument('--data-cost', type=float, default=3.33)
parser.add_argument('--software-cost', type=float, default=6.67)
parser.add_argument('--risk-limit', type=float, default=10.0)
parser.add_argument('--profit-log-dir', type=str, default='logs/live')

Key Insights

  • Realized/unrealized split requires tracking open position P&L separately
  • Win-rate overlays provide crucial context for daily P&L interpretation
  • R-multiples only meaningful when stop prices are set
  • Cost coverage percentage helps evaluate if trading covers infrastructure costs
  • JSON config files allow per-environment customization without code changes
  • Profit tracker summaries should be written with timestamp directories for history

References

  • alpaca_trading/broker.py - get_equity_history() method
  • alpaca_trading/visualization/dashboard.py - R-multiple rendering
  • scripts/monitor_dashboard.py - Full implementation
  • docs/dashboard_improvements.md - Feature documentation
安全使用建议
Treat this as an incomplete review rather than a clean security assessment; the artifacts should be re-scanned in an environment where metadata.json and the artifact directory are readable.
能力评估
Purpose & Capability
Not assessable from artifact content because workspace file reads failed before metadata.json or artifact files could be inspected.
Instruction Scope
Not assessable from artifact content because SKILL.md could not be read.
Install Mechanism
Not assessable from artifact content because install metadata and artifact files could not be read.
Credentials
Not assessable from artifact content because capability and file contents were unavailable.
Persistence & Privilege
Not assessable from artifact content because no persistence, credential, or privilege instructions could be inspected.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install dashboard-pnl-visualization
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /dashboard-pnl-visualization 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v1.0.0
Initial publish
元数据
Slug dashboard-pnl-visualization
版本 1.0.0
许可证 MIT-0
累计安装 0
当前安装数 0
历史版本数 1
常见问题

dashboard-pnl-visualization 是什么?

Trading dashboard P&L visualization with profit tracker integration, win-rate overlays, R-multiples, and configurable settings. 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 99 次。

如何安装 dashboard-pnl-visualization?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install dashboard-pnl-visualization」即可一键安装,无需额外配置。

dashboard-pnl-visualization 是免费的吗?

是的,dashboard-pnl-visualization 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。

dashboard-pnl-visualization 支持哪些平台?

dashboard-pnl-visualization 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 dashboard-pnl-visualization?

由 Richard Sarkodie(@sarkcesscrewpay)开发并维护,当前版本 v1.0.0。

💬 留言讨论