Source code for tradeexecutor.strategy.chart.standard.vault

"""Vault charts."""
import pandas as pd

from tradeexecutor.analysis.credit import display_vault_position_table
from tradeexecutor.analysis.vault import visualise_vaults
from tradeexecutor.strategy.chart.definition import ChartInput
from plotly.graph_objects import Figure

from tradeexecutor.visual.position import visualise_position, calculate_position_timeline


[docs]def all_vaults_share_price_and_tvl( input: ChartInput, printer=print, ) -> list[Figure]: """Render share price and TVL for all vaults. - Get vault pairs from the strategy universe :return: List of figures """ figures = visualise_vaults(input.strategy_universe, printer=printer) if not figures: raise ValueError("No chart data available for vault pairs - missing candle or liquidity data") return figures
[docs]def vault_position_timeline( input: ChartInput, cut_off_date: pd.Timestamp = None, height=2000, width=1200, ) -> tuple[Figure, pd.DataFrame]: """How a single vault position evolved over time. - Takes vault pair as an input :return: Figure visualising the position timeline and a DataFrame with individual trades """ assert input.state state = input.state strategy_universe = input.strategy_universe assert input.pairs and len(input.pairs) == 1, "This chart only supports a single vault pair." pair = input.pairs[0] all_positions = list(state.portfolio.get_all_positions()) position_id = None for p in reversed(all_positions): if p.pair == pair: position_id = p.position_id break assert position_id is not None, f"Position for pair {pair} not found in portfolio." if input.execution_context.mode.is_backtesting(): assert state.backtest_data end_at = state.backtest_data.end_at else: start_at, end_at = state.get_strategy_start_and_end() position = state.portfolio.get_position_by_id(position_id) position_df = calculate_position_timeline( strategy_universe, position, end_at, ) if cut_off_date: position_df = position_df[position_df.index < cut_off_date] fig = visualise_position( position, position_df, extended=True, autosize=False, height=height, width=width, ) with pd.option_context('display.min_rows', 500): # Show up to 50 rows # Assuming df is your DataFrame and condition is your boolean mask mask = position_df.delta != 0 # Your original condition extended_mask = mask | mask.shift(1).fillna(False) | mask.shift(-1).fillna(False) df = position_df[extended_mask] return fig, df
[docs]def all_vault_positions( chart_input: ChartInput, ) -> pd.DataFrame: """Display all vault positions in a table. """ state = chart_input.state vault_df = display_vault_position_table(state) return vault_df