DEV Community

drake
drake

Posted on

Profit Factor(盈亏比)算法解析

 from typing import List, Dict, Union def calculate_profit_factor(closed_trades: List[Dict], account_state: Dict) -> Union[float, str]: """ 基于JS文件 (Ee 函数) 解析的盈亏比 (Profit Factor) 算法。 计算公式: (已实现盈利 + 未实现盈利) / (已实现亏损绝对值 + 未实现亏损绝对值) Args: closed_trades: 已平仓交易的列表。每个元素至少包含 "closedPnl"。 account_state: 账户状态,包含 "clearinghouseState.assetPositions" (未平仓位)。 Returns: 盈亏比数值 (float) 或字符串 "1000+"""" gross_profit = 0.0 # 总盈利之和 (GP)  gross_loss_abs = 0.0 # 总亏损绝对值之和 (GL)  # 1. 计算已平仓交易盈亏 (closedPnl)  for trade in closed_trades: # 确保 PnL 存在且可转换为浮点数  try: pnl = float(trade.get("closedPnl", 0.0)) except (ValueError, TypeError): pnl = 0.0 if pnl > 0: gross_profit += pnl else: gross_loss_abs += abs(pnl) # 2. 计算未平仓资产浮动盈亏 (unrealizedPnl)  asset_positions = account_state.get("clearinghouseState", {}).get("assetPositions", []) for position_data in asset_positions: # 确保 unrealizedPnl 存在且可转换为浮点数  try: unrealized_pnl = float(position_data.get("position", {}).get("unrealizedPnl", 0.0)) except (ValueError, TypeError): unrealized_pnl = 0.0 if unrealized_pnl > 0: gross_profit += unrealized_pnl else: gross_loss_abs += abs(unrealized_pnl) # 3. 计算盈亏比并处理特殊情况  if gross_loss_abs != 0: return gross_profit / gross_loss_abs elif gross_profit > 0: # JS 代码中的 "1000+"  return "1000+" else: # gross_loss_abs == 0 and gross_profit == 0  return 0.0 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)