feat: add florida module for unified hedging and monitoring

This commit is contained in:
2025-12-29 21:28:43 +01:00
parent 90c4453ab4
commit e6adbaffef
37 changed files with 11901 additions and 0 deletions

View File

@ -0,0 +1,8 @@
{
"ui": {
"useAlternateBuffer": true
},
"tools": {
"truncateToolOutputLines": 10000
}
}

137
florida/GEMINI.md Normal file
View File

@ -0,0 +1,137 @@
# Uniswap Auto CLP & Delta-Neutral Hedger
## Project Overview
This project is an automated high-frequency trading system designed to provide **Concentrated Liquidity (CLP)** on Uniswap V3 (and forks) while simultaneously **hedging delta exposure** on Hyperliquid.
The goal is to capture trading fees from the Liquidity Pool (LP) while neutralizing the price risk of the underlying assets (Impermanent Loss protection). The system operates as a **Delta-Zero Scalper**, effectively farming yields with reduced market exposure.
## Architecture
The system consists of three independent Python processes that coordinate via shared JSON state files.
### 1. Position Manager (`clp_manager.py`)
* **Role:** Active Liquidity Provision.
* **Functionality:**
* Connects to EVM chains (Arbitrum, BNB Chain, Base) via Web3.
* Monitors `{TARGET_DEX}_status.json` and on-chain pool state.
* **Auto-Entry:** Detects when no position exists, calculates optimal tick ranges based on `RANGE_WIDTH_PCT`, and mints a new NFT position.
* **Auto-Wrap:** Automatically wraps native tokens (ETH -> WETH) if balances are insufficient.
* **Auto-Exit:** Detects out-of-range positions, removes liquidity, and collects fees (`CLOSE_POSITION_ENABLED`).
* **State Sync:** Updates `{TARGET_DEX}_status.json` with entry price, amounts, and token IDs for the Hedger.
### 2. Delta Hedger (`clp_hedger.py`)
* **Role:** Delta Neutralization (Risk Management).
* **Functionality:**
* Connects to Hyperliquid (Perp DEX).
* Reads `{TARGET_DEX}_status.json` to understand the current LP position's delta profile.
* **Dynamic Hedging:** Calculates the precise `Gamma` (rate of change of delta) and rebalances the short position to keep Net Delta close to zero.
* **Scalping:** Uses "Fishing Orders" (Maker orders) and volatility-adjusted thresholds to profit from hedging rebalances rather than just paying taker fees.
* **Safety:** Includes emergency closures, edge protection logic (to avoid hedging at max loss points), and disconnect protection.
### 3. Monitoring (`telegram_monitor.py`)
* **Role:** Alerting.
* **Functionality:**
* Watches `{TARGET_DEX}_status.json` for state transitions (OPEN -> CLOSED).
* Sends real-time notifications to Telegram with PnL summaries, duration, and fees collected.
## Key Files & Directories
| File/Dir | Description |
| :--- | :--- |
| `clp_manager.py` | Main logic for Uniswap V3 interaction (Mint/Burn/Collect). |
| `clp_hedger.py` | Main logic for Hyperliquid hedging (Open/Close/Rebalance). |
| `clp_config.py` | Configuration profiles (Chain IDs, Contract Addresses) and Strategy settings. |
| `telegram_monitor.py` | Telegram bot for notifications. |
| `{TARGET_DEX}_status.json` | **Critical:** Shared state file acting as the database between Manager and Hedger. |
| `.env` | Stores secrets (Private Keys, RPCs). **Do not commit.** |
| `tools/` | Utility scripts, including the Git Agent for auto-backups. |
| `logs/` | Detailed logs for all processes. |
## Configuration
### Environment Variables (`.env`)
Required variables for operation:
```env
# Blockchain
MAINNET_RPC_URL=... # Arbitrum
BNB_RPC_URL=... # BNB Chain
BASE_RPC_URL=... # Base
MAIN_WALLET_PRIVATE_KEY=...
MAIN_WALLET_ADDRESS=...
# Hyperliquid
HEDGER_PRIVATE_KEY=... # Usually same as Main Wallet or specialized sub-account
# Telegram
TELEGRAM_BOT_TOKEN=...
TELEGRAM_CHAT_ID=...
TELEGRAM_MONITOR_ENABLED=True
```
### Strategy Config (`clp_config.py`)
Key parameters controlling the bot's behavior:
* `TARGET_DEX`: Selects the active chain/profile (e.g., "UNISWAP_V3", "PANCAKESWAP_BNB").
* `RANGE_WIDTH_PCT`: Width of the LP position (e.g., `0.05` for +/- 5%).
* `TARGET_INVESTMENT_AMOUNT`: Notional size of the position in USD.
* `SLIPPAGE_TOLERANCE`: Max slippage for minting/swapping.
## Usage
The system is designed to run continuously. It is recommended to use a process manager like `pm2` or `systemd`, or simply run in separate terminal tabs.
1. **Start the Manager:**
```bash
python clp_manager.py
```
* *Action:* Will check for existing positions. If none, it prepares to open one based on config.
2. **Start the Hedger:**
```bash
python clp_hedger.py
```
* *Action:* Will read the position created by the Manager and open a corresponding short on Hyperliquid.
3. **Start Monitoring (Optional):**
```bash
python telegram_monitor.py
```
## Development & Git Agent
This project uses a custom **Git Agent** (`tools/git_agent.py`) for automated version control and backups.
* **Auto-Backup:** Runs hourly (if configured) to create backup branches (e.g., `backup-2025-01-01-12`).
* **Manual Commit:**
```bash
python tools/git_agent.py --backup
```
* **Status:**
```bash
python tools/git_agent.py --status
```
* **Restoration:**
To restore a file from a backup branch:
```bash
git checkout backup-BRANCH-NAME -- path/to/file.py
```
## Logic Details
### Hedging Mathematics
The hedger calculates the **Pool Delta** derived from the V3 liquidity math:
$$ \Delta_{LP} = L \times (\frac{1}{\sqrt{P}} - \frac{1}{\sqrt{P_{upper}}}) $$
(For Token0/Token1 where we hedge Token0).
It then maintains a Short Position ($S$) such that:
$$ S \approx \Delta_{LP} $$
### Rebalancing
Rebalancing is triggered when:
1. **Delta Drift:** $|S - \Delta_{LP}| > Threshold$
2. **Volatility:** Thresholds expand during high volatility to reduce churn (fees).
3. **Edge Proximity:** Hedging logic changes when price approaches the range boundaries to prevent "buying high/selling low" behavior at the edges.
## Troubleshooting
* **Logs:** Check `logs/clp_manager.log` and `logs/clp_hedger.log` first.
* **Stuck Position:** If a position is closed on-chain but `{TARGET_DEX}_status.json` says `OPEN`, manually edit the JSON status to `CLOSED` or delete the entry (with caution).
* **RPC Errors:** Ensure your RPC URLs in `.env` are active and have sufficient rate limits.

View File

@ -0,0 +1,123 @@
[
{
"type": "AUTOMATIC",
"token_id": 6146792,
"status": "CLOSED",
"target_value": 994.02,
"entry_price": 842.2702,
"amount0_initial": 494.0331,
"amount1_initial": 0.5936,
"liquidity": "3468400810004249810484",
"range_upper": 850.7027,
"range_lower": 834.0253,
"token0_decimals": 18,
"token1_decimals": 18,
"timestamp_open": 1766872414,
"initial_hedge_usdc": 1004.058551,
"hedge_equity_usd": 0.0,
"hedge_pnl_realized": -87.35,
"hedge_fees_paid": 42.87,
"target_value_end": 997.47,
"timestamp_close": 1766919846
},
{
"type": "AUTOMATIC",
"token_id": 6149306,
"status": "CLOSED",
"target_value": 997.66,
"entry_price": 851.2687,
"amount0_initial": 500.0087,
"amount1_initial": 0.5846,
"liquidity": "3462645216513961883832",
"range_upper": 859.7676,
"range_lower": 842.9125,
"token0_decimals": 18,
"token1_decimals": 18,
"timestamp_open": 1766919922,
"initial_hedge_usdc": 908.9771,
"hedge_equity_usd": 904.232487,
"hedge_pnl_realized": -2.07,
"hedge_fees_paid": 0.95,
"target_value_end": 1000.83,
"timestamp_close": 1766937096
},
{
"type": "AUTOMATIC",
"token_id": 6150494,
"status": "CLOSED",
"target_value": 991.84,
"entry_price": 861.6614,
"amount0_initial": 491.8656,
"amount1_initial": 0.5802,
"liquidity": "3421642374594297568197",
"range_upper": 870.3205,
"range_lower": 853.2585,
"token0_decimals": 18,
"token1_decimals": 18,
"timestamp_open": 1766937178
},
{
"type": "AUTOMATIC",
"token_id": 6151763,
"status": "CLOSED",
"target_value": 199.28,
"entry_price": 857.718,
"amount0_initial": 99.2854,
"amount1_initial": 0.1166,
"liquidity": "461487203975551730969",
"range_upper": 870.5816,
"range_lower": 845.1913,
"token0_decimals": 18,
"token1_decimals": 18,
"timestamp_open": 1766960125
},
{
"type": "AUTOMATIC",
"token_id": 6151784,
"status": "CLOSED",
"target_value": 997.07,
"entry_price": 858.2809,
"amount0_initial": 497.0759,
"amount1_initial": 0.5826,
"liquidity": "2308213453823846434158",
"range_upper": 871.1041,
"range_lower": 845.6986,
"token0_decimals": 18,
"token1_decimals": 18,
"timestamp_open": 1766960550,
"target_value_end": 1001.56,
"timestamp_close": 1766982067
},
{
"type": "AUTOMATIC",
"token_id": 6153292,
"status": "CLOSED",
"target_value": 993.31,
"entry_price": 869.418,
"amount0_initial": 500.0094,
"amount1_initial": 0.5674,
"liquidity": "2284728345715808667084",
"range_upper": 882.4136,
"range_lower": 856.6782,
"token0_decimals": 18,
"token1_decimals": 18,
"timestamp_open": 1766982584,
"target_value_end": 982.48,
"timestamp_close": 1767000734
},
{
"type": "AUTOMATIC",
"token_id": 6154897,
"status": "OPEN",
"target_value": 998.49,
"entry_price": 849.3437,
"amount0_initial": 498.5177,
"amount1_initial": 0.5887,
"liquidity": "2323641520769318237803",
"range_upper": 862.092,
"range_lower": 836.9493,
"token0_decimals": 18,
"token1_decimals": 18,
"timestamp_open": 1767001797
}
]

View File

@ -0,0 +1,303 @@
[
{
"type": "AUTOMATIC",
"token_id": 5173910,
"status": "CLOSED",
"target_value": 1999.21,
"entry_price": 2966.7,
"amount0_initial": 0.3301,
"amount1_initial": 1019.95,
"range_upper": 2995.91,
"range_lower": 2936.59,
"timestamp_open": 1766488092,
"initial_hedge_usdc": 1000.0,
"hedge_equity_usd": 1012.848897,
"hedge_pnl_realized": -0.89,
"hedge_fees_paid": 1.56,
"timestamp_close": 1766501540
},
{
"type": "AUTOMATIC",
"token_id": 5174242,
"status": "CLOSED",
"target_value": 1989.63,
"entry_price": 2910.43,
"amount0_initial": 0.322,
"amount1_initial": 1052.48,
"range_upper": 2936.59,
"range_lower": 2881.32,
"timestamp_open": 1766502268,
"initial_hedge_usdc": 1011.11115,
"hedge_equity_usd": 1002.743444,
"hedge_pnl_realized": -9.04,
"hedge_fees_paid": 0.86,
"timestamp_close": 1766506329
},
{
"type": "AUTOMATIC",
"token_id": 5174392,
"status": "CLOSED",
"target_value": 1987.85,
"entry_price": 2956.82,
"amount0_initial": 0.3071,
"amount1_initial": 1079.77,
"range_upper": 2983.95,
"range_lower": 2924.86,
"timestamp_open": 1766507046,
"initial_hedge_usdc": 1002.743444,
"hedge_equity_usd": 1018.807922,
"hedge_pnl_realized": -2.28,
"hedge_fees_paid": 0.93,
"timestamp_close": 1766513112
},
{
"type": "AUTOMATIC",
"token_id": 5174532,
"status": "CLOSED",
"target_value": 1986.73,
"entry_price": 2942.37,
"amount0_initial": 0.3211,
"amount1_initial": 1041.97,
"range_upper": 2969.07,
"range_lower": 2913.19,
"timestamp_open": 1766513873,
"initial_hedge_usdc": 1016.672049,
"hedge_equity_usd": 1005.949738,
"hedge_pnl_realized": -6.16,
"hedge_fees_paid": 1.11,
"timestamp_close": 1766522608
},
{
"type": "AUTOMATIC",
"token_id": 5174721,
"status": "CLOSED",
"target_value": 1988.43,
"entry_price": 2971.33,
"amount0_initial": 0.3092,
"amount1_initial": 1069.8,
"range_upper": 2998.9,
"range_lower": 2939.53,
"timestamp_open": 1766523284,
"initial_hedge_usdc": 1005.949738,
"hedge_equity_usd": 1005.238693,
"hedge_pnl_realized": -0.7,
"hedge_fees_paid": 0.71
},
{
"type": "AUTOMATIC",
"token_id": 5174792,
"status": "CLOSED",
"target_value": 2651.4,
"entry_price": 2973.46,
"amount0_initial": 0.4246,
"amount1_initial": 1388.81,
"liquidity": "4874764439714363",
"range_upper": 3001.9,
"range_lower": 2942.47,
"timestamp_open": 1766527489,
"initial_hedge_usdc": 1002.312464,
"hedge_equity_usd": 1002.312464,
"hedge_pnl_realized": 0.0,
"hedge_fees_paid": 0.0
},
{
"type": "AUTOMATIC",
"token_id": 5174797,
"status": "CLOSED",
"target_value": 199.26,
"entry_price": 2960.88,
"amount0_initial": 0.0329,
"amount1_initial": 101.99,
"liquidity": "367136758323064",
"range_upper": 2989.92,
"range_lower": 2930.72,
"timestamp_open": 1766527967,
"initial_hedge_usdc": 1000.965119,
"hedge_equity_usd": 1000.864724,
"hedge_pnl_realized": -0.05,
"hedge_fees_paid": 0.05
},
{
"type": "AUTOMATIC",
"token_id": 5174808,
"status": "CLOSED",
"target_value": 1994.89,
"entry_price": 2954.93,
"amount0_initial": 0.3299,
"amount1_initial": 1019.94,
"liquidity": "3679197389549125",
"range_upper": 2983.95,
"range_lower": 2924.86,
"timestamp_open": 1766529348,
"initial_hedge_usdc": 1001.01805,
"hedge_equity_usd": 1008.884158,
"hedge_pnl_realized": -5.85,
"hedge_fees_paid": 2.21,
"timestamp_close": 1766545502
},
{
"type": "AUTOMATIC",
"token_id": 5175426,
"status": "CLOSED",
"target_value": 1984.47,
"entry_price": 2925.98,
"amount0_initial": 0.3262,
"amount1_initial": 1029.88,
"liquidity": "3678045237670142",
"range_upper": 2954.26,
"range_lower": 2895.76,
"timestamp_open": 1766566249,
"initial_hedge_usdc": 1007.931072,
"hedge_equity_usd": 983.149732,
"hedge_pnl_realized": -26.81,
"hedge_fees_paid": 2.57,
"timestamp_close": 1766616464
},
{
"type": "AUTOMATIC",
"token_id": 5176634,
"status": "CLOSED",
"target_value": 1981.59,
"entry_price": 2958.09,
"amount0_initial": 0.3251,
"amount1_initial": 1019.9,
"liquidity": "3652722296614890",
"range_upper": 2986.93,
"range_lower": 2927.79,
"timestamp_open": 1766617139,
"initial_hedge_usdc": 983.149732,
"hedge_equity_usd": 998.691177,
"hedge_pnl_realized": -0.32,
"hedge_fees_paid": 0.89,
"timestamp_close": 1766651355
},
{
"type": "AUTOMATIC",
"token_id": 5177261,
"status": "CLOSED",
"target_value": 1995.91,
"entry_price": 2925.51,
"amount0_initial": 0.3336,
"amount1_initial": 1019.94,
"liquidity": "3699547812088951",
"range_upper": 2954.26,
"range_lower": 2895.76,
"timestamp_open": 1766652125,
"initial_hedge_usdc": 997.755868,
"hedge_equity_usd": 987.99485,
"hedge_pnl_realized": -8.17,
"hedge_fees_paid": 0.74,
"target_value_end": 0.0,
"timestamp_close": 1766677241
},
{
"type": "AUTOMATIC",
"token_id": 5178047,
"status": "CLOSED",
"target_value": 1991.5,
"entry_price": 2965.34,
"amount0_initial": 0.3108,
"amount1_initial": 1069.8,
"liquidity": "3666528467508532",
"range_upper": 2992.91,
"range_lower": 2933.65,
"timestamp_open": 1766677916,
"initial_hedge_usdc": 987.99485,
"hedge_equity_usd": 1003.143647,
"hedge_pnl_realized": -0.16,
"hedge_fees_paid": 0.69,
"target_value_end": 0.0,
"timestamp_close": 1766702691
},
{
"type": "AUTOMATIC",
"token_id": 5178409,
"status": "CLOSED",
"target_value": 1987.63,
"entry_price": 2916.84,
"amount0_initial": 0.3318,
"amount1_initial": 1019.92,
"liquidity": "3689670482290624",
"range_upper": 2945.41,
"range_lower": 2887.09,
"timestamp_open": 1766703368,
"initial_hedge_usdc": 1002.368481,
"hedge_equity_usd": 990.301215,
"hedge_pnl_realized": -3.91,
"hedge_fees_paid": 0.98,
"target_value_end": 0.0,
"timestamp_close": 1766715440
},
{
"type": "AUTOMATIC",
"token_id": 5178639,
"status": "CLOSED",
"target_value": 1996.39,
"entry_price": 2983.41,
"amount0_initial": 0.3072,
"amount1_initial": 1079.79,
"liquidity": "3664399483786727",
"range_upper": 3010.92,
"range_lower": 2951.31,
"timestamp_open": 1766716114,
"initial_hedge_usdc": 990.301215,
"hedge_equity_usd": 1018.672,
"hedge_pnl_realized": -5.58,
"hedge_fees_paid": 1.55,
"target_value_end": 0.0,
"timestamp_close": 1766760944
},
{
"type": "AUTOMATIC",
"token_id": 5179293,
"status": "CLOSED",
"target_value": 1986.34,
"entry_price": 2910.18,
"amount0_initial": 0.3245,
"amount1_initial": 1041.97,
"liquidity": "3885311775355906",
"range_upper": 2936.59,
"range_lower": 2881.32,
"timestamp_open": 1766761703,
"initial_hedge_usdc": 1019.619398,
"hedge_equity_usd": 1001.73964,
"hedge_pnl_realized": -20.55,
"hedge_fees_paid": 1.66,
"target_value_end": 2002.85,
"timestamp_close": 1766874151
},
{
"type": "AUTOMATIC",
"token_id": 5180968,
"status": "CLOSED",
"target_value": 1986.71,
"entry_price": 2932.98,
"amount0_initial": 0.3126,
"amount1_initial": 1069.79,
"liquidity": "3677842511030595",
"range_upper": 2960.17,
"range_lower": 2901.56,
"timestamp_open": 1766874875,
"initial_hedge_usdc": 1002.337877,
"hedge_equity_usd": 901.431859,
"hedge_pnl_realized": -268.84,
"hedge_fees_paid": 34.92,
"target_value_end": 2000.45,
"timestamp_close": 1766968239
},
{
"type": "AUTOMATIC",
"token_id": 5182179,
"status": "OPEN",
"target_value": 1993.84,
"entry_price": 2969.9855,
"amount0_initial": 0.3347,
"amount1_initial": 999.8831,
"liquidity": "755871440225782",
"range_upper": 3118.1664,
"range_lower": 2827.096,
"token0_decimals": 18,
"token1_decimals": 6,
"timestamp_open": 1766968369
}
]

124
florida/clp_config.py Normal file
View File

@ -0,0 +1,124 @@
import os
from decimal import Decimal
# --- GLOBAL SETTINGS ---
# Use environment variables to switch profiles
TARGET_DEX = os.environ.get("TARGET_DEX", "UNISWAP_V3")
STATUS_FILE = os.environ.get("STATUS_FILE", f"{TARGET_DEX}_status.json")
# --- DEFAULT STRATEGY ---
DEFAULT_STRATEGY = {
"MONITOR_INTERVAL_SECONDS": 60, # How often the Manager checks for range status
"CLOSE_POSITION_ENABLED": True, # Allow the bot to automatically close out-of-range positions
"OPEN_POSITION_ENABLED": True, # Allow the bot to automatically open new positions
"REBALANCE_ON_CLOSE_BELOW_RANGE": True, # Strategy flag for specific closing behavior
# Investment Settings
"TARGET_INVESTMENT_AMOUNT": 2000, # Total USD value to deploy into the LP position
"INITIAL_HEDGE_CAPITAL": 1000, # Capital reserved on Hyperliquid for hedging
"VALUE_REFERENCE": "USD", # Base currency for all calculations
"WRAPPED_NATIVE_ADDRESS": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", # WETH/WBNB address
# Range Settings
"RANGE_WIDTH_PCT": Decimal("0.01"), # LP width (e.g. 0.05 = +/- 5% from current price)
"SLIPPAGE_TOLERANCE": Decimal("0.02"), # Max allowed slippage for swaps and minting
"TRANSACTION_TIMEOUT_SECONDS": 30, # Timeout for blockchain transactions
# Hedging Settings
"MIN_HEDGE_THRESHOLD": Decimal("0.012"), # Minimum delta change (in coins) required to trigger a trade
# Unified Hedger Settings
"CHECK_INTERVAL": 1, # Loop speed for the hedger (seconds)
"LEVERAGE": 5, # Leverage to use on Hyperliquid
"ZONE_BOTTOM_HEDGE_LIMIT": Decimal("1.0"), # Multiplier limit at the bottom of the range
"ZONE_CLOSE_START": Decimal("10.0"), # Distance (pct) from edge to start closing logic
"ZONE_CLOSE_END": Decimal("11.0"), # Distance (pct) from edge to finish closing logic
"ZONE_TOP_HEDGE_START": Decimal("10.0"),# Distance (pct) from top edge to adjust hedging
"PRICE_BUFFER_PCT": Decimal("0.0015"), # Buffer for limit order pricing (0.15%)
"MIN_ORDER_VALUE_USD": Decimal("10.0"), # Minimum order size allowed by Hyperliquid
"DYNAMIC_THRESHOLD_MULTIPLIER": Decimal("1.2"), # Expansion factor for thresholds
"MIN_TIME_BETWEEN_TRADES": 60, # Cooldown (seconds) between rebalance trades
"MAX_HEDGE_MULTIPLIER": Decimal("1.25"),# Max allowed hedge size relative to calculated target
"BASE_REBALANCE_THRESHOLD_PCT": Decimal("0.25"), # Base tolerance for delta drift (20%)
"EDGE_PROXIMITY_PCT": Decimal("0.04"), # Distance to range edge where protection activates
"VELOCITY_THRESHOLD_PCT": Decimal("0.0005"), # Minimum price velocity to trigger volatility logic
"POSITION_OPEN_EDGE_PROXIMITY_PCT": Decimal("0.06"), # Safety margin when opening new positions
"POSITION_CLOSED_EDGE_PROXIMITY_PCT": Decimal("0.025"), # Safety margin for closing positions
"LARGE_HEDGE_MULTIPLIER": Decimal("5.0"), # Multiplier to bypass trade cooldown for big moves
"ENABLE_EDGE_CLEANUP": True, # Force rebalances when price is at range boundaries
"EDGE_CLEANUP_MARGIN_PCT": Decimal("0.02"), # % of range width used for edge detection
"MAKER_ORDER_TIMEOUT": 600, # Timeout for resting Maker orders (seconds)
"SHADOW_ORDER_TIMEOUT": 600, # Timeout for theoretical shadow order tracking
"ENABLE_FISHING": False, # Use passive maker orders for rebalancing (advanced)
"FISHING_ORDER_SIZE_PCT": Decimal("0.10"), # Size of individual fishing orders
}
# --- CLP PROFILES ---
CLP_PROFILES = {
"UNISWAP_V3": {
"NAME": "Uniswap V3 (Arbitrum) - ETH/USDC",
"COIN_SYMBOL": "ETH",
"RPC_ENV_VAR": "MAINNET_RPC_URL",
"NPM_ADDRESS": "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",
"ROUTER_ADDRESS": "0xE592427A0AEce92De3Edee1F18E0157C05861564",
"TOKEN_A_ADDRESS": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", # WETH
"TOKEN_B_ADDRESS": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", # USDC
"WRAPPED_NATIVE_ADDRESS": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"POOL_FEE": 500,
},
"UNISWAP_wide": {
"NAME": "Uniswap V3 (Arbitrum) - ETH/USDC Wide",
"COIN_SYMBOL": "ETH",
"RPC_ENV_VAR": "MAINNET_RPC_URL",
"NPM_ADDRESS": "0xC36442b4a4522E871399CD717aBDD847Ab11FE88",
"ROUTER_ADDRESS": "0xE592427A0AEce92De3Edee1F18E0157C05861564",
"TOKEN_A_ADDRESS": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", # WETH
"TOKEN_B_ADDRESS": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", # USDC
"WRAPPED_NATIVE_ADDRESS": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
"POOL_FEE": 500,
"RANGE_WIDTH_PCT": Decimal("0.05"),
"TARGET_INVESTMENT_AMOUNT": 2000,
"MIN_HEDGE_THRESHOLD": Decimal("0.01"),
"BASE_REBALANCE_THRESHOLD_PCT": Decimal("0.15"),
},
"PANCAKESWAP_BNB": {
"NAME": "PancakeSwap V3 (BNB Chain) - BNB/USDT",
"COIN_SYMBOL": "BNB",
"RPC_ENV_VAR": "BNB_RPC_URL",
"NPM_ADDRESS": "0x46A15B0b27311cedF172AB29E4f4766fbE7F4364",
"ROUTER_ADDRESS": "0x1b81D678ffb9C0263b24A97847620C99d213eB14",
"TOKEN_A_ADDRESS": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c", # WBNB
"TOKEN_B_ADDRESS": "0x55d398326f99059fF775485246999027B3197955", # USDT
"WRAPPED_NATIVE_ADDRESS": "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c",
"POOL_FEE": 100,
"RANGE_WIDTH_PCT": Decimal("0.015"),
"TARGET_INVESTMENT_AMOUNT": 1000,
"MIN_HEDGE_THRESHOLD": Decimal("0.05"), # ~$30 for BNB
},
"WETH_CBBTC_BASE": {
"NAME": "Aerodrome/Uni (Base) - WETH/cbBTC",
"COIN_SYMBOL": "ETH",
"RPC_ENV_VAR": "BASE_RPC_URL",
"NPM_ADDRESS": "0x0000000000000000000000000000000000000000", # Placeholder
"ROUTER_ADDRESS": "0x0000000000000000000000000000000000000000", # Placeholder
"TOKEN_A_ADDRESS": "0x4200000000000000000000000000000000000006", # WETH (Base)
"TOKEN_B_ADDRESS": "0xcbB7C915AB58735a1391B9fE18541b4d8926D412", # cbBTC (Base)
"WRAPPED_NATIVE_ADDRESS": "0x4200000000000000000000000000000000000006",
"POOL_FEE": 3000,
"TARGET_INVESTMENT_AMOUNT": 200,
"VALUE_REFERENCE": "USD",
"RANGE_WIDTH_PCT": Decimal("0.10")
}
}
# --- HELPER TO GET ACTIVE CONFIG ---
def get_current_config():
profile = CLP_PROFILES.get(TARGET_DEX)
if not profile:
raise ValueError(f"Unknown CLP profile: {TARGET_DEX}")
# Merge Default Strategy with Profile (Profile wins)
config = DEFAULT_STRATEGY.copy()
config.update(profile)
return config

View File

@ -0,0 +1,230 @@
# CLP Hedge Risk Mitigation & Zero-Delta Optimization Plan
## Executive Summary
Based on analysis of -$2.23 test loss from position 6153292, this plan addresses critical formula errors, suboptimal configurations, and missing features preventing true zero-delta hedging. Expected outcome: 85-95% loss reduction (from $2.23 to $0.11-0.33).
---
## Phase 1: Critical Bug Fixes (Week 1)
### 1.1 Delta Calculation Formula Correction
**Files**: `unified_hedger.py` (lines 187-198)
**Issue**: Incorrect in-range delta formula causing hedge underestimation
**Current Buggy Formula**:
```python
return self.L * ((Decimal("1")/sqrt_P) - (Decimal("1")/sqrt_Pb))
```
**Correct Formula**:
```python
return self.L * (sqrt_Pb - sqrt_P) / (current_price * sqrt_P * sqrt_Pb)
```
**Impact**: Fixes core hedge accuracy, 60-70% loss reduction expected
### 1.2 Liquidity Scaling Fix
**Files**: `unified_hedger.py` (lines 156-158)
**Issue**: Improper normalization causing position size errors
**Current**:
```python
scale_exp = (d0 + d1) / 2
liquidity_scale = Decimal("10") ** Decimal(str(-scale_exp))
```
**Correct**:
```python
liquidity_scale = Decimal("10") ** Decimal(str(-(d0 + d1) / 2))
```
**Impact**: Correct hedge position sizing
---
## Phase 2: Fishing Feature Implementation (Week 1-2)
### 2.1 Port Fishing Logic to Unified Hedger
**Files**: `unified_hedger.py`
**Task**: Move fishing implementation from `clp_hedger.py` to existing `shadow_orders` system
### 2.2 Conservative Fishing Configuration
**Files**: `clp_config.py` (BNB profile)
**Changes**:
```python
"ENABLE_FISHING": True, # Enable feature
"FISHING_ORDER_SIZE_PCT": Decimal("0.05"), # Conservative 5%
"MAKER_ORDER_TIMEOUT": 60, # 60s timeout (not 600s)
"FISHING_TIMEOUT_FALLBACK": 30, # 30s to taker fallback
```
**Impact**: 30-40% fee reduction by converting taker to maker trades
---
## Phase 3: Configuration Optimization (Week 2-3)
### 3.1 BNB-Specific Parameter Tuning
**Files**: `clp_config.py` (PANCAKESWAP_BNB profile)
**Changes**:
```python
"MIN_HEDGE_THRESHOLD": Decimal("0.02"), # Down from 0.05 (2.5x responsive)
"BASE_REBALANCE_THRESHOLD_PCT": Decimal("0.15"), # Down from 0.25 (tighter)
"EDGE_PROXIMITY_PCT": Decimal("0.02"), # Down from 0.04 (earlier)
"DYNAMIC_THRESHOLD_MULTIPLIER": Decimal("1.1"), # Down from 1.2 (less padding)
"MIN_TIME_BETWEEN_TRADES": 30, # Down from 60 (faster response)
```
### 3.2 Add EAC Configuration Parameters
**Files**: `clp_config.py` (add to DEFAULT_STRATEGY)
**New Parameters**:
```python
"EAC_NARROW_RANGE_THRESHOLD": Decimal("0.02"), # <2% = narrow
"EAC_MEDIUM_RANGE_THRESHOLD": Decimal("0.05"), # <5% = medium
"EAC_NARROW_BOOST": Decimal("0.15"), # 15% boost
"EAC_MEDIUM_BOOST": Decimal("0.10"), # 10% boost
"EAC_WIDE_BOOST": Decimal("0.075"), # 7.5% boost
```
---
## Phase 4: Enhanced Asymmetric Compensation (Week 2-3)
### 4.1 Dynamic Compensation Logic
**Files**: `unified_hedger.py` (replace lines 206-219)
**Current Implementation**:
```python
max_boost = Decimal("0.075") # Static 7.5% for all ranges
```
**Enhanced Implementation**:
```python
def get_compensation_boost(self):
range_width_pct = (self.high_range - self.low_range) / self.low_range
if range_width_pct < Decimal("0.02"): # <2% range
return Decimal("0.15") # Double protection for narrow ranges
elif range_width_pct < Decimal("0.05"): # <5% range
return Decimal("0.10") # Moderate for medium ranges
else: # >=5% range
return Decimal("0.075") # Standard for wide ranges
# Replace in calculate_rebalance:
max_boost = self.get_compensation_boost()
```
**Impact Analysis for Test Case**:
- **Current 7.5%**: Would offset ~$0.59 of fees in -$2.23 loss
- **Enhanced 15%**: Would offset ~$1.18 of fees (double improvement)
- **Net Result**: Reduces $2.23 loss to ~$1.05 (36% additional improvement)
---
## Phase 5: System Improvements (Week 3-4)
### 5.1 API Synchronization Enhancement
**Files**: `unified_hedger.py` (line 788-790)
**Change**: Increase sync time from 5 to 10 seconds
### 5.2 Position Validation
**Files**: `unified_hedger.py` (after trade execution)
**Add**: Post-trade position verification to ensure hedge accuracy
### 5.3 Enhanced Monitoring & Logging
**Files**: New logging/metrics module
**Add**:
- Real-time delta tracking alerts
- EAC effectiveness monitoring
- Fishing success rate tracking
- Fee vs PnL performance metrics
---
## Expected Results Timeline
| Week | Changes | Expected Loss Reduction | Fee Impact |
|------|---------|----------------------|------------|
| 1 | Formula fixes + fishing | 60-70% | -40% |
| 2 | Config + EAC enhancement | 75-85% | -50% |
| 3-4 | System improvements | 85-95% | -60% |
| **Target**: Reduce $2.23 loss to **$0.11-0.33** |
---
## Risk Mitigation & Rollback Criteria
### Stop Conditions:
- Daily trades >15 per position
- Net fees increase for 3 consecutive days
- Hedge accuracy degrades >5%
- Fishing success rate <25%
- EAC directional bias >15% of total PnL
### Monitoring Requirements:
- Daily PnL vs fee analysis
- Transaction frequency tracking
- Hedge coverage percentage
- Fishing fill rate metrics
- EAC effectiveness measurement
---
## Implementation Priority
### Week 1 (Critical):
1. ✅ Fix delta calculation formula
2. ✅ Fix liquidity scaling
3. ✅ Enable 5% fishing
4. ✅ Basic monitoring setup
### Week 2 (Important):
5. ✅ Implement Enhanced Asymmetric Compensation
6. ✅ Optimize BNB configuration
7. ✅ Add EAC configuration parameters
8. ✅ Improve API sync timing
### Week 3-4 (Optimization):
9. ✅ Advanced monitoring including EAC metrics
10. ✅ Position validation
11. ✅ EAC effectiveness fine-tuning
---
## Fee Management Strategy
### Conservative Approach to Transaction Costs:
- **Start with 5% fishing** (not aggressive 20%)
- **Monitor daily trade counts**: Stop if >15 trades/day per position
- **Track fishing success rate**: Disable if <25% fill rate
- **Phase thresholds gradually**: Only reduce if fishing proves effective
### Expected Fee Impact:
- **Phase 1-2**: 30-40% fee reduction
- **Phase 3-4**: Additional 20-30% reduction
- **Total**: 50-70% fee reduction despite more trades
---
## Test Case Impact Analysis
### Current Loss Breakdown (Position 6153292):
- **Total Loss**: -$2.23
- **Delta Slippage**: -$0.20
- **Trading Fees**: -$0.79
- **Funding/Execution**: -$1.24
### Expected Impact with All Improvements:
- **Formula Fixes**: -$0.89 (60% reduction)
- **Fishing**: -$0.31 (40% fee reduction)
- **EAC Enhancement**: -$0.80 (additional 36% improvement)
- **Config Optimization**: -$0.23 (tighter thresholds)
- **Final Expected Loss**: **-$0.11 to -$0.33**
---
## Conclusion
This comprehensive plan addresses the root causes of the -$2.23 test loss through:
1. **Core mathematical fixes** (delta formula, liquidity scaling)
2. **Strategic enhancements** (Enhanced Asymmetric Compensation, fishing)
3. **Configuration optimization** (responsive thresholds)
4. **Risk management** (monitoring, rollback triggers)
Expected outcome: **85-95% loss reduction** while maintaining control over transaction costs and system complexity.
*Plan created: 2025-12-29*
*Based on analysis of position 6153292 and comprehensive code review*

View File

@ -0,0 +1,143 @@
# Unified Delta-Neutral Hedger Logic
## 1. Overview
The **Unified Hedger** (`unified_hedger.py`) is the central risk management engine for the Auto CLP system. Unlike the previous architecture where each LP position required a separate process, this unified system manages **all** Liquidity Pool positions across different chains (Arbitrum, BNB Chain, Base) in a single, efficient process.
### Architecture Comparison
**Old Architecture (Multi-Process):**
```mermaid
graph TD
A[Manager Arbitrum] -->|Write| B(UNISWAP_V3_status.json)
C[Manager BNB] -->|Write| D(PANCAKESWAP_BNB_status.json)
B -->|Read| E[Hedger Process 1]
D -->|Read| F[Hedger Process 2]
E -->|API Call| G[Hyperliquid]
F -->|API Call| G
style E fill:#f96,stroke:#333
style F fill:#f96,stroke:#333
```
**New Architecture (Unified):**
```mermaid
graph TD
A[Manager Arbitrum] -->|Write| B(UNISWAP_V3_status.json)
C[Manager BNB] -->|Write| D(PANCAKESWAP_BNB_status.json)
B -->|Read| E[Unified Hedger (Master)]
D -->|Read| E
E -->|Single API Connection| G[Hyperliquid]
style E fill:#9f9,stroke:#333
```
---
## 2. Core Logic Flow
The hedger runs a continuous loop (approx. every 1 second) performing the following steps:
```mermaid
sequenceDiagram
participant Loop as Main Loop
participant Scanner as Strategy Scanner
participant API as Hyperliquid API
participant Math as Aggregation Engine
participant Exec as Execution Logic
Loop->>Scanner: Scan *_status.json files
Scanner-->>Loop: Update Active Strategies
Loop->>API: Fetch All Prices & Account State (Once)
API-->>Loop: Market Data & Balances
loop For Each Strategy
Loop->>Math: Calculate Ideal Short Size
end
Math->>Math: Netting (Sum Targets by Coin)
Loop->>Exec: Compare Net Target vs. Actual Position
alt Diff > Threshold
Exec->>API: Place Order (Buy/Sell)
Exec->>Loop: Sleep 5s (API Lag Safety)
else Diff < Threshold
Exec->>Loop: Do Nothing (Idle)
end
```
---
## 3. Detailed Mechanisms
### A. Strategy Scanning & Initialization
* **Discovery:** The script uses `glob` to find all files matching `*_status.json` in the project directory.
* **Parsing:** It loads the JSON and extracts active positions (`OPEN`, `PENDING_HEDGE`).
* **Liquidity Scaling:**
To support different chains with different decimals (e.g., BNB has 18 decimals, USDC has 6), it calculates a scaling factor:
$$ Scale = 10^{-(d_0 + d_1)/2} $$
This ensures the liquidity math ($L$) is normalized for the hedging calculations.
### B. Ideal Delta Calculation
For each active LP position, the strategy calculates how much it *should* be short to be delta-neutral.
Formula for Concentrated Liquidity Delta ($\Delta_{LP}$):
$$ \Delta_{LP} = L \times \left( \frac{1}{\sqrt{P_{current}}} - \frac{1}{\sqrt{P_{upper}}} \right) $$
* If $P_{current} < P_{lower}$: Delta is max (full range).
* If $P_{current} > P_{upper}$: Delta is 0.
### C. Portfolio Netting (The "Alpha")
This is the key efficiency gain. Instead of trading for every position, the system sums up the requirements.
| Strategy | Chain | Coin | Ideal Short |
| :--- | :--- | :--- | :--- |
| Strat A | Arbitrum | ETH | -1.5 ETH |
| Strat B | Base | ETH | -0.5 ETH |
| Strat C | Arbitrum | ETH | +0.2 ETH (Long/Closing) |
| **NET TOTAL** | **ALL** | **ETH** | **-1.8 ETH** |
The hedger only checks the Hyperliquid account once:
* **Reality:** Account has `-1.6 ETH` short.
* **Action:** Sell `0.2 ETH` to reach `-1.8`.
* *Result:* Strat C's "Buy" was internally netted against Strat A's "Sell". **Zero fees paid for that portion.**
### D. Execution & Thresholds
The decision to trade is based on a dynamic threshold system to avoid churn (over-trading).
1. **Volatility Adjustment:**
It calculates the standard deviation of the last 30 price points.
$$ Threshold_{Dynamic} = BaseThreshold \times \min(3.0, \frac{Vol_{Current}}{Vol_{Base}}) $$
*High Volatility = Wider Thresholds (Trade less).*
2. **Edge Protection:**
If the price is very close to the range boundary (e.g., within 2%), the math becomes unstable (Gamma spike).
* **Action:** Force the threshold to the minimum (`MIN_HEDGE_THRESHOLD`) to ensure precise hedging at the dangerous "exit" zones.
3. **Safety Checks:**
* **Large Hedge Multiplier (5.0x):** If the required trade size is huge (>5x normal threshold), it assumes a "Catch-up" is needed but treats it carefully.
* **API Lag Sleep:** After *any* trade, the loop **sleeps for 5 seconds**. This prevents the "Double Hedge" bug where the bot trades again because the API hasn't updated the position size yet.
### E. Shadow Orders
Since the bot often uses Taker orders (Market/IOC) during urgent rebalances, it simulates "What if I had used a Maker order?".
* It creates a virtual "Shadow Order" in memory.
* It tracks the order book. If the price crosses the shadow price, it marks it as "Filled".
* *Purpose:* To gather data on whether a purely Maker-based strategy would be viable in the future.
---
## 4. Configuration Reference
All settings are tunable in `unified_hedger.py` or via `clp_config.py`.
| Parameter | Default | Description |
| :--- | :--- | :--- |
| `LARGE_HEDGE_MULTIPLIER` | `5.0` | Multiplier for "Urgent" trade flag. Higher = Less Panic. |
| `MIN_TIME_BETWEEN_TRADES` | `60s` | Cooldown for standard rebalances. |
| `BASE_REBALANCE_THRESHOLD_PCT` | `0.09` | 9% deviation allowed before rebalancing (scaled by Vol). |
| `ENABLE_EDGE_CLEANUP` | `True` | Forces tight hedging at range edges. |

View File

@ -0,0 +1,57 @@
# Unified Hedger Logs Explained
This document explains how to read and interpret the `[IDLE]` logs generated by the `unified_hedger.py` system.
## Log Structure
A standard log entry looks like this:
```text
[IDLE] BNB | Px: 861.66 | M: 862.1 | B: 863.4 / S: 860.9 | delta: -0.5818(+0.0332) | Adj: +0.01%, Vol: 1.00, Thr: 0.0873 | PnL: -0.04 | TotPnL: -0.04
```
### Fields Breakdown
| Field | Full Name | Description |
| :--- | :--- | :--- |
| **Px** | Price | The current mid-price of the asset on Hyperliquid. |
| **M** | Mid-Hedge Price | The theoretical price where your Hedge Difference (`Diff`) would be exactly 0 (Perfect Equilibrium). |
| **B** | Buy Trigger | The price at which the bot estimates it will need to **BUY** to rebalance (hedge is too heavy). |
| **S** | Sell Trigger | The price at which the bot estimates it will need to **SELL** to rebalance (hedge is too light). |
| **delta** | Net Target Delta | The total size (in coins) the bot *wants* to be Short. Value is negative for Short. <br> **Format:** `Target (Difference)` <br> *Example:* `-0.5818(+0.0332)` means target is -0.5818, and you are currently +0.0332 away from it (under-hedged, need to sell). |
| **Adj** | Adjustment % | The **Asymmetric Compensation** boost applied to the delta. Positive means the bot is "boosting" the short (anticipating downside), negative means it is reducing it. |
| **Vol** | Volatility Multiplier | A factor (1.0 to 3.0) that widens the threshold during high volatility to prevent chop. |
| **Thr** | Threshold | The dynamic trigger distance. If `Diff` > `Thr`, a trade occurs. |
| **PnL** | Unrealized PnL | The current PnL of your open position on Hyperliquid. |
| **TotPnL** | Total PnL | The sum of Realized PnL (from closed rebalancing trades) + Unrealized PnL. |
---
## Detailed Examples
### Example 1: BNB (Stable)
```text
[IDLE] BNB | Px: 861.66 | M: 862.1 | B: 863.4 / S: 860.9 | delta: -0.5818(+0.0332) | Adj: +0.01%, Vol: 1.00, Thr: 0.0873 | PnL: -0.04 | TotPnL: -0.04
```
* **Status:** The bot wants to be Short `0.5818` BNB.
* **Reality:** It is currently off by `+0.0332` (meaning it has slightly *less* short than it wants).
* **Action:** The difference (`0.0332`) is smaller than the Threshold (`0.0873`), so it does nothing.
* **Triggers:** If price rises to `863.4` (B), it will Buy. If it drops to `860.9` (S), it will Sell.
### Example 2: ETH (Asymmetric Boost)
```text
[IDLE] ETH | Px: 2934.35 | M: 2935.3 | B: 2939.1 / S: 2931.5 | delta: -0.2957(+0.0111) | Adj: -0.35%, Vol: 1.00, Thr: 0.0444 | PnL: 0.05 | TotPnL: -303.71
```
* **Status:** The bot has applied a `-0.35%` adjustment (Adj) because price is likely near a range edge or moving favorably.
* **Delta:** This adjustment reduced the target delta slightly.
* **Safety:** The Volatility is low (`1.00`), keeping the Threshold tight (`0.0444`).
## How Calculations Work
1. **Net Delta:** Sum of all Uniswap V3 position deltas + `Adj` factor.
2. **Diff:** `Target Delta` - `Current Hyperliquid Position`.
3. **Triggers (B/S):** Calculated using the **Gamma** (rate of change of delta).
* `Gamma` tells us "How much does Delta change for a $1 price move?"
* `B = Price + (Threshold + Diff) / Gamma`
* `S = Price - (Threshold - Diff) / Gamma`
* *Note:* These are estimates. In tight ranges, Gamma increases rapidly, so actual trades may happen before these prices are hit.

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

12
florida/requirements.txt Normal file
View File

@ -0,0 +1,12 @@
# Core Web3 and Blockchain interaction
web3>=7.0.0
eth-account>=0.13.0
# Hyperliquid SDK for hedging
hyperliquid-python-sdk>=0.6.0
# Environment and Configuration
python-dotenv>=1.0.0
# Utility
requests>=2.31.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

View File

@ -0,0 +1,814 @@
1766982585168, 2025-12-29 05:29:45,168 - [STRAT] Init 6153292 (BNB) | Range: 856.6782-882.4136
1766982585988, 2025-12-29 05:29:45,988 - [WARN] LARGE HEDGE: 0.5795 > 0.0869 (x5.0)
1766982586249, 2025-12-29 05:29:46,249 - [TRIG] Net BNB: SELL 0.5795 | Tgt: -0.5795 / Cur: 0.0000 | Thresh: 0.0869
1766982586250, 2025-12-29 05:29:46,250 - [ORDER] IOC BNB SELL 0.579 @ 868.4
1766982588546, 2025-12-29 05:29:48,546 - Order filled immediately.
1766982588547, 2025-12-29 05:29:48,547 - [SHADOW] Created Maker SELL @ 869.28
1766982588548, 2025-12-29 05:29:48,548 - Sleeping 5s to allow position update...
1766982600941, 2025-12-29 05:30:00,941 - [IDLE] ETH | Px: 3043.85 | M: 3036.1 | B: 3046.7 / S: 3025.6 | delta: -0.1580(-0.0174) | Adj: -3.81%, Vol: 2.51, Thr: 0.0237 | PnL: -10.62 | TotPnL: -10.62
1766982600943, 2025-12-29 05:30:00,943 - [IDLE] BNB | Px: 869.28 | M: 869.3 | B: 871.2 / S: 867.3 | delta: -0.5793(-0.0003) | Adj: +0.08%, Vol: 1.33, Thr: 0.0869 | PnL: 0.01 | TotPnL: 0.01
1766982630906, 2025-12-29 05:30:30,906 - [IDLE] ETH | Px: 3044.25 | M: 3036.9 | B: 3047.4 / S: 3026.4 | delta: -0.1571(-0.0165) | Adj: -3.83%, Vol: 2.31, Thr: 0.0236 | PnL: -10.60 | TotPnL: -10.60
1766982630909, 2025-12-29 05:30:30,909 - [IDLE] BNB | Px: 869.36 | M: 869.4 | B: 871.4 / S: 867.5 | delta: -0.5752(+0.0038) | Adj: +0.03%, Vol: 1.28, Thr: 0.0863 | PnL: -0.09 | TotPnL: -0.09
1766982690463, 2025-12-29 05:31:30,463 - [IDLE] ETH | Px: 3041.65 | M: 3031.7 | B: 3042.6 / S: 3020.9 | delta: -0.1630(-0.0224) | Adj: -3.69%, Vol: 1.77, Thr: 0.0244 | PnL: -10.32 | TotPnL: -10.32
1766982690465, 2025-12-29 05:31:30,465 - [IDLE] BNB | Px: 868.84 | M: 868.3 | B: 870.4 / S: 866.3 | delta: -0.6007(-0.0217) | Adj: +0.34%, Vol: 1.00, Thr: 0.0901 | PnL: 0.23 | TotPnL: 0.23
1766982720857, 2025-12-29 05:32:00,857 - [IDLE] ETH | Px: 3041.85 | M: 3032.1 | B: 3042.9 / S: 3021.3 | delta: -0.1625(-0.0219) | Adj: -3.70%, Vol: 1.41, Thr: 0.0244 | PnL: -10.36 | TotPnL: -10.36
1766982720859, 2025-12-29 05:32:00,859 - [IDLE] BNB | Px: 868.84 | M: 868.4 | B: 870.4 / S: 866.4 | delta: -0.6002(-0.0212) | Adj: +0.33%, Vol: 1.00, Thr: 0.0900 | PnL: 0.19 | TotPnL: 0.19
1766982810334, 2025-12-29 05:33:30,334 - [IDLE] ETH | Px: 3042.05 | M: 3032.5 | B: 3043.3 / S: 3021.7 | delta: -0.1621(-0.0215) | Adj: -3.71%, Vol: 1.00, Thr: 0.0243 | PnL: -10.33 | TotPnL: -10.33
1766982810337, 2025-12-29 05:33:30,337 - [IDLE] BNB | Px: 868.98 | M: 868.6 | B: 870.6 / S: 866.6 | delta: -0.5940(-0.0150) | Adj: +0.26%, Vol: 1.00, Thr: 0.0891 | PnL: 0.17 | TotPnL: 0.17
1766982870958, 2025-12-29 05:34:30,958 - [IDLE] ETH | Px: 3045.55 | M: 3039.5 | B: 3049.8 / S: 3029.2 | delta: -0.1542(-0.0136) | Adj: -3.89%, Vol: 1.00, Thr: 0.0231 | PnL: -10.84 | TotPnL: -10.84
1766982870961, 2025-12-29 05:34:30,961 - [IDLE] BNB | Px: 869.40 | M: 869.5 | B: 871.5 / S: 867.6 | delta: -0.5736(+0.0054) | Adj: +0.01%, Vol: 1.00, Thr: 0.0860 | PnL: -0.08 | TotPnL: -0.08
1766982900857, 2025-12-29 05:35:00,857 - [IDLE] ETH | Px: 3046.55 | M: 3041.5 | B: 3051.6 / S: 3031.4 | delta: -0.1519(-0.0113) | Adj: -3.95%, Vol: 1.00, Thr: 0.0228 | PnL: -10.99 | TotPnL: -10.99
1766982900859, 2025-12-29 05:35:00,859 - [IDLE] BNB | Px: 869.72 | M: 870.2 | B: 872.1 / S: 868.3 | delta: -0.5580(+0.0210) | Adj: -0.18%, Vol: 1.00, Thr: 0.0837 | PnL: -0.24 | TotPnL: -0.24
1766982960405, 2025-12-29 05:36:00,405 - [IDLE] ETH | Px: 3047.65 | M: 3043.7 | B: 3053.7 / S: 3033.7 | delta: -0.1495(-0.0089) | Adj: -4.00%, Vol: 1.12, Thr: 0.0224 | PnL: -11.11 | TotPnL: -11.11
1766982960407, 2025-12-29 05:36:00,407 - [IDLE] BNB | Px: 870.04 | M: 870.8 | B: 872.7 / S: 869.0 | delta: -0.5433(+0.0357) | Adj: -0.36%, Vol: 1.00, Thr: 0.0815 | PnL: -0.45 | TotPnL: -0.45
1766983020846, 2025-12-29 05:37:00,846 - [IDLE] ETH | Px: 3049.15 | M: 3046.7 | B: 3056.5 / S: 3036.9 | delta: -0.1461(-0.0055) | Adj: -4.08%, Vol: 1.53, Thr: 0.0219 | PnL: -11.32 | TotPnL: -11.32
1766983020848, 2025-12-29 05:37:00,848 - [IDLE] BNB | Px: 870.31 | M: 871.4 | B: 873.2 / S: 869.6 | delta: -0.5302(+0.0488) | Adj: -0.52%, Vol: 1.04, Thr: 0.0795 | PnL: -0.55 | TotPnL: -0.55
1766983050330, 2025-12-29 05:37:30,330 - [IDLE] ETH | Px: 3049.85 | M: 3048.1 | B: 3057.7 / S: 3038.4 | delta: -0.1446(-0.0040) | Adj: -4.12%, Vol: 1.74, Thr: 0.0217 | PnL: -11.46 | TotPnL: -11.46
1766983050333, 2025-12-29 05:37:30,333 - [IDLE] BNB | Px: 870.26 | M: 871.3 | B: 873.1 / S: 869.5 | delta: -0.5328(+0.0462) | Adj: -0.49%, Vol: 1.14, Thr: 0.0799 | PnL: -0.61 | TotPnL: -0.61
1766983110106, 2025-12-29 05:38:30,106 - [IDLE] ETH | Px: 3051.45 | M: 3051.3 | B: 3060.7 / S: 3041.8 | delta: -0.1410(-0.0004) | Adj: -4.20%, Vol: 2.05, Thr: 0.0211 | PnL: -11.64 | TotPnL: -11.64
1766983110109, 2025-12-29 05:38:30,109 - [IDLE] BNB | Px: 870.32 | M: 871.4 | B: 873.2 / S: 869.6 | delta: -0.5300(+0.0490) | Adj: -0.52%, Vol: 1.24, Thr: 0.0795 | PnL: -0.63 | TotPnL: -0.63
1766983140082, 2025-12-29 05:39:00,082 - [IDLE] ETH | Px: 3051.45 | M: 3051.3 | B: 3060.7 / S: 3041.8 | delta: -0.1410(-0.0004) | Adj: -4.20%, Vol: 2.24, Thr: 0.0211 | PnL: -11.61 | TotPnL: -11.61
1766983140084, 2025-12-29 05:39:00,084 - [IDLE] BNB | Px: 870.22 | M: 871.2 | B: 873.0 / S: 869.4 | delta: -0.5345(+0.0445) | Adj: -0.47%, Vol: 1.28, Thr: 0.0802 | PnL: -0.58 | TotPnL: -0.58
1766983170916, 2025-12-29 05:39:30,916 - [IDLE] ETH | Px: 3049.05 | M: 3046.5 | B: 3056.3 / S: 3036.7 | delta: -0.1463(-0.0057) | Adj: -4.07%, Vol: 2.27, Thr: 0.0220 | PnL: -11.33 | TotPnL: -11.33
1766983170918, 2025-12-29 05:39:30,918 - [IDLE] BNB | Px: 869.91 | M: 870.6 | B: 872.4 / S: 868.7 | delta: -0.5492(+0.0298) | Adj: -0.29%, Vol: 1.27, Thr: 0.0824 | PnL: -0.38 | TotPnL: -0.38
1766983200818, 2025-12-29 05:40:00,818 - [IDLE] ETH | Px: 3049.05 | M: 3046.5 | B: 3056.3 / S: 3036.7 | delta: -0.1463(-0.0057) | Adj: -4.07%, Vol: 2.29, Thr: 0.0220 | PnL: -11.33 | TotPnL: -11.33
1766983200821, 2025-12-29 05:40:00,821 - [IDLE] BNB | Px: 869.98 | M: 870.7 | B: 872.6 / S: 868.9 | delta: -0.5459(+0.0331) | Adj: -0.33%, Vol: 1.28, Thr: 0.0819 | PnL: -0.39 | TotPnL: -0.39
1766983260084, 2025-12-29 05:41:00,084 - [IDLE] ETH | Px: 3049.25 | M: 3046.9 | B: 3056.6 / S: 3037.1 | delta: -0.1459(-0.0053) | Adj: -4.08%, Vol: 2.22, Thr: 0.0219 | PnL: -11.36 | TotPnL: -11.36
1766983260086, 2025-12-29 05:41:00,086 - [IDLE] BNB | Px: 870.06 | M: 870.9 | B: 872.7 / S: 869.1 | delta: -0.5423(+0.0367) | Adj: -0.37%, Vol: 1.23, Thr: 0.0813 | PnL: -0.46 | TotPnL: -0.46
1766983290675, 2025-12-29 05:41:30,675 - [IDLE] ETH | Px: 3046.55 | M: 3041.5 | B: 3051.6 / S: 3031.4 | delta: -0.1519(-0.0113) | Adj: -3.95%, Vol: 2.07, Thr: 0.0228 | PnL: -11.01 | TotPnL: -11.01
1766983290678, 2025-12-29 05:41:30,678 - [IDLE] BNB | Px: 869.51 | M: 869.8 | B: 871.7 / S: 867.8 | delta: -0.5683(+0.0107) | Adj: -0.05%, Vol: 1.14, Thr: 0.0852 | PnL: -0.25 | TotPnL: -0.25
1766983320684, 2025-12-29 05:42:00,684 - [IDLE] ETH | Px: 3045.85 | M: 3040.1 | B: 3050.4 / S: 3029.9 | delta: -0.1535(-0.0129) | Adj: -3.91%, Vol: 1.90, Thr: 0.0230 | PnL: -10.90 | TotPnL: -10.90
1766983320686, 2025-12-29 05:42:00,686 - [IDLE] BNB | Px: 869.32 | M: 869.4 | B: 871.3 / S: 867.4 | delta: -0.5772(+0.0018) | Adj: +0.05%, Vol: 1.05, Thr: 0.0866 | PnL: -0.06 | TotPnL: -0.06
1766983410347, 2025-12-29 05:43:30,347 - [IDLE] ETH | Px: 3047.35 | M: 3043.1 | B: 3053.1 / S: 3033.1 | delta: -0.1501(-0.0095) | Adj: -3.99%, Vol: 1.20, Thr: 0.0225 | PnL: -11.11 | TotPnL: -11.11
1766983410350, 2025-12-29 05:43:30,350 - [IDLE] BNB | Px: 869.52 | M: 869.8 | B: 871.7 / S: 867.9 | delta: -0.5676(+0.0114) | Adj: -0.06%, Vol: 1.00, Thr: 0.0851 | PnL: -0.17 | TotPnL: -0.17
1766983440872, 2025-12-29 05:44:00,872 - [IDLE] ETH | Px: 3047.15 | M: 3042.7 | B: 3052.8 / S: 3032.6 | delta: -0.1506(-0.0100) | Adj: -3.98%, Vol: 1.06, Thr: 0.0226 | PnL: -11.07 | TotPnL: -11.07
1766983440874, 2025-12-29 05:44:00,874 - [IDLE] BNB | Px: 869.34 | M: 869.4 | B: 871.3 / S: 867.4 | delta: -0.5767(+0.0023) | Adj: +0.05%, Vol: 1.00, Thr: 0.0865 | PnL: -0.10 | TotPnL: -0.10
1766983500399, 2025-12-29 05:45:00,399 - [IDLE] ETH | Px: 3045.85 | M: 3040.1 | B: 3050.4 / S: 3029.9 | delta: -0.1535(-0.0129) | Adj: -3.91%, Vol: 1.07, Thr: 0.0230 | PnL: -10.90 | TotPnL: -10.90
1766983500402, 2025-12-29 05:45:00,402 - [IDLE] BNB | Px: 869.44 | M: 869.6 | B: 871.5 / S: 867.7 | delta: -0.5714(+0.0076) | Adj: -0.02%, Vol: 1.00, Thr: 0.0857 | PnL: -0.13 | TotPnL: -0.13
1766983530852, 2025-12-29 05:45:30,852 - [IDLE] ETH | Px: 3045.05 | M: 3038.5 | B: 3048.9 / S: 3028.2 | delta: -0.1553(-0.0147) | Adj: -3.87%, Vol: 1.13, Thr: 0.0233 | PnL: -10.73 | TotPnL: -10.73
1766983530854, 2025-12-29 05:45:30,854 - [IDLE] BNB | Px: 869.32 | M: 869.3 | B: 871.3 / S: 867.4 | delta: -0.5776(+0.0014) | Adj: +0.06%, Vol: 1.00, Thr: 0.0866 | PnL: -0.05 | TotPnL: -0.05
1766983650920, 2025-12-29 05:47:30,920 - [IDLE] ETH | Px: 3044.15 | M: 3036.7 | B: 3047.2 / S: 3026.2 | delta: -0.1573(-0.0167) | Adj: -3.82%, Vol: 1.40, Thr: 0.0236 | PnL: -10.66 | TotPnL: -10.66
1766983650922, 2025-12-29 05:47:30,922 - [IDLE] BNB | Px: 869.22 | M: 869.1 | B: 871.1 / S: 867.2 | delta: -0.5822(-0.0032) | Adj: +0.12%, Vol: 1.00, Thr: 0.0873 | PnL: 0.01 | TotPnL: 0.01
1766983680725, 2025-12-29 05:48:00,725 - [IDLE] ETH | Px: 3044.25 | M: 3036.9 | B: 3047.4 / S: 3026.4 | delta: -0.1571(-0.0165) | Adj: -3.83%, Vol: 1.35, Thr: 0.0236 | PnL: -10.64 | TotPnL: -10.64
1766983680728, 2025-12-29 05:48:00,728 - [IDLE] BNB | Px: 869.28 | M: 869.3 | B: 871.2 / S: 867.3 | delta: -0.5791(-0.0001) | Adj: +0.08%, Vol: 1.00, Thr: 0.0869 | PnL: -0.04 | TotPnL: -0.04
1766983710673, 2025-12-29 05:48:30,673 - [IDLE] ETH | Px: 3044.15 | M: 3036.7 | B: 3047.2 / S: 3026.2 | delta: -0.1573(-0.0167) | Adj: -3.82%, Vol: 1.20, Thr: 0.0236 | PnL: -10.63 | TotPnL: -10.63
1766983710676, 2025-12-29 05:48:30,676 - [IDLE] BNB | Px: 869.13 | M: 869.0 | B: 870.9 / S: 867.0 | delta: -0.5865(-0.0075) | Adj: +0.17%, Vol: 1.00, Thr: 0.0880 | PnL: 0.04 | TotPnL: 0.04
1766983830715, 2025-12-29 05:50:30,715 - [IDLE] ETH | Px: 3043.35 | M: 3035.1 | B: 3045.7 / S: 3024.5 | delta: -0.1591(-0.0185) | Adj: -3.78%, Vol: 1.08, Thr: 0.0239 | PnL: -10.53 | TotPnL: -10.53
1766983830718, 2025-12-29 05:50:30,718 - [IDLE] BNB | Px: 868.78 | M: 868.2 | B: 870.3 / S: 866.2 | delta: -0.6031(-0.0241) | Adj: +0.37%, Vol: 1.00, Thr: 0.0905 | PnL: 0.30 | TotPnL: 0.30
1766983860864, 2025-12-29 05:51:00,864 - [IDLE] ETH | Px: 3043.65 | M: 3035.7 | B: 3046.3 / S: 3025.2 | delta: -0.1584(-0.0178) | Adj: -3.80%, Vol: 1.00, Thr: 0.0238 | PnL: -10.59 | TotPnL: -10.59
1766983860867, 2025-12-29 05:51:00,867 - [IDLE] BNB | Px: 868.94 | M: 868.6 | B: 870.6 / S: 866.6 | delta: -0.5959(-0.0169) | Adj: +0.28%, Vol: 1.00, Thr: 0.0894 | PnL: 0.20 | TotPnL: 0.20
1766983920930, 2025-12-29 05:52:00,930 - [IDLE] ETH | Px: 3041.15 | M: 3030.7 | B: 3041.7 / S: 3019.8 | delta: -0.1641(-0.0235) | Adj: -3.67%, Vol: 1.11, Thr: 0.0246 | PnL: -10.22 | TotPnL: -10.22
1766983920933, 2025-12-29 05:52:00,933 - [IDLE] BNB | Px: 868.50 | M: 867.7 | B: 869.7 / S: 865.6 | delta: -0.6167(-0.0377) | Adj: +0.53%, Vol: 1.00, Thr: 0.0925 | PnL: 0.47 | TotPnL: 0.47
1766983924859, 2025-12-29 05:52:04,859 - [TRIG] Net ETH: SELL 0.0248 | Tgt: -0.1654 / Cur: -0.1406 | Thresh: 0.0248
1766983924860, 2025-12-29 05:52:04,860 - [ORDER] ALO ETH SELL 0.0248 @ 3040.6
1766983926618, 2025-12-29 05:52:06,618 - Sleeping 5s to allow position update...
1766983950997, 2025-12-29 05:52:30,997 - [IDLE] ETH | Px: 3040.25 | M: 3039.9 | B: 3051.0 / S: 3028.9 | delta: -0.1661(-0.0007) | Adj: -3.62%, Vol: 1.16, Thr: 0.0249 | PnL: -10.12 | TotPnL: -10.12
1766984010082, 2025-12-29 05:53:30,082 - [IDLE] ETH | Px: 3039.05 | M: 3037.5 | B: 3048.8 / S: 3026.3 | delta: -0.1688(-0.0034) | Adj: -3.56%, Vol: 1.33, Thr: 0.0253 | PnL: -9.89 | TotPnL: -9.89
1766984010085, 2025-12-29 05:53:30,085 - [IDLE] BNB | Px: 868.06 | M: 866.7 | B: 868.9 / S: 864.6 | delta: -0.6383(-0.0593) | Adj: +0.79%, Vol: 1.00, Thr: 0.0957 | PnL: 0.65 | TotPnL: 0.65
1766984040268, 2025-12-29 05:54:00,268 - [IDLE] ETH | Px: 3039.35 | M: 3038.1 | B: 3049.3 / S: 3026.9 | delta: -0.1682(-0.0028) | Adj: -3.57%, Vol: 1.40, Thr: 0.0252 | PnL: -9.95 | TotPnL: -9.95
1766984040271, 2025-12-29 05:54:00,271 - [IDLE] BNB | Px: 868.13 | M: 866.9 | B: 869.0 / S: 864.7 | delta: -0.6349(-0.0559) | Adj: +0.75%, Vol: 1.05, Thr: 0.0952 | PnL: 0.65 | TotPnL: 0.65
1766984070708, 2025-12-29 05:54:30,708 - [IDLE] ETH | Px: 3039.35 | M: 3038.1 | B: 3049.3 / S: 3026.9 | delta: -0.1682(-0.0028) | Adj: -3.57%, Vol: 1.45, Thr: 0.0252 | PnL: -9.94 | TotPnL: -9.94
1766984070711, 2025-12-29 05:54:30,711 - [IDLE] BNB | Px: 868.10 | M: 866.8 | B: 869.0 / S: 864.7 | delta: -0.6363(-0.0573) | Adj: +0.77%, Vol: 1.09, Thr: 0.0955 | PnL: 0.66 | TotPnL: 0.66
1766984100726, 2025-12-29 05:55:00,726 - [IDLE] ETH | Px: 3040.15 | M: 3039.7 | B: 3050.8 / S: 3028.7 | delta: -0.1663(-0.0009) | Adj: -3.62%, Vol: 1.45, Thr: 0.0250 | PnL: -10.09 | TotPnL: -10.09
1766984100729, 2025-12-29 05:55:00,729 - [IDLE] BNB | Px: 868.14 | M: 866.9 | B: 869.0 / S: 864.8 | delta: -0.6342(-0.0552) | Adj: +0.74%, Vol: 1.08, Thr: 0.0951 | PnL: 0.65 | TotPnL: 0.65
1766984130556, 2025-12-29 05:55:30,556 - [IDLE] ETH | Px: 3042.05 | M: 3043.5 | B: 3054.3 / S: 3032.7 | delta: -0.1621(+0.0033) | Adj: -3.71%, Vol: 1.38, Thr: 0.0243 | PnL: -10.35 | TotPnL: -10.35
1766984130558, 2025-12-29 05:55:30,558 - [IDLE] BNB | Px: 868.56 | M: 867.8 | B: 869.8 / S: 865.7 | delta: -0.6138(-0.0348) | Adj: +0.50%, Vol: 1.04, Thr: 0.0921 | PnL: 0.42 | TotPnL: 0.42
1766984160838, 2025-12-29 05:56:00,838 - [IDLE] ETH | Px: 3042.45 | M: 3044.3 | B: 3055.1 / S: 3033.6 | delta: -0.1611(+0.0043) | Adj: -3.73%, Vol: 1.32, Thr: 0.0242 | PnL: -10.45 | TotPnL: -10.45
1766984160841, 2025-12-29 05:56:00,841 - [IDLE] BNB | Px: 868.54 | M: 867.7 | B: 869.8 / S: 865.7 | delta: -0.6150(-0.0360) | Adj: +0.51%, Vol: 1.00, Thr: 0.0922 | PnL: 0.42 | TotPnL: 0.42
1766984190576, 2025-12-29 05:56:30,576 - [IDLE] ETH | Px: 3041.05 | M: 3041.5 | B: 3052.5 / S: 3030.6 | delta: -0.1643(+0.0011) | Adj: -3.66%, Vol: 1.27, Thr: 0.0246 | PnL: -10.22 | TotPnL: -10.22
1766984190579, 2025-12-29 05:56:30,579 - [IDLE] BNB | Px: 868.38 | M: 867.4 | B: 869.5 / S: 865.3 | delta: -0.6227(-0.0437) | Adj: +0.61%, Vol: 1.00, Thr: 0.0934 | PnL: 0.50 | TotPnL: 0.50
1766984220961, 2025-12-29 05:57:00,961 - [IDLE] ETH | Px: 3040.55 | M: 3040.5 | B: 3051.5 / S: 3029.5 | delta: -0.1654(-0.0000) | Adj: -3.64%, Vol: 1.22, Thr: 0.0248 | PnL: -10.15 | TotPnL: -10.15
1766984220964, 2025-12-29 05:57:00,964 - [IDLE] BNB | Px: 868.49 | M: 867.6 | B: 869.7 / S: 865.6 | delta: -0.6174(-0.0384) | Adj: +0.54%, Vol: 1.00, Thr: 0.0926 | PnL: 0.43 | TotPnL: 0.43
1766984400215, 2025-12-29 06:00:00,215 - [IDLE] ETH | Px: 3038.65 | M: 3036.7 | B: 3048.0 / S: 3025.4 | delta: -0.1697(-0.0043) | Adj: -3.54%, Vol: 1.00, Thr: 0.0255 | PnL: -9.80 | TotPnL: -9.80
1766984400218, 2025-12-29 06:00:00,218 - [IDLE] BNB | Px: 868.38 | M: 867.4 | B: 869.5 / S: 865.3 | delta: -0.6230(-0.0440) | Adj: +0.61%, Vol: 1.00, Thr: 0.0934 | PnL: 0.53 | TotPnL: 0.53
1766984460070, 2025-12-29 06:01:00,070 - [IDLE] ETH | Px: 3039.85 | M: 3039.1 | B: 3050.2 / S: 3028.0 | delta: -0.1670(-0.0016) | Adj: -3.60%, Vol: 1.00, Thr: 0.0251 | PnL: -10.04 | TotPnL: -10.04
1766984460073, 2025-12-29 06:01:00,073 - [IDLE] BNB | Px: 868.32 | M: 867.3 | B: 869.4 / S: 865.2 | delta: -0.6259(-0.0469) | Adj: +0.64%, Vol: 1.00, Thr: 0.0939 | PnL: 0.56 | TotPnL: 0.56
1766984490373, 2025-12-29 06:01:30,373 - [IDLE] ETH | Px: 3039.85 | M: 3039.1 | B: 3050.2 / S: 3028.0 | delta: -0.1670(-0.0016) | Adj: -3.60%, Vol: 1.00, Thr: 0.0251 | PnL: -10.02 | TotPnL: -10.02
1766984490375, 2025-12-29 06:01:30,375 - [IDLE] BNB | Px: 868.32 | M: 867.3 | B: 869.4 / S: 865.2 | delta: -0.6259(-0.0469) | Adj: +0.64%, Vol: 1.00, Thr: 0.0939 | PnL: 0.55 | TotPnL: 0.55
1766984520649, 2025-12-29 06:02:00,649 - [IDLE] ETH | Px: 3039.85 | M: 3039.1 | B: 3050.2 / S: 3028.0 | delta: -0.1670(-0.0016) | Adj: -3.60%, Vol: 1.00, Thr: 0.0251 | PnL: -10.02 | TotPnL: -10.02
1766984520651, 2025-12-29 06:02:00,651 - [IDLE] BNB | Px: 868.30 | M: 867.2 | B: 869.3 / S: 865.1 | delta: -0.6269(-0.0479) | Adj: +0.65%, Vol: 1.00, Thr: 0.0940 | PnL: 0.55 | TotPnL: 0.55
1766984610641, 2025-12-29 06:03:30,641 - [IDLE] ETH | Px: 3035.45 | M: 3030.3 | B: 3042.1 / S: 3018.6 | delta: -0.1770(-0.0116) | Adj: -3.37%, Vol: 1.00, Thr: 0.0266 | PnL: -9.51 | TotPnL: -9.51
1766984610643, 2025-12-29 06:03:30,643 - [IDLE] BNB | Px: 868.38 | M: 867.4 | B: 869.5 / S: 865.3 | delta: -0.6225(-0.0435) | Adj: +0.60%, Vol: 1.00, Thr: 0.0934 | PnL: 0.52 | TotPnL: 0.52
1766984640266, 2025-12-29 06:04:00,266 - [IDLE] ETH | Px: 3033.45 | M: 3026.3 | B: 3038.3 / S: 3014.3 | delta: -0.1816(-0.0162) | Adj: -3.27%, Vol: 1.21, Thr: 0.0272 | PnL: -8.99 | TotPnL: -8.99
1766984640269, 2025-12-29 06:04:00,269 - [IDLE] BNB | Px: 868.18 | M: 867.0 | B: 869.1 / S: 864.9 | delta: -0.6322(-0.0532) | Adj: +0.72%, Vol: 1.00, Thr: 0.0948 | PnL: 0.65 | TotPnL: 0.65
1766984670519, 2025-12-29 06:04:30,519 - [IDLE] ETH | Px: 3034.35 | M: 3028.1 | B: 3040.0 / S: 3016.2 | delta: -0.1795(-0.0141) | Adj: -3.32%, Vol: 1.45, Thr: 0.0269 | PnL: -9.06 | TotPnL: -9.06
1766984670522, 2025-12-29 06:04:30,522 - [IDLE] BNB | Px: 868.22 | M: 867.1 | B: 869.2 / S: 864.9 | delta: -0.6305(-0.0515) | Adj: +0.70%, Vol: 1.00, Thr: 0.0946 | PnL: 0.63 | TotPnL: 0.63
1766984730700, 2025-12-29 06:05:30,700 - [IDLE] ETH | Px: 3034.55 | M: 3028.5 | B: 3040.4 / S: 3016.6 | delta: -0.1791(-0.0137) | Adj: -3.33%, Vol: 1.71, Thr: 0.0269 | PnL: -9.16 | TotPnL: -9.16
1766984730703, 2025-12-29 06:05:30,703 - [IDLE] BNB | Px: 868.53 | M: 867.7 | B: 869.8 / S: 865.6 | delta: -0.6155(-0.0365) | Adj: +0.52%, Vol: 1.00, Thr: 0.0923 | PnL: 0.46 | TotPnL: 0.46
1766984760287, 2025-12-29 06:06:00,287 - [IDLE] ETH | Px: 3035.35 | M: 3030.1 | B: 3041.9 / S: 3018.3 | delta: -0.1772(-0.0118) | Adj: -3.37%, Vol: 1.68, Thr: 0.0266 | PnL: -9.29 | TotPnL: -9.29
1766984760288, 2025-12-29 06:06:00,288 - [IDLE] BNB | Px: 868.44 | M: 867.5 | B: 869.6 / S: 865.5 | delta: -0.6196(-0.0406) | Adj: +0.57%, Vol: 1.00, Thr: 0.0929 | PnL: 0.47 | TotPnL: 0.47
1766984850199, 2025-12-29 06:07:30,199 - [IDLE] ETH | Px: 3034.25 | M: 3027.9 | B: 3039.8 / S: 3016.0 | delta: -0.1797(-0.0143) | Adj: -3.31%, Vol: 1.66, Thr: 0.0270 | PnL: -9.16 | TotPnL: -9.16
1766984850201, 2025-12-29 06:07:30,201 - [IDLE] BNB | Px: 868.26 | M: 867.1 | B: 869.3 / S: 865.0 | delta: -0.6288(-0.0498) | Adj: +0.68%, Vol: 1.00, Thr: 0.0943 | PnL: 0.53 | TotPnL: 0.53
1766984880382, 2025-12-29 06:08:00,382 - [IDLE] ETH | Px: 3034.55 | M: 3028.5 | B: 3040.4 / S: 3016.6 | delta: -0.1791(-0.0137) | Adj: -3.33%, Vol: 1.64, Thr: 0.0269 | PnL: -9.16 | TotPnL: -9.16
1766984880384, 2025-12-29 06:08:00,384 - [IDLE] BNB | Px: 867.64 | M: 865.9 | B: 868.1 / S: 863.7 | delta: -0.6586(-0.0796) | Adj: +1.03%, Vol: 1.00, Thr: 0.0988 | PnL: 0.94 | TotPnL: 0.94
1766984940003, 2025-12-29 06:09:00,003 - [IDLE] ETH | Px: 3038.15 | M: 3035.7 | B: 3047.1 / S: 3024.4 | delta: -0.1709(-0.0055) | Adj: -3.51%, Vol: 1.50, Thr: 0.0256 | PnL: -9.70 | TotPnL: -9.70
1766984940006, 2025-12-29 06:09:00,006 - [IDLE] BNB | Px: 868.10 | M: 866.8 | B: 869.0 / S: 864.7 | delta: -0.6363(-0.0573) | Adj: +0.77%, Vol: 1.00, Thr: 0.0955 | PnL: 0.68 | TotPnL: 0.68
1766985000707, 2025-12-29 06:10:00,707 - [IDLE] ETH | Px: 3034.45 | M: 3028.3 | B: 3040.2 / S: 3016.4 | delta: -0.1793(-0.0139) | Adj: -3.32%, Vol: 1.43, Thr: 0.0269 | PnL: -9.13 | TotPnL: -9.13
1766985000710, 2025-12-29 06:10:00,710 - [IDLE] BNB | Px: 867.20 | M: 864.9 | B: 867.2 / S: 862.7 | delta: -0.6802(-0.1012) | Adj: +1.29%, Vol: 1.00, Thr: 0.1020 | PnL: 1.23 | TotPnL: 1.23
1766985002853, 2025-12-29 06:10:02,853 - [TRIG] Net BNB: SELL 0.1085 | Tgt: -0.6875 / Cur: -0.5790 | Thresh: 0.1031
1766985002853, 2025-12-29 06:10:02,853 - [ORDER] ALO BNB SELL 0.108 @ 867.1
1766985004972, 2025-12-29 06:10:04,972 - Sleeping 5s to allow position update...
1766985030719, 2025-12-29 06:10:30,719 - [IDLE] ETH | Px: 3035.65 | M: 3030.7 | B: 3042.4 / S: 3019.0 | delta: -0.1766(-0.0112) | Adj: -3.38%, Vol: 1.36, Thr: 0.0265 | PnL: -9.27 | TotPnL: -9.27
1766985030721, 2025-12-29 06:10:30,721 - [WAIT] BNB Pending SELL Order 281210439159 @ 867.1 (Dist: 0.001%)
1766985034615, 2025-12-29 06:10:34,615 - Cancelling idle order 281210439159 (A @ 867.1)
1766985060669, 2025-12-29 06:11:00,669 - [IDLE] ETH | Px: 3036.75 | M: 3032.9 | B: 3044.5 / S: 3021.4 | delta: -0.1741(-0.0087) | Adj: -3.44%, Vol: 1.24, Thr: 0.0261 | PnL: -9.51 | TotPnL: -9.51
1766985060672, 2025-12-29 06:11:00,672 - [IDLE] BNB | Px: 867.28 | M: 866.4 | B: 868.7 / S: 864.2 | delta: -0.6767(-0.0377) | Adj: +1.25%, Vol: 1.00, Thr: 0.1015 | PnL: 1.10 | TotPnL: 1.10
1766985090464, 2025-12-29 06:11:30,464 - [IDLE] ETH | Px: 3037.95 | M: 3035.3 | B: 3046.7 / S: 3023.9 | delta: -0.1713(-0.0059) | Adj: -3.50%, Vol: 1.12, Thr: 0.0257 | PnL: -9.72 | TotPnL: -9.72
1766985090467, 2025-12-29 06:11:30,467 - [IDLE] BNB | Px: 867.34 | M: 866.6 | B: 868.8 / S: 864.3 | delta: -0.6733(-0.0343) | Adj: +1.21%, Vol: 1.03, Thr: 0.1010 | PnL: 1.03 | TotPnL: 1.03
1766985150181, 2025-12-29 06:12:30,181 - [IDLE] ETH | Px: 3038.75 | M: 3036.9 | B: 3048.2 / S: 3025.7 | delta: -0.1695(-0.0041) | Adj: -3.54%, Vol: 1.19, Thr: 0.0254 | PnL: -9.85 | TotPnL: -9.85
1766985150184, 2025-12-29 06:12:30,184 - [IDLE] BNB | Px: 867.56 | M: 867.0 | B: 869.2 / S: 864.8 | delta: -0.6630(-0.0240) | Adj: +1.09%, Vol: 1.04, Thr: 0.0994 | PnL: 0.94 | TotPnL: 0.94
1766985330338, 2025-12-29 06:15:30,338 - [IDLE] ETH | Px: 3040.25 | M: 3039.9 | B: 3051.0 / S: 3028.9 | delta: -0.1661(-0.0007) | Adj: -3.62%, Vol: 1.79, Thr: 0.0249 | PnL: -10.09 | TotPnL: -10.09
1766985330341, 2025-12-29 06:15:30,341 - [IDLE] BNB | Px: 867.44 | M: 866.8 | B: 869.0 / S: 864.5 | delta: -0.6684(-0.0294) | Adj: +1.15%, Vol: 1.00, Thr: 0.1003 | PnL: 1.03 | TotPnL: 1.03
1766985390060, 2025-12-29 06:16:30,060 - [IDLE] ETH | Px: 3039.55 | M: 3038.5 | B: 3049.7 / S: 3027.4 | delta: -0.1677(-0.0023) | Adj: -3.58%, Vol: 1.74, Thr: 0.0252 | PnL: -9.97 | TotPnL: -9.97
1766985390062, 2025-12-29 06:16:30,062 - [IDLE] BNB | Px: 867.56 | M: 867.0 | B: 869.3 / S: 864.8 | delta: -0.6625(-0.0235) | Adj: +1.08%, Vol: 1.00, Thr: 0.0994 | PnL: 0.99 | TotPnL: 0.99
1766985420317, 2025-12-29 06:17:00,317 - [IDLE] ETH | Px: 3039.75 | M: 3038.9 | B: 3050.1 / S: 3027.8 | delta: -0.1672(-0.0018) | Adj: -3.60%, Vol: 1.66, Thr: 0.0251 | PnL: -9.99 | TotPnL: -9.99
1766985420320, 2025-12-29 06:17:00,320 - [IDLE] BNB | Px: 867.68 | M: 867.3 | B: 869.5 / S: 865.1 | delta: -0.6571(-0.0181) | Adj: +1.02%, Vol: 1.00, Thr: 0.0986 | PnL: 0.92 | TotPnL: 0.92
1766985480870, 2025-12-29 06:18:00,870 - [IDLE] ETH | Px: 3040.45 | M: 3040.3 | B: 3051.4 / S: 3029.3 | delta: -0.1657(-0.0003) | Adj: -3.63%, Vol: 1.48, Thr: 0.0248 | PnL: -10.12 | TotPnL: -10.12
1766985480873, 2025-12-29 06:18:00,873 - [IDLE] BNB | Px: 867.34 | M: 866.6 | B: 868.8 / S: 864.3 | delta: -0.6733(-0.0343) | Adj: +1.21%, Vol: 1.00, Thr: 0.1010 | PnL: 1.06 | TotPnL: 1.06
1766985510732, 2025-12-29 06:18:30,732 - [IDLE] ETH | Px: 3038.25 | M: 3035.9 | B: 3047.3 / S: 3024.6 | delta: -0.1706(-0.0052) | Adj: -3.52%, Vol: 1.45, Thr: 0.0256 | PnL: -9.72 | TotPnL: -9.72
1766985510735, 2025-12-29 06:18:30,735 - [IDLE] BNB | Px: 867.01 | M: 865.9 | B: 868.2 / S: 863.6 | delta: -0.6898(-0.0508) | Adj: +1.40%, Vol: 1.00, Thr: 0.1035 | PnL: 1.29 | TotPnL: 1.29
1766985570705, 2025-12-29 06:19:30,705 - [IDLE] ETH | Px: 3037.25 | M: 3033.9 | B: 3045.4 / S: 3022.4 | delta: -0.1729(-0.0075) | Adj: -3.47%, Vol: 1.26, Thr: 0.0259 | PnL: -9.56 | TotPnL: -9.56
1766985570707, 2025-12-29 06:19:30,707 - [IDLE] BNB | Px: 866.88 | M: 865.6 | B: 867.9 / S: 863.3 | delta: -0.6959(-0.0569) | Adj: +1.48%, Vol: 1.00, Thr: 0.1044 | PnL: 1.40 | TotPnL: 1.40
1766985690574, 2025-12-29 06:21:30,574 - [IDLE] ETH | Px: 3036.75 | M: 3032.9 | B: 3044.5 / S: 3021.4 | delta: -0.1741(-0.0087) | Adj: -3.44%, Vol: 1.08, Thr: 0.0261 | PnL: -9.51 | TotPnL: -9.51
1766985690577, 2025-12-29 06:21:30,577 - [IDLE] BNB | Px: 866.73 | M: 865.3 | B: 867.6 / S: 862.9 | delta: -0.7036(-0.0646) | Adj: +1.57%, Vol: 1.00, Thr: 0.1055 | PnL: 1.47 | TotPnL: 1.47
1766985720479, 2025-12-29 06:22:00,479 - [IDLE] ETH | Px: 3036.55 | M: 3032.5 | B: 3044.1 / S: 3020.9 | delta: -0.1745(-0.0091) | Adj: -3.43%, Vol: 1.15, Thr: 0.0262 | PnL: -9.49 | TotPnL: -9.49
1766985720482, 2025-12-29 06:22:00,482 - [IDLE] BNB | Px: 866.42 | M: 864.6 | B: 867.0 / S: 862.2 | delta: -0.7192(-0.0802) | Adj: +1.75%, Vol: 1.08, Thr: 0.1079 | PnL: 1.72 | TotPnL: 1.72
1766985750172, 2025-12-29 06:22:30,172 - [IDLE] ETH | Px: 3037.25 | M: 3033.9 | B: 3045.4 / S: 3022.4 | delta: -0.1729(-0.0075) | Adj: -3.47%, Vol: 1.18, Thr: 0.0259 | PnL: -9.59 | TotPnL: -9.59
1766985750175, 2025-12-29 06:22:30,175 - [IDLE] BNB | Px: 866.34 | M: 864.5 | B: 866.9 / S: 862.0 | delta: -0.7230(-0.0840) | Adj: +1.79%, Vol: 1.17, Thr: 0.1084 | PnL: 1.72 | TotPnL: 1.72
1766985780899, 2025-12-29 06:23:00,899 - [IDLE] ETH | Px: 3037.05 | M: 3033.5 | B: 3045.0 / S: 3022.0 | delta: -0.1734(-0.0080) | Adj: -3.46%, Vol: 1.18, Thr: 0.0260 | PnL: -9.57 | TotPnL: -9.57
1766985780902, 2025-12-29 06:23:00,902 - [IDLE] BNB | Px: 866.26 | M: 864.3 | B: 866.7 / S: 861.9 | delta: -0.7272(-0.0882) | Adj: +1.84%, Vol: 1.24, Thr: 0.1091 | PnL: 1.80 | TotPnL: 1.80
1766985870557, 2025-12-29 06:24:30,557 - [IDLE] ETH | Px: 3038.55 | M: 3036.5 | B: 3047.8 / S: 3025.2 | delta: -0.1700(-0.0046) | Adj: -3.53%, Vol: 1.00, Thr: 0.0255 | PnL: -9.82 | TotPnL: -9.82
1766985870559, 2025-12-29 06:24:30,559 - [IDLE] BNB | Px: 866.59 | M: 865.0 | B: 867.4 / S: 862.6 | delta: -0.7105(-0.0715) | Adj: +1.65%, Vol: 1.08, Thr: 0.1066 | PnL: 1.54 | TotPnL: 1.54
1766985930277, 2025-12-29 06:25:30,277 - [IDLE] ETH | Px: 3036.75 | M: 3032.9 | B: 3044.5 / S: 3021.4 | delta: -0.1741(-0.0087) | Adj: -3.44%, Vol: 1.00, Thr: 0.0261 | PnL: -9.52 | TotPnL: -9.52
1766985930280, 2025-12-29 06:25:30,280 - [IDLE] BNB | Px: 866.54 | M: 864.9 | B: 867.3 / S: 862.5 | delta: -0.7133(-0.0743) | Adj: +1.68%, Vol: 1.00, Thr: 0.1070 | PnL: 1.61 | TotPnL: 1.61
1766985990861, 2025-12-29 06:26:30,861 - [IDLE] ETH | Px: 3036.65 | M: 3032.7 | B: 3044.3 / S: 3021.1 | delta: -0.1743(-0.0089) | Adj: -3.44%, Vol: 1.00, Thr: 0.0261 | PnL: -9.52 | TotPnL: -9.52
1766985990864, 2025-12-29 06:26:30,864 - [IDLE] BNB | Px: 866.52 | M: 864.8 | B: 867.2 / S: 862.4 | delta: -0.7143(-0.0753) | Adj: +1.69%, Vol: 1.00, Thr: 0.1071 | PnL: 1.67 | TotPnL: 1.67
1766986110034, 2025-12-29 06:28:30,034 - [IDLE] ETH | Px: 3035.85 | M: 3031.1 | B: 3042.8 / S: 3019.4 | delta: -0.1761(-0.0107) | Adj: -3.39%, Vol: 1.00, Thr: 0.0264 | PnL: -9.37 | TotPnL: -9.37
1766986110037, 2025-12-29 06:28:30,037 - [IDLE] BNB | Px: 866.20 | M: 864.2 | B: 866.6 / S: 861.7 | delta: -0.7302(-0.0912) | Adj: +1.88%, Vol: 1.00, Thr: 0.1095 | PnL: 1.83 | TotPnL: 1.83
1766986170521, 2025-12-29 06:29:30,521 - [IDLE] ETH | Px: 3035.45 | M: 3030.3 | B: 3042.1 / S: 3018.6 | delta: -0.1770(-0.0116) | Adj: -3.37%, Vol: 1.00, Thr: 0.0266 | PnL: -9.31 | TotPnL: -9.31
1766986170524, 2025-12-29 06:29:30,524 - [IDLE] BNB | Px: 866.20 | M: 864.2 | B: 866.6 / S: 861.7 | delta: -0.7302(-0.0912) | Adj: +1.88%, Vol: 1.00, Thr: 0.1095 | PnL: 1.80 | TotPnL: 1.80
1766986200655, 2025-12-29 06:30:00,655 - [IDLE] ETH | Px: 3035.25 | M: 3029.9 | B: 3041.7 / S: 3018.1 | delta: -0.1775(-0.0121) | Adj: -3.36%, Vol: 1.00, Thr: 0.0266 | PnL: -9.29 | TotPnL: -9.29
1766986200657, 2025-12-29 06:30:00,657 - [IDLE] BNB | Px: 866.15 | M: 864.1 | B: 866.5 / S: 861.6 | delta: -0.7324(-0.0934) | Adj: +1.90%, Vol: 1.00, Thr: 0.1099 | PnL: 1.83 | TotPnL: 1.83
1766986350574, 2025-12-29 06:32:30,574 - [IDLE] ETH | Px: 3034.95 | M: 3029.3 | B: 3041.1 / S: 3017.5 | delta: -0.1782(-0.0128) | Adj: -3.35%, Vol: 1.00, Thr: 0.0267 | PnL: -9.23 | TotPnL: -9.23
1766986350576, 2025-12-29 06:32:30,576 - [IDLE] BNB | Px: 866.14 | M: 864.0 | B: 866.5 / S: 861.6 | delta: -0.7332(-0.0942) | Adj: +1.91%, Vol: 1.00, Thr: 0.1100 | PnL: 1.87 | TotPnL: 1.87
1766986380986, 2025-12-29 06:33:00,986 - [IDLE] ETH | Px: 3034.65 | M: 3028.7 | B: 3040.6 / S: 3016.8 | delta: -0.1788(-0.0134) | Adj: -3.33%, Vol: 1.00, Thr: 0.0268 | PnL: -9.14 | TotPnL: -9.14
1766986380989, 2025-12-29 06:33:00,989 - [IDLE] BNB | Px: 866.14 | M: 864.0 | B: 866.5 / S: 861.6 | delta: -0.7332(-0.0942) | Adj: +1.91%, Vol: 1.00, Thr: 0.1100 | PnL: 1.87 | TotPnL: 1.87
1766986440933, 2025-12-29 06:34:00,933 - [IDLE] ETH | Px: 3035.65 | M: 3030.7 | B: 3042.4 / S: 3019.0 | delta: -0.1766(-0.0112) | Adj: -3.38%, Vol: 1.00, Thr: 0.0265 | PnL: -9.27 | TotPnL: -9.27
1766986440935, 2025-12-29 06:34:00,935 - [IDLE] BNB | Px: 866.24 | M: 864.2 | B: 866.7 / S: 861.8 | delta: -0.7282(-0.0892) | Adj: +1.86%, Vol: 1.00, Thr: 0.1092 | PnL: 1.92 | TotPnL: 1.92
1766986500326, 2025-12-29 06:35:00,326 - [IDLE] ETH | Px: 3035.45 | M: 3030.3 | B: 3042.1 / S: 3018.6 | delta: -0.1770(-0.0116) | Adj: -3.37%, Vol: 1.00, Thr: 0.0266 | PnL: -9.24 | TotPnL: -9.24
1766986500329, 2025-12-29 06:35:00,329 - [IDLE] BNB | Px: 865.90 | M: 863.5 | B: 866.0 / S: 861.0 | delta: -0.7452(-0.1062) | Adj: +2.05%, Vol: 1.00, Thr: 0.1118 | PnL: 2.00 | TotPnL: 2.00
1766986530765, 2025-12-29 06:35:30,765 - [IDLE] ETH | Px: 3035.65 | M: 3030.7 | B: 3042.4 / S: 3019.0 | delta: -0.1766(-0.0112) | Adj: -3.38%, Vol: 1.00, Thr: 0.0265 | PnL: -9.31 | TotPnL: -9.31
1766986530768, 2025-12-29 06:35:30,768 - [IDLE] BNB | Px: 866.04 | M: 863.8 | B: 866.3 / S: 861.4 | delta: -0.7379(-0.0989) | Adj: +1.97%, Vol: 1.00, Thr: 0.1107 | PnL: 1.93 | TotPnL: 1.93
1766986560795, 2025-12-29 06:36:00,795 - [IDLE] ETH | Px: 3036.05 | M: 3031.5 | B: 3043.2 / S: 3019.9 | delta: -0.1756(-0.0102) | Adj: -3.40%, Vol: 1.00, Thr: 0.0263 | PnL: -9.39 | TotPnL: -9.39
1766986560798, 2025-12-29 06:36:00,798 - [IDLE] BNB | Px: 866.36 | M: 864.5 | B: 866.9 / S: 862.1 | delta: -0.7222(-0.0832) | Adj: +1.79%, Vol: 1.00, Thr: 0.1083 | PnL: 1.74 | TotPnL: 1.74
1766986710529, 2025-12-29 06:38:30,529 - [IDLE] ETH | Px: 3039.45 | M: 3038.3 | B: 3049.5 / S: 3027.2 | delta: -0.1679(-0.0025) | Adj: -3.58%, Vol: 1.52, Thr: 0.0252 | PnL: -9.95 | TotPnL: -9.95
1766986710532, 2025-12-29 06:38:30,532 - [IDLE] BNB | Px: 866.78 | M: 865.4 | B: 867.7 / S: 863.0 | delta: -0.7014(-0.0624) | Adj: +1.54%, Vol: 1.00, Thr: 0.1052 | PnL: 1.46 | TotPnL: 1.46
1766986740525, 2025-12-29 06:39:00,525 - [IDLE] ETH | Px: 3038.75 | M: 3036.9 | B: 3048.2 / S: 3025.7 | delta: -0.1695(-0.0041) | Adj: -3.54%, Vol: 1.55, Thr: 0.0254 | PnL: -9.82 | TotPnL: -9.82
1766986740528, 2025-12-29 06:39:00,528 - [IDLE] BNB | Px: 866.32 | M: 864.4 | B: 866.9 / S: 862.0 | delta: -0.7237(-0.0847) | Adj: +1.80%, Vol: 1.00, Thr: 0.1086 | PnL: 1.74 | TotPnL: 1.74
1766986770504, 2025-12-29 06:39:30,504 - [IDLE] ETH | Px: 3038.95 | M: 3037.3 | B: 3048.6 / S: 3026.1 | delta: -0.1691(-0.0037) | Adj: -3.55%, Vol: 1.57, Thr: 0.0254 | PnL: -9.85 | TotPnL: -9.85
1766986770507, 2025-12-29 06:39:30,507 - [IDLE] BNB | Px: 866.23 | M: 864.2 | B: 866.7 / S: 861.8 | delta: -0.7284(-0.0894) | Adj: +1.86%, Vol: 1.00, Thr: 0.1093 | PnL: 1.83 | TotPnL: 1.83
1766986800351, 2025-12-29 06:40:00,351 - [IDLE] ETH | Px: 3038.35 | M: 3036.1 | B: 3047.5 / S: 3024.8 | delta: -0.1704(-0.0050) | Adj: -3.52%, Vol: 1.57, Thr: 0.0256 | PnL: -9.74 | TotPnL: -9.74
1766986800353, 2025-12-29 06:40:00,353 - [IDLE] BNB | Px: 865.98 | M: 863.7 | B: 866.2 / S: 861.2 | delta: -0.7409(-0.1019) | Adj: +2.00%, Vol: 1.00, Thr: 0.1111 | PnL: 1.93 | TotPnL: 1.93
1766986830846, 2025-12-29 06:40:30,846 - [IDLE] ETH | Px: 3039.25 | M: 3037.9 | B: 3049.1 / S: 3026.7 | delta: -0.1684(-0.0030) | Adj: -3.57%, Vol: 1.56, Thr: 0.0253 | PnL: -9.89 | TotPnL: -9.89
1766986830848, 2025-12-29 06:40:30,848 - [IDLE] BNB | Px: 866.15 | M: 864.1 | B: 866.5 / S: 861.6 | delta: -0.7324(-0.0934) | Adj: +1.90%, Vol: 1.00, Thr: 0.1099 | PnL: 1.84 | TotPnL: 1.84
1766986920410, 2025-12-29 06:42:00,410 - [IDLE] ETH | Px: 3040.15 | M: 3039.7 | B: 3050.8 / S: 3028.7 | delta: -0.1663(-0.0009) | Adj: -3.62%, Vol: 1.48, Thr: 0.0250 | PnL: -10.07 | TotPnL: -10.07
1766986920412, 2025-12-29 06:42:00,412 - [IDLE] BNB | Px: 866.36 | M: 864.5 | B: 866.9 / S: 862.1 | delta: -0.7222(-0.0832) | Adj: +1.79%, Vol: 1.00, Thr: 0.1083 | PnL: 1.75 | TotPnL: 1.75
1766986980523, 2025-12-29 06:43:00,523 - [IDLE] ETH | Px: 3041.55 | M: 3042.5 | B: 3053.4 / S: 3031.7 | delta: -0.1632(+0.0022) | Adj: -3.69%, Vol: 1.33, Thr: 0.0245 | PnL: -10.30 | TotPnL: -10.30
1766986980526, 2025-12-29 06:43:00,526 - [IDLE] BNB | Px: 866.46 | M: 864.7 | B: 867.1 / S: 862.3 | delta: -0.7170(-0.0780) | Adj: +1.72%, Vol: 1.00, Thr: 0.1075 | PnL: 1.68 | TotPnL: 1.68
1766987070017, 2025-12-29 06:44:30,017 - [IDLE] ETH | Px: 3043.15 | M: 3045.7 | B: 3056.4 / S: 3035.1 | delta: -0.1596(+0.0058) | Adj: -3.77%, Vol: 1.27, Thr: 0.0239 | PnL: -10.53 | TotPnL: -10.53
1766987070020, 2025-12-29 06:44:30,020 - [IDLE] BNB | Px: 866.82 | M: 865.5 | B: 867.8 / S: 863.1 | delta: -0.6989(-0.0599) | Adj: +1.51%, Vol: 1.00, Thr: 0.1048 | PnL: 1.49 | TotPnL: 1.49
1766987100862, 2025-12-29 06:45:00,862 - [IDLE] ETH | Px: 3043.05 | M: 3045.5 | B: 3056.2 / S: 3034.9 | delta: -0.1598(+0.0056) | Adj: -3.77%, Vol: 1.20, Thr: 0.0240 | PnL: -10.55 | TotPnL: -10.55
1766987100864, 2025-12-29 06:45:00,864 - [IDLE] BNB | Px: 866.80 | M: 865.4 | B: 867.8 / S: 863.1 | delta: -0.7004(-0.0614) | Adj: +1.53%, Vol: 1.00, Thr: 0.1051 | PnL: 1.44 | TotPnL: 1.44
1766987190441, 2025-12-29 06:46:30,441 - [IDLE] ETH | Px: 3042.85 | M: 3045.1 | B: 3055.8 / S: 3034.5 | delta: -0.1602(+0.0052) | Adj: -3.75%, Vol: 1.19, Thr: 0.0240 | PnL: -10.63 | TotPnL: -10.63
1766987190444, 2025-12-29 06:46:30,444 - [IDLE] BNB | Px: 866.29 | M: 864.4 | B: 866.8 / S: 861.9 | delta: -0.7254(-0.0864) | Adj: +1.82%, Vol: 1.00, Thr: 0.1088 | PnL: 1.48 | TotPnL: 1.48
1766987229532, 2025-12-29 06:47:09,532 - [TRIG] Net BNB: SELL 0.1227 | Tgt: -0.7617 / Cur: -0.6390 | Thresh: 0.1143
1766987229533, 2025-12-29 06:47:09,533 - [ORDER] ALO BNB SELL 0.122 @ 865.56
1766987231641, 2025-12-29 06:47:11,641 - Sleeping 5s to allow position update...
1766987240303, 2025-12-29 06:47:20,303 - [WAIT] BNB Pending SELL Order 281227381064 @ 865.56 (Dist: 0.004%)
1766987250145, 2025-12-29 06:47:30,145 - [IDLE] ETH | Px: 3041.75 | M: 3042.9 | B: 3053.8 / S: 3032.1 | delta: -0.1627(+0.0027) | Adj: -3.70%, Vol: 1.22, Thr: 0.0244 | PnL: -10.33 | TotPnL: -10.33
1766987250147, 2025-12-29 06:47:30,147 - [WAIT] BNB Pending SELL Order 281227381064 @ 865.56 (Dist: 0.064%)
1766987270926, 2025-12-29 06:47:50,926 - [WAIT] BNB Pending SELL Order 281227381064 @ 865.56 (Dist: 0.064%)
1766987280432, 2025-12-29 06:48:00,432 - [IDLE] ETH | Px: 3040.45 | M: 3040.3 | B: 3051.4 / S: 3029.3 | delta: -0.1657(-0.0003) | Adj: -3.63%, Vol: 1.21, Thr: 0.0248 | PnL: -10.09 | TotPnL: -10.09
1766987280435, 2025-12-29 06:48:00,435 - [WAIT] BNB Pending SELL Order 281227381064 @ 865.56 (Dist: 0.137%)
1766987310562, 2025-12-29 06:48:30,562 - [IDLE] ETH | Px: 3039.95 | M: 3039.3 | B: 3050.4 / S: 3028.2 | delta: -0.1668(-0.0014) | Adj: -3.61%, Vol: 1.18, Thr: 0.0250 | PnL: -10.02 | TotPnL: -10.02
1766987310564, 2025-12-29 06:48:30,564 - [WAIT] BNB Pending SELL Order 281227381064 @ 865.56 (Dist: 0.128%)
1766987320120, 2025-12-29 06:48:40,120 - [WAIT] BNB Pending SELL Order 281227381064 @ 865.56 (Dist: 0.096%)
1766987327807, 2025-12-29 06:48:47,807 - Cancelling stale order 281227381064 (A @ 865.56)
1766987328681, 2025-12-29 06:48:48,681 - [TRIG] Net BNB: SELL 0.2005 | Tgt: -0.8395 / Cur: -0.6390 | Thresh: 0.1259
1766987328682, 2025-12-29 06:48:48,682 - [ORDER] ALO BNB SELL 0.2 @ 864.0
1766987329515, 2025-12-29 06:48:49,515 - Sleeping 5s to allow position update...
1766987340194, 2025-12-29 06:49:00,194 - [IDLE] ETH | Px: 3039.55 | M: 3038.5 | B: 3049.7 / S: 3027.4 | delta: -0.1677(-0.0023) | Adj: -3.58%, Vol: 1.15, Thr: 0.0252 | PnL: -10.00 | TotPnL: -10.00
1766987340196, 2025-12-29 06:49:00,196 - [WAIT] BNB Pending SELL Order 281228204718 @ 864.0 (Dist: 0.001%)
1766987370735, 2025-12-29 06:49:30,735 - [IDLE] ETH | Px: 3040.75 | M: 3040.9 | B: 3051.9 / S: 3030.0 | delta: -0.1650(+0.0004) | Adj: -3.65%, Vol: 1.12, Thr: 0.0247 | PnL: -10.09 | TotPnL: -10.09
1766987370737, 2025-12-29 06:49:30,737 - [WAIT] BNB Pending SELL Order 281228204718 @ 864.0 (Dist: 0.025%)
1766987380456, 2025-12-29 06:49:40,456 - [WAIT] BNB Pending SELL Order 281228204718 @ 864.0 (Dist: 0.018%)
1766987390360, 2025-12-29 06:49:50,360 - [WAIT] BNB Pending SELL Order 281228204718 @ 864.0 (Dist: 0.009%)
1766987400223, 2025-12-29 06:50:00,223 - [IDLE] ETH | Px: 3041.35 | M: 3042.1 | B: 3053.0 / S: 3031.2 | delta: -0.1636(+0.0018) | Adj: -3.68%, Vol: 1.05, Thr: 0.0245 | PnL: -10.27 | TotPnL: -10.27
1766987400225, 2025-12-29 06:50:00,225 - [WAIT] BNB Pending SELL Order 281228204718 @ 864.0 (Dist: 0.011%)
1766987415377, 2025-12-29 06:50:15,377 - Cancelling idle order 281228204718 (A @ 864.0)
1766987460331, 2025-12-29 06:51:00,331 - [IDLE] ETH | Px: 3039.85 | M: 3039.1 | B: 3050.2 / S: 3028.0 | delta: -0.1670(-0.0016) | Adj: -3.60%, Vol: 1.00, Thr: 0.0251 | PnL: -10.04 | TotPnL: -10.04
1766987460334, 2025-12-29 06:51:00,334 - [IDLE] BNB | Px: 863.92 | M: 862.8 | B: 865.6 / S: 860.0 | delta: -0.8448(-0.0518) | Adj: +3.20%, Vol: 2.62, Thr: 0.1267 | PnL: 3.21 | TotPnL: 3.21
1766987640865, 2025-12-29 06:54:00,865 - [IDLE] ETH | Px: 3036.65 | M: 3032.7 | B: 3044.3 / S: 3021.1 | delta: -0.1743(-0.0089) | Adj: -3.44%, Vol: 1.46, Thr: 0.0261 | PnL: -9.47 | TotPnL: -9.47
1766987640868, 2025-12-29 06:54:00,868 - [IDLE] BNB | Px: 864.01 | M: 863.0 | B: 865.8 / S: 860.2 | delta: -0.8405(-0.0475) | Adj: +3.15%, Vol: 2.85, Thr: 0.1261 | PnL: 3.25 | TotPnL: 3.25
1766987760209, 2025-12-29 06:56:00,209 - [IDLE] ETH | Px: 3038.05 | M: 3035.5 | B: 3046.9 / S: 3024.2 | delta: -0.1711(-0.0057) | Adj: -3.51%, Vol: 1.47, Thr: 0.0257 | PnL: -9.70 | TotPnL: -9.70
1766987760212, 2025-12-29 06:56:00,212 - [IDLE] BNB | Px: 864.32 | M: 863.6 | B: 866.4 / S: 860.9 | delta: -0.8249(-0.0319) | Adj: +2.97%, Vol: 1.83, Thr: 0.1237 | PnL: 2.99 | TotPnL: 2.99
1766987790271, 2025-12-29 06:56:30,271 - [IDLE] ETH | Px: 3038.05 | M: 3035.5 | B: 3046.9 / S: 3024.2 | delta: -0.1711(-0.0057) | Adj: -3.51%, Vol: 1.34, Thr: 0.0257 | PnL: -9.72 | TotPnL: -9.72
1766987790274, 2025-12-29 06:56:30,274 - [IDLE] BNB | Px: 864.35 | M: 863.7 | B: 866.4 / S: 860.9 | delta: -0.8231(-0.0301) | Adj: +2.95%, Vol: 1.34, Thr: 0.1235 | PnL: 2.96 | TotPnL: 2.96
1766987820384, 2025-12-29 06:57:00,384 - [IDLE] ETH | Px: 3037.55 | M: 3034.5 | B: 3046.0 / S: 3023.1 | delta: -0.1722(-0.0068) | Adj: -3.48%, Vol: 1.22, Thr: 0.0258 | PnL: -9.66 | TotPnL: -9.66
1766987820386, 2025-12-29 06:57:00,386 - [IDLE] BNB | Px: 864.30 | M: 863.6 | B: 866.3 / S: 860.8 | delta: -0.8257(-0.0327) | Adj: +2.98%, Vol: 1.00, Thr: 0.1239 | PnL: 2.96 | TotPnL: 2.96
1766987970057, 2025-12-29 06:59:30,057 - [IDLE] ETH | Px: 3036.95 | M: 3033.3 | B: 3044.9 / S: 3021.8 | delta: -0.1736(-0.0082) | Adj: -3.45%, Vol: 1.00, Thr: 0.0260 | PnL: -9.51 | TotPnL: -9.51
1766987970060, 2025-12-29 06:59:30,060 - [IDLE] BNB | Px: 864.11 | M: 863.2 | B: 866.0 / S: 860.4 | delta: -0.8354(-0.0424) | Adj: +3.09%, Vol: 1.00, Thr: 0.1253 | PnL: 3.13 | TotPnL: 3.13
1766988030397, 2025-12-29 07:00:30,397 - [IDLE] ETH | Px: 3036.35 | M: 3032.1 | B: 3043.7 / S: 3020.5 | delta: -0.1750(-0.0096) | Adj: -3.42%, Vol: 1.00, Thr: 0.0262 | PnL: -9.47 | TotPnL: -9.47
1766988030400, 2025-12-29 07:00:30,400 - [IDLE] BNB | Px: 864.56 | M: 864.1 | B: 866.8 / S: 861.4 | delta: -0.8122(-0.0192) | Adj: +2.83%, Vol: 1.00, Thr: 0.1218 | PnL: 2.80 | TotPnL: 2.80
1766988060802, 2025-12-29 07:01:00,802 - [IDLE] ETH | Px: 3036.25 | M: 3031.9 | B: 3043.5 / S: 3020.3 | delta: -0.1752(-0.0098) | Adj: -3.41%, Vol: 1.00, Thr: 0.0263 | PnL: -9.41 | TotPnL: -9.41
1766988060805, 2025-12-29 07:01:00,805 - [IDLE] BNB | Px: 864.54 | M: 864.1 | B: 866.8 / S: 861.4 | delta: -0.8137(-0.0207) | Adj: +2.85%, Vol: 1.00, Thr: 0.1221 | PnL: 2.81 | TotPnL: 2.81
1766988090913, 2025-12-29 07:01:30,913 - [IDLE] ETH | Px: 3032.75 | M: 3024.9 | B: 3037.0 / S: 3012.8 | delta: -0.1832(-0.0178) | Adj: -3.23%, Vol: 1.00, Thr: 0.0275 | PnL: -8.84 | TotPnL: -8.84
1766988090916, 2025-12-29 07:01:30,916 - [IDLE] BNB | Px: 864.08 | M: 863.1 | B: 865.9 / S: 860.3 | delta: -0.8369(-0.0439) | Adj: +3.11%, Vol: 1.00, Thr: 0.1255 | PnL: 3.17 | TotPnL: 3.17
1766988120633, 2025-12-29 07:02:00,633 - [IDLE] ETH | Px: 3033.65 | M: 3026.7 | B: 3038.7 / S: 3014.7 | delta: -0.1811(-0.0157) | Adj: -3.28%, Vol: 1.00, Thr: 0.0272 | PnL: -8.99 | TotPnL: -8.99
1766988120636, 2025-12-29 07:02:00,636 - [IDLE] BNB | Px: 864.07 | M: 863.1 | B: 865.9 / S: 860.3 | delta: -0.8374(-0.0444) | Adj: +3.12%, Vol: 1.00, Thr: 0.1256 | PnL: 3.19 | TotPnL: 3.19
1766988180920, 2025-12-29 07:03:00,920 - [IDLE] ETH | Px: 3033.05 | M: 3025.5 | B: 3037.6 / S: 3013.4 | delta: -0.1825(-0.0171) | Adj: -3.25%, Vol: 1.04, Thr: 0.0274 | PnL: -8.89 | TotPnL: -8.89
1766988180923, 2025-12-29 07:03:00,923 - [IDLE] BNB | Px: 864.32 | M: 863.6 | B: 866.4 / S: 860.9 | delta: -0.8249(-0.0319) | Adj: +2.97%, Vol: 1.00, Thr: 0.1237 | PnL: 2.98 | TotPnL: 2.98
1766988210031, 2025-12-29 07:03:30,031 - [IDLE] ETH | Px: 3033.35 | M: 3026.1 | B: 3038.2 / S: 3014.0 | delta: -0.1818(-0.0164) | Adj: -3.27%, Vol: 1.11, Thr: 0.0273 | PnL: -8.94 | TotPnL: -8.94
1766988210034, 2025-12-29 07:03:30,034 - [IDLE] BNB | Px: 864.46 | M: 863.9 | B: 866.7 / S: 861.2 | delta: -0.8173(-0.0243) | Adj: +2.89%, Vol: 1.00, Thr: 0.1226 | PnL: 2.88 | TotPnL: 2.88
1766988240616, 2025-12-29 07:04:00,616 - [IDLE] ETH | Px: 3033.75 | M: 3026.9 | B: 3038.9 / S: 3014.9 | delta: -0.1809(-0.0155) | Adj: -3.29%, Vol: 1.18, Thr: 0.0271 | PnL: -9.03 | TotPnL: -9.03
1766988240619, 2025-12-29 07:04:00,619 - [IDLE] BNB | Px: 864.66 | M: 864.4 | B: 867.0 / S: 861.7 | delta: -0.8071(-0.0141) | Adj: +2.77%, Vol: 1.00, Thr: 0.1211 | PnL: 2.73 | TotPnL: 2.73
1766988270677, 2025-12-29 07:04:30,677 - [IDLE] ETH | Px: 3032.55 | M: 3024.5 | B: 3036.7 / S: 3012.3 | delta: -0.1836(-0.0182) | Adj: -3.22%, Vol: 1.22, Thr: 0.0275 | PnL: -8.93 | TotPnL: -8.93
1766988270680, 2025-12-29 07:04:30,680 - [IDLE] BNB | Px: 864.66 | M: 864.3 | B: 867.0 / S: 861.6 | delta: -0.8076(-0.0146) | Adj: +2.78%, Vol: 1.00, Thr: 0.1211 | PnL: 2.65 | TotPnL: 2.65
1766988300436, 2025-12-29 07:05:00,436 - [IDLE] ETH | Px: 3032.05 | M: 3023.5 | B: 3035.7 / S: 3011.2 | delta: -0.1848(-0.0194) | Adj: -3.20%, Vol: 1.31, Thr: 0.0277 | PnL: -8.78 | TotPnL: -8.78
1766988300438, 2025-12-29 07:05:00,438 - [IDLE] BNB | Px: 864.50 | M: 864.0 | B: 866.7 / S: 861.3 | delta: -0.8153(-0.0223) | Adj: +2.86%, Vol: 1.00, Thr: 0.1223 | PnL: 2.82 | TotPnL: 2.82
1766988330030, 2025-12-29 07:05:30,030 - [IDLE] ETH | Px: 3033.95 | M: 3027.3 | B: 3039.3 / S: 3015.3 | delta: -0.1804(-0.0150) | Adj: -3.30%, Vol: 1.33, Thr: 0.0271 | PnL: -9.06 | TotPnL: -9.06
1766988330032, 2025-12-29 07:05:30,032 - [IDLE] BNB | Px: 864.92 | M: 864.9 | B: 867.6 / S: 862.3 | delta: -0.7939(-0.0009) | Adj: +2.62%, Vol: 1.00, Thr: 0.1191 | PnL: 2.56 | TotPnL: 2.56
1766988360157, 2025-12-29 07:06:00,157 - [IDLE] ETH | Px: 3033.75 | M: 3026.9 | B: 3038.9 / S: 3014.9 | delta: -0.1809(-0.0155) | Adj: -3.29%, Vol: 1.29, Thr: 0.0271 | PnL: -9.01 | TotPnL: -9.01
1766988360160, 2025-12-29 07:06:00,160 - [IDLE] BNB | Px: 864.64 | M: 864.3 | B: 867.0 / S: 861.6 | delta: -0.8081(-0.0151) | Adj: +2.78%, Vol: 1.00, Thr: 0.1212 | PnL: 2.66 | TotPnL: 2.66
1766988480694, 2025-12-29 07:08:00,694 - [IDLE] ETH | Px: 3037.35 | M: 3034.1 | B: 3045.6 / S: 3022.6 | delta: -0.1727(-0.0073) | Adj: -3.47%, Vol: 1.10, Thr: 0.0259 | PnL: -9.61 | TotPnL: -9.61
1766988480697, 2025-12-29 07:08:00,697 - [IDLE] BNB | Px: 864.88 | M: 864.8 | B: 867.5 / S: 862.1 | delta: -0.7962(-0.0032) | Adj: +2.64%, Vol: 1.00, Thr: 0.1194 | PnL: 2.58 | TotPnL: 2.58
1766988540794, 2025-12-29 07:09:00,794 - [IDLE] ETH | Px: 3036.35 | M: 3032.1 | B: 3043.7 / S: 3020.5 | delta: -0.1750(-0.0096) | Adj: -3.42%, Vol: 1.00, Thr: 0.0262 | PnL: -9.44 | TotPnL: -9.44
1766988540797, 2025-12-29 07:09:00,797 - [IDLE] BNB | Px: 864.58 | M: 864.2 | B: 866.9 / S: 861.4 | delta: -0.8117(-0.0187) | Adj: +2.82%, Vol: 1.00, Thr: 0.1218 | PnL: 2.79 | TotPnL: 2.79
1766988570132, 2025-12-29 07:09:30,132 - [IDLE] ETH | Px: 3036.35 | M: 3032.1 | B: 3043.7 / S: 3020.5 | delta: -0.1750(-0.0096) | Adj: -3.42%, Vol: 1.00, Thr: 0.0262 | PnL: -9.46 | TotPnL: -9.46
1766988570135, 2025-12-29 07:09:30,135 - [IDLE] BNB | Px: 864.52 | M: 864.0 | B: 866.8 / S: 861.3 | delta: -0.8145(-0.0215) | Adj: +2.85%, Vol: 1.00, Thr: 0.1222 | PnL: 2.82 | TotPnL: 2.82
1766988660076, 2025-12-29 07:11:00,076 - [IDLE] ETH | Px: 3039.35 | M: 3038.1 | B: 3049.3 / S: 3026.9 | delta: -0.1682(-0.0028) | Adj: -3.57%, Vol: 1.18, Thr: 0.0252 | PnL: -9.94 | TotPnL: -9.94
1766988660078, 2025-12-29 07:11:00,078 - [IDLE] BNB | Px: 864.88 | M: 864.8 | B: 867.5 / S: 862.1 | delta: -0.7965(-0.0035) | Adj: +2.65%, Vol: 1.00, Thr: 0.1195 | PnL: 2.59 | TotPnL: 2.59
1766988690660, 2025-12-29 07:11:30,660 - [IDLE] ETH | Px: 3039.35 | M: 3038.1 | B: 3049.3 / S: 3026.9 | delta: -0.1682(-0.0028) | Adj: -3.57%, Vol: 1.33, Thr: 0.0252 | PnL: -9.95 | TotPnL: -9.95
1766988690662, 2025-12-29 07:11:30,662 - [IDLE] BNB | Px: 865.02 | M: 865.1 | B: 867.7 / S: 862.5 | delta: -0.7894(+0.0036) | Adj: +2.57%, Vol: 1.00, Thr: 0.1184 | PnL: 2.48 | TotPnL: 2.48
1766988810922, 2025-12-29 07:13:30,922 - [IDLE] ETH | Px: 3039.95 | M: 3039.3 | B: 3050.4 / S: 3028.2 | delta: -0.1668(-0.0014) | Adj: -3.61%, Vol: 1.54, Thr: 0.0250 | PnL: -10.05 | TotPnL: -10.05
1766988810924, 2025-12-29 07:13:30,924 - [IDLE] BNB | Px: 864.98 | M: 865.0 | B: 867.7 / S: 862.4 | delta: -0.7912(+0.0018) | Adj: +2.59%, Vol: 1.00, Thr: 0.1187 | PnL: 2.49 | TotPnL: 2.49
1766988840774, 2025-12-29 07:14:00,774 - [IDLE] ETH | Px: 3038.85 | M: 3037.1 | B: 3048.4 / S: 3025.9 | delta: -0.1693(-0.0039) | Adj: -3.55%, Vol: 1.54, Thr: 0.0254 | PnL: -9.85 | TotPnL: -9.85
1766988840777, 2025-12-29 07:14:00,777 - [IDLE] BNB | Px: 864.96 | M: 865.0 | B: 867.6 / S: 862.3 | delta: -0.7924(+0.0006) | Adj: +2.60%, Vol: 1.00, Thr: 0.1189 | PnL: 2.51 | TotPnL: 2.51
1766988960307, 2025-12-29 07:16:00,307 - [IDLE] ETH | Px: 3039.95 | M: 3039.3 | B: 3050.4 / S: 3028.2 | delta: -0.1668(-0.0014) | Adj: -3.61%, Vol: 1.06, Thr: 0.0250 | PnL: -10.05 | TotPnL: -10.05
1766988960310, 2025-12-29 07:16:00,310 - [IDLE] BNB | Px: 864.76 | M: 864.5 | B: 867.2 / S: 861.9 | delta: -0.8026(-0.0096) | Adj: +2.72%, Vol: 1.00, Thr: 0.1204 | PnL: 2.66 | TotPnL: 2.66
1766988990637, 2025-12-29 07:16:30,637 - [IDLE] ETH | Px: 3041.85 | M: 3043.1 | B: 3054.0 / S: 3032.3 | delta: -0.1625(+0.0029) | Adj: -3.70%, Vol: 1.00, Thr: 0.0244 | PnL: -10.37 | TotPnL: -10.37
1766988990640, 2025-12-29 07:16:30,640 - [IDLE] BNB | Px: 865.10 | M: 865.3 | B: 867.9 / S: 862.7 | delta: -0.7849(+0.0081) | Adj: +2.51%, Vol: 1.00, Thr: 0.1177 | PnL: 2.37 | TotPnL: 2.37
1766989020851, 2025-12-29 07:17:00,851 - [IDLE] ETH | Px: 3041.25 | M: 3041.9 | B: 3052.8 / S: 3031.0 | delta: -0.1639(+0.0015) | Adj: -3.67%, Vol: 1.00, Thr: 0.0246 | PnL: -10.25 | TotPnL: -10.25
1766989020853, 2025-12-29 07:17:00,853 - [IDLE] BNB | Px: 865.10 | M: 865.3 | B: 867.9 / S: 862.6 | delta: -0.7854(+0.0076) | Adj: +2.52%, Vol: 1.00, Thr: 0.1178 | PnL: 2.35 | TotPnL: 2.35
1766989200023, 2025-12-29 07:20:00,023 - [IDLE] ETH | Px: 3042.85 | M: 3045.1 | B: 3055.8 / S: 3034.5 | delta: -0.1602(+0.0052) | Adj: -3.75%, Vol: 1.00, Thr: 0.0240 | PnL: -10.53 | TotPnL: -10.53
1766989200026, 2025-12-29 07:20:00,026 - [IDLE] BNB | Px: 865.15 | M: 865.4 | B: 868.0 / S: 862.8 | delta: -0.7826(+0.0104) | Adj: +2.49%, Vol: 1.00, Thr: 0.1174 | PnL: 2.33 | TotPnL: 2.33
1766989230644, 2025-12-29 07:20:30,644 - [IDLE] ETH | Px: 3042.85 | M: 3045.1 | B: 3055.8 / S: 3034.5 | delta: -0.1602(+0.0052) | Adj: -3.75%, Vol: 1.00, Thr: 0.0240 | PnL: -10.52 | TotPnL: -10.52
1766989230647, 2025-12-29 07:20:30,647 - [IDLE] BNB | Px: 865.26 | M: 865.6 | B: 868.2 / S: 863.0 | delta: -0.7768(+0.0162) | Adj: +2.42%, Vol: 1.00, Thr: 0.1165 | PnL: 2.28 | TotPnL: 2.28
1766989320150, 2025-12-29 07:22:00,150 - [IDLE] ETH | Px: 3042.35 | M: 3044.1 | B: 3054.9 / S: 3033.4 | delta: -0.1614(+0.0040) | Adj: -3.73%, Vol: 1.00, Thr: 0.0242 | PnL: -10.45 | TotPnL: -10.45
1766989320152, 2025-12-29 07:22:00,152 - [IDLE] BNB | Px: 865.28 | M: 865.7 | B: 868.3 / S: 863.1 | delta: -0.7758(+0.0172) | Adj: +2.41%, Vol: 1.00, Thr: 0.1164 | PnL: 2.23 | TotPnL: 2.23
1766989350916, 2025-12-29 07:22:30,916 - [IDLE] ETH | Px: 3042.95 | M: 3045.3 | B: 3056.0 / S: 3034.7 | delta: -0.1600(+0.0054) | Adj: -3.76%, Vol: 1.00, Thr: 0.0240 | PnL: -10.55 | TotPnL: -10.55
1766989350918, 2025-12-29 07:22:30,918 - [IDLE] BNB | Px: 865.30 | M: 865.7 | B: 868.3 / S: 863.1 | delta: -0.7753(+0.0177) | Adj: +2.40%, Vol: 1.00, Thr: 0.1163 | PnL: 2.21 | TotPnL: 2.21
1766989410383, 2025-12-29 07:23:30,383 - [IDLE] ETH | Px: 3042.55 | M: 3044.5 | B: 3055.3 / S: 3033.8 | delta: -0.1609(+0.0045) | Adj: -3.74%, Vol: 1.00, Thr: 0.0241 | PnL: -10.48 | TotPnL: -10.48
1766989410385, 2025-12-29 07:23:30,385 - [IDLE] BNB | Px: 864.89 | M: 864.8 | B: 867.5 / S: 862.2 | delta: -0.7957(-0.0027) | Adj: +2.64%, Vol: 1.00, Thr: 0.1194 | PnL: 2.46 | TotPnL: 2.46
1766989500382, 2025-12-29 07:25:00,382 - [IDLE] ETH | Px: 3040.55 | M: 3040.5 | B: 3051.5 / S: 3029.5 | delta: -0.1654(-0.0000) | Adj: -3.64%, Vol: 1.00, Thr: 0.0248 | PnL: -10.12 | TotPnL: -10.12
1766989500384, 2025-12-29 07:25:00,384 - [IDLE] BNB | Px: 864.82 | M: 864.7 | B: 867.3 / S: 862.0 | delta: -0.7993(-0.0063) | Adj: +2.68%, Vol: 1.00, Thr: 0.1199 | PnL: 2.60 | TotPnL: 2.60
1766989530657, 2025-12-29 07:25:30,657 - [IDLE] ETH | Px: 3040.55 | M: 3040.5 | B: 3051.5 / S: 3029.5 | delta: -0.1654(-0.0000) | Adj: -3.64%, Vol: 1.00, Thr: 0.0248 | PnL: -10.13 | TotPnL: -10.13
1766989530660, 2025-12-29 07:25:30,660 - [IDLE] BNB | Px: 864.78 | M: 864.6 | B: 867.3 / S: 861.9 | delta: -0.8010(-0.0080) | Adj: +2.70%, Vol: 1.00, Thr: 0.1202 | PnL: 2.62 | TotPnL: 2.62
1766989650215, 2025-12-29 07:27:30,215 - [IDLE] ETH | Px: 3037.05 | M: 3033.5 | B: 3045.0 / S: 3022.0 | delta: -0.1734(-0.0080) | Adj: -3.46%, Vol: 1.00, Thr: 0.0260 | PnL: -9.51 | TotPnL: -9.51
1766989650217, 2025-12-29 07:27:30,217 - [IDLE] BNB | Px: 864.08 | M: 863.1 | B: 865.9 / S: 860.3 | delta: -0.8369(-0.0439) | Adj: +3.11%, Vol: 1.00, Thr: 0.1255 | PnL: 3.12 | TotPnL: 3.12
1766989680284, 2025-12-29 07:28:00,284 - [IDLE] ETH | Px: 3036.75 | M: 3032.9 | B: 3044.5 / S: 3021.4 | delta: -0.1741(-0.0087) | Adj: -3.44%, Vol: 1.18, Thr: 0.0261 | PnL: -9.52 | TotPnL: -9.52
1766989680286, 2025-12-29 07:28:00,286 - [IDLE] BNB | Px: 864.08 | M: 863.1 | B: 865.9 / S: 860.3 | delta: -0.8369(-0.0439) | Adj: +3.11%, Vol: 1.00, Thr: 0.1255 | PnL: 3.16 | TotPnL: 3.16
1766989710548, 2025-12-29 07:28:30,548 - [IDLE] ETH | Px: 3036.55 | M: 3032.5 | B: 3044.1 / S: 3020.9 | delta: -0.1745(-0.0091) | Adj: -3.43%, Vol: 1.34, Thr: 0.0262 | PnL: -9.44 | TotPnL: -9.44
1766989710551, 2025-12-29 07:28:30,551 - [IDLE] BNB | Px: 864.17 | M: 863.3 | B: 866.1 / S: 860.5 | delta: -0.8323(-0.0393) | Adj: +3.06%, Vol: 1.00, Thr: 0.1248 | PnL: 3.12 | TotPnL: 3.12
1766989740968, 2025-12-29 07:29:00,968 - [IDLE] ETH | Px: 3036.45 | M: 3032.3 | B: 3043.9 / S: 3020.7 | delta: -0.1747(-0.0093) | Adj: -3.43%, Vol: 1.49, Thr: 0.0262 | PnL: -9.46 | TotPnL: -9.46
1766989740971, 2025-12-29 07:29:00,971 - [IDLE] BNB | Px: 864.28 | M: 863.5 | B: 866.3 / S: 860.8 | delta: -0.8270(-0.0340) | Adj: +3.00%, Vol: 1.00, Thr: 0.1240 | PnL: 2.98 | TotPnL: 2.98
1766989770670, 2025-12-29 07:29:30,670 - [IDLE] ETH | Px: 3036.15 | M: 3031.7 | B: 3043.4 / S: 3020.1 | delta: -0.1754(-0.0100) | Adj: -3.41%, Vol: 1.58, Thr: 0.0263 | PnL: -9.42 | TotPnL: -9.42
1766989770673, 2025-12-29 07:29:30,673 - [IDLE] BNB | Px: 864.18 | M: 863.3 | B: 866.1 / S: 860.5 | delta: -0.8321(-0.0391) | Adj: +3.06%, Vol: 1.00, Thr: 0.1248 | PnL: 3.00 | TotPnL: 3.00
1766989800981, 2025-12-29 07:30:00,981 - [IDLE] ETH | Px: 3036.35 | M: 3032.1 | B: 3043.7 / S: 3020.5 | delta: -0.1750(-0.0096) | Adj: -3.42%, Vol: 1.63, Thr: 0.0262 | PnL: -9.44 | TotPnL: -9.44
1766989800984, 2025-12-29 07:30:00,984 - [IDLE] BNB | Px: 864.24 | M: 863.5 | B: 866.2 / S: 860.7 | delta: -0.8285(-0.0355) | Adj: +3.02%, Vol: 1.00, Thr: 0.1243 | PnL: 3.01 | TotPnL: 3.01
1766989830860, 2025-12-29 07:30:30,860 - [IDLE] ETH | Px: 3036.35 | M: 3032.1 | B: 3043.7 / S: 3020.5 | delta: -0.1750(-0.0096) | Adj: -3.42%, Vol: 1.64, Thr: 0.0262 | PnL: -9.44 | TotPnL: -9.44
1766989830863, 2025-12-29 07:30:30,863 - [IDLE] BNB | Px: 864.22 | M: 863.4 | B: 866.2 / S: 860.6 | delta: -0.8300(-0.0370) | Adj: +3.03%, Vol: 1.00, Thr: 0.1245 | PnL: 3.05 | TotPnL: 3.05
1766989890645, 2025-12-29 07:31:30,645 - [IDLE] ETH | Px: 3036.05 | M: 3031.5 | B: 3043.2 / S: 3019.9 | delta: -0.1756(-0.0102) | Adj: -3.40%, Vol: 1.63, Thr: 0.0263 | PnL: -9.41 | TotPnL: -9.41
1766989890648, 2025-12-29 07:31:30,648 - [IDLE] BNB | Px: 864.30 | M: 863.6 | B: 866.3 / S: 860.8 | delta: -0.8257(-0.0327) | Adj: +2.98%, Vol: 1.00, Thr: 0.1239 | PnL: 3.02 | TotPnL: 3.02
1766989920692, 2025-12-29 07:32:00,692 - [IDLE] ETH | Px: 3036.45 | M: 3032.3 | B: 3043.9 / S: 3020.7 | delta: -0.1747(-0.0093) | Adj: -3.43%, Vol: 1.58, Thr: 0.0262 | PnL: -9.46 | TotPnL: -9.46
1766989920694, 2025-12-29 07:32:00,694 - [IDLE] BNB | Px: 864.28 | M: 863.5 | B: 866.3 / S: 860.8 | delta: -0.8267(-0.0337) | Adj: +2.99%, Vol: 1.00, Thr: 0.1240 | PnL: 3.02 | TotPnL: 3.02
1766989950036, 2025-12-29 07:32:30,036 - [IDLE] ETH | Px: 3037.35 | M: 3034.1 | B: 3045.6 / S: 3022.6 | delta: -0.1727(-0.0073) | Adj: -3.47%, Vol: 1.45, Thr: 0.0259 | PnL: -9.61 | TotPnL: -9.61
1766989950038, 2025-12-29 07:32:30,038 - [IDLE] BNB | Px: 864.30 | M: 863.6 | B: 866.3 / S: 860.8 | delta: -0.8259(-0.0329) | Adj: +2.99%, Vol: 1.00, Thr: 0.1239 | PnL: 3.04 | TotPnL: 3.04
1766989980867, 2025-12-29 07:33:00,867 - [IDLE] ETH | Px: 3038.15 | M: 3035.7 | B: 3047.1 / S: 3024.4 | delta: -0.1709(-0.0055) | Adj: -3.51%, Vol: 1.30, Thr: 0.0256 | PnL: -9.70 | TotPnL: -9.70
1766989980870, 2025-12-29 07:33:00,870 - [IDLE] BNB | Px: 864.54 | M: 864.1 | B: 866.8 / S: 861.4 | delta: -0.8137(-0.0207) | Adj: +2.85%, Vol: 1.00, Thr: 0.1221 | PnL: 2.88 | TotPnL: 2.88
1766990010938, 2025-12-29 07:33:30,938 - [IDLE] ETH | Px: 3035.85 | M: 3031.1 | B: 3042.8 / S: 3019.4 | delta: -0.1761(-0.0107) | Adj: -3.39%, Vol: 1.19, Thr: 0.0264 | PnL: -9.37 | TotPnL: -9.37
1766990010940, 2025-12-29 07:33:30,940 - [IDLE] BNB | Px: 864.24 | M: 863.4 | B: 866.2 / S: 860.7 | delta: -0.8290(-0.0360) | Adj: +3.02%, Vol: 1.00, Thr: 0.1244 | PnL: 3.03 | TotPnL: 3.03
1766990070594, 2025-12-29 07:34:30,594 - [IDLE] ETH | Px: 3033.95 | M: 3027.3 | B: 3039.3 / S: 3015.3 | delta: -0.1804(-0.0150) | Adj: -3.30%, Vol: 1.17, Thr: 0.0271 | PnL: -8.98 | TotPnL: -8.98
1766990070597, 2025-12-29 07:34:30,597 - [IDLE] BNB | Px: 864.24 | M: 863.4 | B: 866.2 / S: 860.7 | delta: -0.8290(-0.0360) | Adj: +3.02%, Vol: 1.00, Thr: 0.1244 | PnL: 3.12 | TotPnL: 3.12
1766990130034, 2025-12-29 07:35:30,034 - [IDLE] ETH | Px: 3034.65 | M: 3028.7 | B: 3040.6 / S: 3016.8 | delta: -0.1788(-0.0134) | Adj: -3.33%, Vol: 1.02, Thr: 0.0268 | PnL: -9.18 | TotPnL: -9.18
1766990130037, 2025-12-29 07:35:30,037 - [IDLE] BNB | Px: 864.20 | M: 863.4 | B: 866.1 / S: 860.6 | delta: -0.8305(-0.0375) | Adj: +3.04%, Vol: 1.00, Thr: 0.1246 | PnL: 3.05 | TotPnL: 3.05
1766990160669, 2025-12-29 07:36:00,669 - [IDLE] ETH | Px: 3037.75 | M: 3034.9 | B: 3046.3 / S: 3023.5 | delta: -0.1718(-0.0064) | Adj: -3.49%, Vol: 1.00, Thr: 0.0258 | PnL: -9.66 | TotPnL: -9.66
1766990160672, 2025-12-29 07:36:00,672 - [IDLE] BNB | Px: 864.56 | M: 864.1 | B: 866.8 / S: 861.4 | delta: -0.8122(-0.0192) | Adj: +2.83%, Vol: 1.00, Thr: 0.1218 | PnL: 2.78 | TotPnL: 2.78
1766990190407, 2025-12-29 07:36:30,407 - [IDLE] ETH | Px: 3038.25 | M: 3035.9 | B: 3047.3 / S: 3024.6 | delta: -0.1706(-0.0052) | Adj: -3.52%, Vol: 1.00, Thr: 0.0256 | PnL: -9.74 | TotPnL: -9.74
1766990190409, 2025-12-29 07:36:30,409 - [IDLE] BNB | Px: 864.68 | M: 864.4 | B: 867.1 / S: 861.7 | delta: -0.8061(-0.0131) | Adj: +2.76%, Vol: 1.00, Thr: 0.1209 | PnL: 2.69 | TotPnL: 2.69
1766990220571, 2025-12-29 07:37:00,571 - [IDLE] ETH | Px: 3037.25 | M: 3033.9 | B: 3045.4 / S: 3022.4 | delta: -0.1729(-0.0075) | Adj: -3.47%, Vol: 1.00, Thr: 0.0259 | PnL: -9.59 | TotPnL: -9.59
1766990220574, 2025-12-29 07:37:00,574 - [IDLE] BNB | Px: 864.52 | M: 864.1 | B: 866.8 / S: 861.3 | delta: -0.8142(-0.0212) | Adj: +2.85%, Vol: 1.00, Thr: 0.1221 | PnL: 2.79 | TotPnL: 2.79
1766990310206, 2025-12-29 07:38:30,206 - [IDLE] ETH | Px: 3036.05 | M: 3031.5 | B: 3043.2 / S: 3019.9 | delta: -0.1756(-0.0102) | Adj: -3.40%, Vol: 1.00, Thr: 0.0263 | PnL: -9.41 | TotPnL: -9.41
1766990310209, 2025-12-29 07:38:30,209 - [IDLE] BNB | Px: 864.28 | M: 863.5 | B: 866.3 / S: 860.8 | delta: -0.8267(-0.0337) | Adj: +2.99%, Vol: 1.00, Thr: 0.1240 | PnL: 3.04 | TotPnL: 3.04
1766990340505, 2025-12-29 07:39:00,505 - [IDLE] ETH | Px: 3035.05 | M: 3029.5 | B: 3041.3 / S: 3017.7 | delta: -0.1779(-0.0125) | Adj: -3.35%, Vol: 1.00, Thr: 0.0267 | PnL: -9.19 | TotPnL: -9.19
1766990340508, 2025-12-29 07:39:00,508 - [IDLE] BNB | Px: 864.27 | M: 863.5 | B: 866.3 / S: 860.7 | delta: -0.8272(-0.0342) | Adj: +3.00%, Vol: 1.00, Thr: 0.1241 | PnL: 3.04 | TotPnL: 3.04
1766990370368, 2025-12-29 07:39:30,368 - [IDLE] ETH | Px: 3034.45 | M: 3028.3 | B: 3040.2 / S: 3016.4 | delta: -0.1793(-0.0139) | Adj: -3.32%, Vol: 1.00, Thr: 0.0269 | PnL: -9.14 | TotPnL: -9.14
1766990370371, 2025-12-29 07:39:30,371 - [IDLE] BNB | Px: 864.14 | M: 863.2 | B: 866.0 / S: 860.4 | delta: -0.8341(-0.0411) | Adj: +3.08%, Vol: 1.00, Thr: 0.1251 | PnL: 3.12 | TotPnL: 3.12
1766990400908, 2025-12-29 07:40:00,908 - [IDLE] ETH | Px: 3034.85 | M: 3029.1 | B: 3040.9 / S: 3017.3 | delta: -0.1784(-0.0130) | Adj: -3.34%, Vol: 1.00, Thr: 0.0268 | PnL: -9.23 | TotPnL: -9.23
1766990400911, 2025-12-29 07:40:00,911 - [IDLE] BNB | Px: 864.16 | M: 863.3 | B: 866.1 / S: 860.5 | delta: -0.8326(-0.0396) | Adj: +3.06%, Vol: 1.00, Thr: 0.1249 | PnL: 3.10 | TotPnL: 3.10
1766990460319, 2025-12-29 07:41:00,319 - [IDLE] ETH | Px: 3035.15 | M: 3029.7 | B: 3041.5 / S: 3017.9 | delta: -0.1777(-0.0123) | Adj: -3.36%, Vol: 1.00, Thr: 0.0267 | PnL: -9.26 | TotPnL: -9.26
1766990460321, 2025-12-29 07:41:00,321 - [IDLE] BNB | Px: 864.45 | M: 863.9 | B: 866.6 / S: 861.2 | delta: -0.8181(-0.0251) | Adj: +2.90%, Vol: 1.00, Thr: 0.1227 | PnL: 2.87 | TotPnL: 2.87
1766990520542, 2025-12-29 07:42:00,542 - [IDLE] ETH | Px: 3035.95 | M: 3031.3 | B: 3043.0 / S: 3019.6 | delta: -0.1759(-0.0105) | Adj: -3.40%, Vol: 1.00, Thr: 0.0264 | PnL: -9.36 | TotPnL: -9.36
1766990520544, 2025-12-29 07:42:00,544 - [IDLE] BNB | Px: 864.49 | M: 864.0 | B: 866.7 / S: 861.3 | delta: -0.8160(-0.0230) | Adj: +2.87%, Vol: 1.00, Thr: 0.1224 | PnL: 2.80 | TotPnL: 2.80
1766990550983, 2025-12-29 07:42:30,983 - [IDLE] ETH | Px: 3035.75 | M: 3030.9 | B: 3042.6 / S: 3019.2 | delta: -0.1763(-0.0109) | Adj: -3.39%, Vol: 1.00, Thr: 0.0264 | PnL: -9.36 | TotPnL: -9.36
1766990550986, 2025-12-29 07:42:30,986 - [IDLE] BNB | Px: 864.52 | M: 864.0 | B: 866.8 / S: 861.3 | delta: -0.8145(-0.0215) | Adj: +2.85%, Vol: 1.00, Thr: 0.1222 | PnL: 2.80 | TotPnL: 2.80
1766990610378, 2025-12-29 07:43:30,378 - [IDLE] ETH | Px: 3036.15 | M: 3031.7 | B: 3043.4 / S: 3020.1 | delta: -0.1754(-0.0100) | Adj: -3.41%, Vol: 1.00, Thr: 0.0263 | PnL: -9.42 | TotPnL: -9.42
1766990610381, 2025-12-29 07:43:30,381 - [IDLE] BNB | Px: 864.56 | M: 864.1 | B: 866.8 / S: 861.4 | delta: -0.8125(-0.0195) | Adj: +2.83%, Vol: 1.00, Thr: 0.1219 | PnL: 2.80 | TotPnL: 2.80
1766990670318, 2025-12-29 07:44:30,318 - [IDLE] ETH | Px: 3035.85 | M: 3031.1 | B: 3042.8 / S: 3019.4 | delta: -0.1761(-0.0107) | Adj: -3.39%, Vol: 1.00, Thr: 0.0264 | PnL: -9.36 | TotPnL: -9.36
1766990670320, 2025-12-29 07:44:30,320 - [IDLE] BNB | Px: 864.48 | M: 864.0 | B: 866.7 / S: 861.2 | delta: -0.8165(-0.0235) | Adj: +2.88%, Vol: 1.00, Thr: 0.1225 | PnL: 2.83 | TotPnL: 2.83
1766990700519, 2025-12-29 07:45:00,519 - [IDLE] ETH | Px: 3035.60 | M: 3030.6 | B: 3042.3 / S: 3018.9 | delta: -0.1767(-0.0113) | Adj: -3.38%, Vol: 1.00, Thr: 0.0265 | PnL: -9.32 | TotPnL: -9.32
1766990700522, 2025-12-29 07:45:00,522 - [IDLE] BNB | Px: 864.36 | M: 863.7 | B: 866.4 / S: 861.0 | delta: -0.8226(-0.0296) | Adj: +2.95%, Vol: 1.00, Thr: 0.1234 | PnL: 2.84 | TotPnL: 2.84
1766990790862, 2025-12-29 07:46:30,862 - [IDLE] ETH | Px: 3034.85 | M: 3029.1 | B: 3040.9 / S: 3017.3 | delta: -0.1784(-0.0130) | Adj: -3.34%, Vol: 1.00, Thr: 0.0268 | PnL: -9.18 | TotPnL: -9.18
1766990790865, 2025-12-29 07:46:30,865 - [IDLE] BNB | Px: 864.22 | M: 863.4 | B: 866.2 / S: 860.6 | delta: -0.8295(-0.0365) | Adj: +3.03%, Vol: 1.00, Thr: 0.1244 | PnL: 2.98 | TotPnL: 2.98
1766990850321, 2025-12-29 07:47:30,321 - [IDLE] ETH | Px: 3034.75 | M: 3028.9 | B: 3040.8 / S: 3017.1 | delta: -0.1786(-0.0132) | Adj: -3.34%, Vol: 1.00, Thr: 0.0268 | PnL: -9.08 | TotPnL: -9.08
1766990850324, 2025-12-29 07:47:30,324 - [IDLE] BNB | Px: 863.96 | M: 862.9 | B: 865.7 / S: 860.0 | delta: -0.8428(-0.0498) | Adj: +3.18%, Vol: 1.00, Thr: 0.1264 | PnL: 3.24 | TotPnL: 3.24
1766990910821, 2025-12-29 07:48:30,821 - [IDLE] ETH | Px: 3032.65 | M: 3024.7 | B: 3036.9 / S: 3012.5 | delta: -0.1834(-0.0180) | Adj: -3.23%, Vol: 1.00, Thr: 0.0275 | PnL: -8.84 | TotPnL: -8.84
1766990910823, 2025-12-29 07:48:30,823 - [IDLE] BNB | Px: 863.66 | M: 862.2 | B: 865.1 / S: 859.4 | delta: -0.8582(-0.0652) | Adj: +3.35%, Vol: 1.00, Thr: 0.1287 | PnL: 3.59 | TotPnL: 3.59
1766990940824, 2025-12-29 07:49:00,824 - [IDLE] ETH | Px: 3033.85 | M: 3027.1 | B: 3039.1 / S: 3015.1 | delta: -0.1807(-0.0153) | Adj: -3.29%, Vol: 1.00, Thr: 0.0271 | PnL: -9.04 | TotPnL: -9.04
1766990940827, 2025-12-29 07:49:00,827 - [IDLE] BNB | Px: 864.00 | M: 862.9 | B: 865.7 / S: 860.1 | delta: -0.8408(-0.0478) | Adj: +3.15%, Vol: 1.00, Thr: 0.1261 | PnL: 3.28 | TotPnL: 3.28
1766991030032, 2025-12-29 07:50:30,032 - [IDLE] ETH | Px: 3034.45 | M: 3028.3 | B: 3040.2 / S: 3016.4 | delta: -0.1793(-0.0139) | Adj: -3.32%, Vol: 1.00, Thr: 0.0269 | PnL: -9.14 | TotPnL: -9.14
1766991030035, 2025-12-29 07:50:30,035 - [IDLE] BNB | Px: 864.04 | M: 863.0 | B: 865.8 / S: 860.2 | delta: -0.8392(-0.0462) | Adj: +3.14%, Vol: 1.00, Thr: 0.1259 | PnL: 3.19 | TotPnL: 3.19
1766991060640, 2025-12-29 07:51:00,640 - [IDLE] ETH | Px: 3033.15 | M: 3025.7 | B: 3037.8 / S: 3013.6 | delta: -0.1823(-0.0169) | Adj: -3.26%, Vol: 1.00, Thr: 0.0273 | PnL: -9.08 | TotPnL: -9.08
1766991060643, 2025-12-29 07:51:00,643 - [IDLE] BNB | Px: 863.66 | M: 862.2 | B: 865.1 / S: 859.4 | delta: -0.8582(-0.0652) | Adj: +3.35%, Vol: 1.00, Thr: 0.1287 | PnL: 3.36 | TotPnL: 3.36
1766991150586, 2025-12-29 07:52:30,586 - [IDLE] ETH | Px: 3032.55 | M: 3024.5 | B: 3036.7 / S: 3012.3 | delta: -0.1836(-0.0182) | Adj: -3.22%, Vol: 1.00, Thr: 0.0275 | PnL: -8.91 | TotPnL: -8.91
1766991150589, 2025-12-29 07:52:30,589 - [IDLE] BNB | Px: 863.23 | M: 861.3 | B: 864.2 / S: 858.4 | delta: -0.8806(-0.0876) | Adj: +3.61%, Vol: 1.00, Thr: 0.1321 | PnL: 3.72 | TotPnL: 3.72
1766991210673, 2025-12-29 07:53:30,673 - [IDLE] ETH | Px: 3032.95 | M: 3025.3 | B: 3037.4 / S: 3013.2 | delta: -0.1827(-0.0173) | Adj: -3.24%, Vol: 1.00, Thr: 0.0274 | PnL: -8.89 | TotPnL: -8.89
1766991210675, 2025-12-29 07:53:30,675 - [IDLE] BNB | Px: 863.41 | M: 861.7 | B: 864.6 / S: 858.8 | delta: -0.8713(-0.0783) | Adj: +3.50%, Vol: 1.00, Thr: 0.1307 | PnL: 3.67 | TotPnL: 3.67
1766991330629, 2025-12-29 07:55:30,629 - [IDLE] ETH | Px: 3032.25 | M: 3023.9 | B: 3036.1 / S: 3011.7 | delta: -0.1843(-0.0189) | Adj: -3.21%, Vol: 1.00, Thr: 0.0276 | PnL: -8.76 | TotPnL: -8.76
1766991330631, 2025-12-29 07:55:30,631 - [IDLE] BNB | Px: 863.11 | M: 861.0 | B: 864.0 / S: 858.1 | delta: -0.8868(-0.0938) | Adj: +3.68%, Vol: 1.00, Thr: 0.1330 | PnL: 3.91 | TotPnL: 3.91
1766991360786, 2025-12-29 07:56:00,786 - [IDLE] ETH | Px: 3031.15 | M: 3021.7 | B: 3034.1 / S: 3009.3 | delta: -0.1868(-0.0214) | Adj: -3.15%, Vol: 1.00, Thr: 0.0280 | PnL: -8.60 | TotPnL: -8.60
1766991360789, 2025-12-29 07:56:00,789 - [IDLE] BNB | Px: 863.12 | M: 861.0 | B: 864.0 / S: 858.1 | delta: -0.8863(-0.0933) | Adj: +3.67%, Vol: 1.00, Thr: 0.1329 | PnL: 3.93 | TotPnL: 3.93
1766991420935, 2025-12-29 07:57:00,935 - [IDLE] ETH | Px: 3032.45 | M: 3024.3 | B: 3036.5 / S: 3012.1 | delta: -0.1839(-0.0185) | Adj: -3.22%, Vol: 1.00, Thr: 0.0276 | PnL: -8.81 | TotPnL: -8.81
1766991420938, 2025-12-29 07:57:00,938 - [IDLE] BNB | Px: 863.32 | M: 861.5 | B: 864.4 / S: 858.5 | delta: -0.8762(-0.0832) | Adj: +3.56%, Vol: 1.00, Thr: 0.1314 | PnL: 3.71 | TotPnL: 3.71
1766991510065, 2025-12-29 07:58:30,065 - [IDLE] ETH | Px: 3033.15 | M: 3025.7 | B: 3037.8 / S: 3013.6 | delta: -0.1823(-0.0169) | Adj: -3.26%, Vol: 1.00, Thr: 0.0273 | PnL: -8.93 | TotPnL: -8.93
1766991510068, 2025-12-29 07:58:30,068 - [IDLE] BNB | Px: 863.28 | M: 861.4 | B: 864.3 / S: 858.5 | delta: -0.8783(-0.0853) | Adj: +3.58%, Vol: 1.00, Thr: 0.1317 | PnL: 3.81 | TotPnL: 3.81
1766991540505, 2025-12-29 07:59:00,505 - [IDLE] ETH | Px: 3033.95 | M: 3027.3 | B: 3039.3 / S: 3015.3 | delta: -0.1804(-0.0150) | Adj: -3.30%, Vol: 1.00, Thr: 0.0271 | PnL: -9.06 | TotPnL: -9.06
1766991540508, 2025-12-29 07:59:00,508 - [IDLE] BNB | Px: 863.26 | M: 861.4 | B: 864.3 / S: 858.4 | delta: -0.8788(-0.0858) | Adj: +3.59%, Vol: 1.00, Thr: 0.1318 | PnL: 3.81 | TotPnL: 3.81
1766991570905, 2025-12-29 07:59:30,905 - [IDLE] ETH | Px: 3034.15 | M: 3027.7 | B: 3039.6 / S: 3015.8 | delta: -0.1800(-0.0146) | Adj: -3.31%, Vol: 1.00, Thr: 0.0270 | PnL: -9.09 | TotPnL: -9.09
1766991570908, 2025-12-29 07:59:30,908 - [IDLE] BNB | Px: 863.31 | M: 861.5 | B: 864.4 / S: 858.5 | delta: -0.8764(-0.0834) | Adj: +3.56%, Vol: 1.00, Thr: 0.1315 | PnL: 3.76 | TotPnL: 3.76
1766991630147, 2025-12-29 08:00:30,147 - [IDLE] ETH | Px: 3033.35 | M: 3026.1 | B: 3038.2 / S: 3014.0 | delta: -0.1818(-0.0164) | Adj: -3.27%, Vol: 1.00, Thr: 0.0273 | PnL: -8.96 | TotPnL: -8.96
1766991630149, 2025-12-29 08:00:30,149 - [IDLE] BNB | Px: 863.22 | M: 861.3 | B: 864.2 / S: 858.3 | delta: -0.8811(-0.0881) | Adj: +3.61%, Vol: 1.00, Thr: 0.1322 | PnL: 3.81 | TotPnL: 3.81
1766991690565, 2025-12-29 08:01:30,565 - [IDLE] ETH | Px: 3036.75 | M: 3032.9 | B: 3044.5 / S: 3021.4 | delta: -0.1741(-0.0087) | Adj: -3.44%, Vol: 1.00, Thr: 0.0261 | PnL: -9.51 | TotPnL: -9.51
1766991690568, 2025-12-29 08:01:30,568 - [IDLE] BNB | Px: 863.54 | M: 861.9 | B: 864.8 / S: 859.1 | delta: -0.8649(-0.0719) | Adj: +3.43%, Vol: 1.00, Thr: 0.1297 | PnL: 3.60 | TotPnL: 3.60
1766991720737, 2025-12-29 08:02:00,737 - [IDLE] ETH | Px: 3034.95 | M: 3029.3 | B: 3041.1 / S: 3017.5 | delta: -0.1782(-0.0128) | Adj: -3.35%, Vol: 1.00, Thr: 0.0267 | PnL: -9.21 | TotPnL: -9.21
1766991720739, 2025-12-29 08:02:00,739 - [IDLE] BNB | Px: 863.14 | M: 861.1 | B: 864.0 / S: 858.1 | delta: -0.8855(-0.0925) | Adj: +3.66%, Vol: 1.00, Thr: 0.1328 | PnL: 3.86 | TotPnL: 3.86
1766991750160, 2025-12-29 08:02:30,160 - [IDLE] ETH | Px: 3035.45 | M: 3030.3 | B: 3042.1 / S: 3018.6 | delta: -0.1770(-0.0116) | Adj: -3.37%, Vol: 1.00, Thr: 0.0266 | PnL: -9.29 | TotPnL: -9.29
1766991750163, 2025-12-29 08:02:30,163 - [IDLE] BNB | Px: 863.18 | M: 861.2 | B: 864.1 / S: 858.2 | delta: -0.8834(-0.0904) | Adj: +3.64%, Vol: 1.00, Thr: 0.1325 | PnL: 3.90 | TotPnL: 3.90
1766991780704, 2025-12-29 08:03:00,704 - [IDLE] ETH | Px: 3036.95 | M: 3033.3 | B: 3044.9 / S: 3021.8 | delta: -0.1736(-0.0082) | Adj: -3.45%, Vol: 1.08, Thr: 0.0260 | PnL: -9.56 | TotPnL: -9.56
1766991780707, 2025-12-29 08:03:00,707 - [IDLE] BNB | Px: 863.20 | M: 861.2 | B: 864.2 / S: 858.3 | delta: -0.8819(-0.0889) | Adj: +3.62%, Vol: 1.00, Thr: 0.1323 | PnL: 3.84 | TotPnL: 3.84
1766991810504, 2025-12-29 08:03:30,504 - [IDLE] ETH | Px: 3033.85 | M: 3027.1 | B: 3039.1 / S: 3015.1 | delta: -0.1807(-0.0153) | Adj: -3.29%, Vol: 1.14, Thr: 0.0271 | PnL: -9.01 | TotPnL: -9.01
1766991810507, 2025-12-29 08:03:30,507 - [IDLE] BNB | Px: 862.72 | M: 860.2 | B: 863.2 / S: 857.2 | delta: -0.9070(-0.1140) | Adj: +3.90%, Vol: 1.00, Thr: 0.1360 | PnL: 4.22 | TotPnL: 4.22
1766991900098, 2025-12-29 08:05:00,098 - [IDLE] ETH | Px: 3032.25 | M: 3023.9 | B: 3036.1 / S: 3011.7 | delta: -0.1843(-0.0189) | Adj: -3.21%, Vol: 1.13, Thr: 0.0276 | PnL: -8.78 | TotPnL: -8.78
1766991900100, 2025-12-29 08:05:00,100 - [IDLE] BNB | Px: 862.28 | M: 859.2 | B: 862.3 / S: 856.1 | delta: -0.9301(-0.1371) | Adj: +4.16%, Vol: 1.00, Thr: 0.1395 | PnL: 4.61 | TotPnL: 4.61
1766991930796, 2025-12-29 08:05:30,796 - [IDLE] ETH | Px: 3032.95 | M: 3025.3 | B: 3037.4 / S: 3013.2 | delta: -0.1827(-0.0173) | Adj: -3.24%, Vol: 1.11, Thr: 0.0274 | PnL: -8.88 | TotPnL: -8.88
1766991930799, 2025-12-29 08:05:30,799 - [IDLE] BNB | Px: 862.44 | M: 859.6 | B: 862.6 / S: 856.5 | delta: -0.9218(-0.1288) | Adj: +4.07%, Vol: 1.00, Thr: 0.1383 | PnL: 4.47 | TotPnL: 4.47
1766991990347, 2025-12-29 08:06:30,347 - [IDLE] ETH | Px: 3031.45 | M: 3022.3 | B: 3034.6 / S: 3010.0 | delta: -0.1862(-0.0208) | Adj: -3.17%, Vol: 1.05, Thr: 0.0279 | PnL: -8.65 | TotPnL: -8.65
1766991990350, 2025-12-29 08:06:30,350 - [IDLE] BNB | Px: 862.22 | M: 859.1 | B: 862.2 / S: 856.0 | delta: -0.9328(-0.1398) | Adj: +4.19%, Vol: 1.00, Thr: 0.1399 | PnL: 4.64 | TotPnL: 4.64
1766991992476, 2025-12-29 08:06:32,476 - [TRIG] Net BNB: SELL 0.1434 | Tgt: -0.9364 / Cur: -0.7930 | Thresh: 0.1405
1766991992477, 2025-12-29 08:06:32,477 - [ORDER] ALO BNB SELL 0.143 @ 862.01
1766991993987, 2025-12-29 08:06:33,987 - Sleeping 5s to allow position update...
1766992000873, 2025-12-29 08:06:40,873 - [WAIT] BNB Pending SELL Order 281265022642 @ 862.01 (Dist: 0.010%)
1766992021181, 2025-12-29 08:07:01,181 - Cancelling idle order 281265022642 (A @ 862.01)
1766992080829, 2025-12-29 08:08:00,829 - [IDLE] ETH | Px: 3030.95 | M: 3021.3 | B: 3033.7 / S: 3008.9 | delta: -0.1873(-0.0219) | Adj: -3.14%, Vol: 1.18, Thr: 0.0281 | PnL: -8.56 | TotPnL: -8.56
1766992080832, 2025-12-29 08:08:00,832 - [IDLE] BNB | Px: 862.36 | M: 860.7 | B: 863.8 / S: 857.7 | delta: -0.9257(-0.0727) | Adj: +4.11%, Vol: 1.17, Thr: 0.1389 | PnL: 4.60 | TotPnL: 4.60
1766992128158, 2025-12-29 08:08:48,158 - [TRIG] Net ETH: SELL 0.0362 | Tgt: -0.2016 / Cur: -0.1654 | Thresh: 0.0302
1766992128159, 2025-12-29 08:08:48,159 - [ORDER] ALO ETH SELL 0.0361 @ 3023.5
1766992129364, 2025-12-29 08:08:49,364 - Sleeping 5s to allow position update...
1766992136310, 2025-12-29 08:08:56,310 - Cancelling stale order 281266440990 (A @ 3023.5)
1766992138020, 2025-12-29 08:08:58,020 - [TRIG] Net BNB: SELL 0.1750 | Tgt: -1.0280 / Cur: -0.8530 | Thresh: 0.1542
1766992138021, 2025-12-29 08:08:58,021 - [ORDER] ALO BNB SELL 0.175 @ 860.69
1766992138779, 2025-12-29 08:08:58,779 - Sleeping 5s to allow position update...
1766992170612, 2025-12-29 08:09:30,612 - [IDLE] ETH | Px: 3016.75 | M: 2992.7 | B: 3007.2 / S: 2978.2 | delta: -0.2202(-0.0548) | Adj: -2.41%, Vol: 2.63, Thr: 0.0330 | PnL: -6.21 | TotPnL: -6.21
1766992170615, 2025-12-29 08:09:30,615 - [IDLE] BNB | Px: 860.94 | M: 861.5 | B: 864.9 / S: 858.2 | delta: -1.0006(+0.0274) | Adj: +4.94%, Vol: 1.51, Thr: 0.1501 | PnL: 5.52 | TotPnL: 5.52
1766992190823, 2025-12-29 08:09:50,823 - [TRIG] Net ETH: SELL 0.0517 | Tgt: -0.2171 / Cur: -0.1654 | Thresh: 0.0326
1766992190824, 2025-12-29 08:09:50,824 - [ORDER] ALO ETH SELL 0.0516 @ 3018.2
1766992191514, 2025-12-29 08:09:51,514 - Sleeping 5s to allow position update...
1766992200292, 2025-12-29 08:10:00,292 - [IDLE] ETH | Px: 3018.85 | M: 3019.6 | B: 3033.8 / S: 3005.4 | delta: -0.2153(+0.0017) | Adj: -2.52%, Vol: 3.00, Thr: 0.0323 | PnL: -6.51 | TotPnL: -6.51
1766992200295, 2025-12-29 08:10:00,295 - [IDLE] BNB | Px: 861.44 | M: 862.6 | B: 865.9 / S: 859.4 | delta: -0.9742(+0.0538) | Adj: +4.65%, Vol: 1.64, Thr: 0.1461 | PnL: 5.16 | TotPnL: 5.16
1766992230904, 2025-12-29 08:10:30,904 - [IDLE] ETH | Px: 3020.55 | M: 3023.0 | B: 3037.0 / S: 3009.1 | delta: -0.2113(+0.0057) | Adj: -2.61%, Vol: 3.00, Thr: 0.0317 | PnL: -6.95 | TotPnL: -6.95
1766992230907, 2025-12-29 08:10:30,907 - [IDLE] BNB | Px: 861.53 | M: 862.8 | B: 866.0 / S: 859.6 | delta: -0.9692(+0.0588) | Adj: +4.60%, Vol: 1.66, Thr: 0.1454 | PnL: 5.05 | TotPnL: 5.05
1766992290944, 2025-12-29 08:11:30,944 - [IDLE] ETH | Px: 3021.05 | M: 3024.1 | B: 3037.9 / S: 3010.2 | delta: -0.2102(+0.0068) | Adj: -2.63%, Vol: 3.00, Thr: 0.0315 | PnL: -7.12 | TotPnL: -7.12
1766992290947, 2025-12-29 08:11:30,947 - [IDLE] BNB | Px: 861.76 | M: 863.3 | B: 866.5 / S: 860.2 | delta: -0.9571(+0.0709) | Adj: +4.46%, Vol: 1.50, Thr: 0.1436 | PnL: 4.81 | TotPnL: 4.81
1766992380590, 2025-12-29 08:13:00,590 - [IDLE] ETH | Px: 3021.65 | M: 3025.3 | B: 3039.0 / S: 3011.5 | delta: -0.2088(+0.0082) | Adj: -2.66%, Vol: 3.00, Thr: 0.0313 | PnL: -7.25 | TotPnL: -7.25
1766992380592, 2025-12-29 08:13:00,592 - [IDLE] BNB | Px: 861.56 | M: 862.9 | B: 866.1 / S: 859.7 | delta: -0.9676(+0.0604) | Adj: +4.58%, Vol: 1.18, Thr: 0.1451 | PnL: 4.94 | TotPnL: 4.94
1766992440620, 2025-12-29 08:14:00,620 - [IDLE] ETH | Px: 3017.35 | M: 3016.6 | B: 3031.0 / S: 3002.2 | delta: -0.2188(-0.0018) | Adj: -2.44%, Vol: 3.00, Thr: 0.0328 | PnL: -6.38 | TotPnL: -6.38
1766992440623, 2025-12-29 08:14:00,623 - [IDLE] BNB | Px: 860.88 | M: 861.4 | B: 864.7 / S: 858.1 | delta: -1.0038(+0.0242) | Adj: +4.98%, Vol: 1.15, Thr: 0.1506 | PnL: 5.76 | TotPnL: 5.76
1766992470558, 2025-12-29 08:14:30,558 - [IDLE] ETH | Px: 3019.45 | M: 3020.8 | B: 3034.9 / S: 3006.7 | delta: -0.2139(+0.0031) | Adj: -2.55%, Vol: 3.00, Thr: 0.0321 | PnL: -6.71 | TotPnL: -6.71
1766992470561, 2025-12-29 08:14:30,561 - [IDLE] BNB | Px: 860.86 | M: 861.4 | B: 864.7 / S: 858.0 | delta: -1.0049(+0.0231) | Adj: +4.99%, Vol: 1.20, Thr: 0.1507 | PnL: 5.69 | TotPnL: 5.69
1766992500517, 2025-12-29 08:15:00,517 - [IDLE] ETH | Px: 3019.65 | M: 3021.2 | B: 3035.3 / S: 3007.2 | delta: -0.2134(+0.0036) | Adj: -2.56%, Vol: 3.00, Thr: 0.0320 | PnL: -6.75 | TotPnL: -6.75
1766992500519, 2025-12-29 08:15:00,519 - [IDLE] BNB | Px: 860.84 | M: 861.3 | B: 864.7 / S: 858.0 | delta: -1.0059(+0.0221) | Adj: +5.00%, Vol: 1.24, Thr: 0.1509 | PnL: 5.76 | TotPnL: 5.76
1766992560831, 2025-12-29 08:16:00,831 - [IDLE] ETH | Px: 3019.65 | M: 3021.2 | B: 3035.3 / S: 3007.2 | delta: -0.2134(+0.0036) | Adj: -2.56%, Vol: 3.00, Thr: 0.0320 | PnL: -6.77 | TotPnL: -6.77
1766992560834, 2025-12-29 08:16:00,834 - [IDLE] BNB | Px: 860.91 | M: 861.5 | B: 864.8 / S: 858.2 | delta: -1.0020(+0.0260) | Adj: +4.96%, Vol: 1.21, Thr: 0.1503 | PnL: 5.68 | TotPnL: 5.68
1766992590511, 2025-12-29 08:16:30,511 - [IDLE] ETH | Px: 3017.75 | M: 3017.4 | B: 3031.7 / S: 3003.0 | delta: -0.2179(-0.0009) | Adj: -2.46%, Vol: 3.00, Thr: 0.0327 | PnL: -6.36 | TotPnL: -6.36
1766992590514, 2025-12-29 08:16:30,514 - [IDLE] BNB | Px: 860.94 | M: 861.5 | B: 864.9 / S: 858.2 | delta: -1.0006(+0.0274) | Adj: +4.94%, Vol: 1.17, Thr: 0.1501 | PnL: 5.66 | TotPnL: 5.66
1766992710683, 2025-12-29 08:18:30,683 - [IDLE] ETH | Px: 3015.75 | M: 3013.3 | B: 3027.9 / S: 2998.7 | delta: -0.2226(-0.0056) | Adj: -2.36%, Vol: 1.63, Thr: 0.0334 | PnL: -5.90 | TotPnL: -5.90
1766992710685, 2025-12-29 08:18:30,685 - [IDLE] BNB | Px: 860.54 | M: 860.7 | B: 864.1 / S: 857.3 | delta: -1.0214(+0.0066) | Adj: +5.17%, Vol: 1.04, Thr: 0.1532 | PnL: 5.98 | TotPnL: 5.98
1766992740234, 2025-12-29 08:19:00,234 - [IDLE] ETH | Px: 3014.95 | M: 3011.7 | B: 3026.4 / S: 2996.9 | delta: -0.2244(-0.0074) | Adj: -2.32%, Vol: 1.59, Thr: 0.0337 | PnL: -5.73 | TotPnL: -5.73
1766992740236, 2025-12-29 08:19:00,236 - [IDLE] BNB | Px: 860.50 | M: 860.6 | B: 864.0 / S: 857.2 | delta: -1.0235(+0.0045) | Adj: +5.19%, Vol: 1.07, Thr: 0.1535 | PnL: 6.12 | TotPnL: 6.12
1766992800206, 2025-12-29 08:20:00,206 - [IDLE] ETH | Px: 3015.65 | M: 3013.1 | B: 3027.8 / S: 2998.5 | delta: -0.2228(-0.0058) | Adj: -2.35%, Vol: 1.65, Thr: 0.0334 | PnL: -5.88 | TotPnL: -5.88
1766992800208, 2025-12-29 08:20:00,208 - [IDLE] BNB | Px: 859.92 | M: 859.3 | B: 862.8 / S: 855.8 | delta: -1.0545(-0.0265) | Adj: +5.53%, Vol: 1.30, Thr: 0.1582 | PnL: 6.70 | TotPnL: 6.70
1766992860362, 2025-12-29 08:21:00,362 - [IDLE] ETH | Px: 3015.35 | M: 3012.5 | B: 3027.2 / S: 2997.8 | delta: -0.2235(-0.0065) | Adj: -2.34%, Vol: 1.65, Thr: 0.0335 | PnL: -5.97 | TotPnL: -5.97
1766992860364, 2025-12-29 08:21:00,364 - [IDLE] BNB | Px: 859.72 | M: 858.9 | B: 862.4 / S: 855.4 | delta: -1.0652(-0.0372) | Adj: +5.65%, Vol: 1.33, Thr: 0.1598 | PnL: 6.73 | TotPnL: 6.73
1766992980253, 2025-12-29 08:23:00,253 - [IDLE] ETH | Px: 3013.55 | M: 3008.9 | B: 3023.8 / S: 2993.9 | delta: -0.2277(-0.0107) | Adj: -2.25%, Vol: 1.43, Thr: 0.0342 | PnL: -5.45 | TotPnL: -5.45
1766992980255, 2025-12-29 08:23:00,255 - [IDLE] BNB | Px: 859.30 | M: 858.0 | B: 861.6 / S: 854.4 | delta: -1.0879(-0.0599) | Adj: +5.89%, Vol: 1.57, Thr: 0.1632 | PnL: 7.42 | TotPnL: 7.42
1766993010228, 2025-12-29 08:23:30,228 - [IDLE] ETH | Px: 3012.55 | M: 3006.8 | B: 3021.9 / S: 2991.7 | delta: -0.2301(-0.0131) | Adj: -2.19%, Vol: 1.48, Thr: 0.0345 | PnL: -5.19 | TotPnL: -5.19
1766993010230, 2025-12-29 08:23:30,230 - [IDLE] BNB | Px: 859.08 | M: 857.5 | B: 861.1 / S: 853.8 | delta: -1.1003(-0.0723) | Adj: +6.03%, Vol: 1.65, Thr: 0.1650 | PnL: 7.61 | TotPnL: 7.61
1766993040197, 2025-12-29 08:24:00,197 - [IDLE] ETH | Px: 3010.75 | M: 3003.2 | B: 3018.5 / S: 2987.8 | delta: -0.2343(-0.0173) | Adj: -2.10%, Vol: 1.62, Thr: 0.0351 | PnL: -4.82 | TotPnL: -4.82
1766993040200, 2025-12-29 08:24:00,200 - [IDLE] BNB | Px: 858.96 | M: 857.2 | B: 860.9 / S: 853.6 | delta: -1.1068(-0.0788) | Adj: +6.10%, Vol: 1.72, Thr: 0.1660 | PnL: 7.83 | TotPnL: 7.83
1766993070729, 2025-12-29 08:24:30,729 - [IDLE] ETH | Px: 3012.45 | M: 3006.6 | B: 3021.7 / S: 2991.5 | delta: -0.2303(-0.0133) | Adj: -2.19%, Vol: 1.69, Thr: 0.0345 | PnL: -5.23 | TotPnL: -5.23
1766993070732, 2025-12-29 08:24:30,732 - [IDLE] BNB | Px: 859.04 | M: 857.4 | B: 861.0 / S: 853.7 | delta: -1.1025(-0.0745) | Adj: +6.05%, Vol: 1.76, Thr: 0.1654 | PnL: 7.68 | TotPnL: 7.68
1766993190504, 2025-12-29 08:26:30,504 - [IDLE] ETH | Px: 3013.75 | M: 3009.3 | B: 3024.2 / S: 2994.3 | delta: -0.2273(-0.0103) | Adj: -2.26%, Vol: 1.30, Thr: 0.0341 | PnL: -5.45 | TotPnL: -5.45
1766993190507, 2025-12-29 08:26:30,507 - [IDLE] BNB | Px: 859.32 | M: 858.0 | B: 861.6 / S: 854.4 | delta: -1.0868(-0.0588) | Adj: +5.88%, Vol: 1.52, Thr: 0.1630 | PnL: 7.32 | TotPnL: 7.32
1766993280912, 2025-12-29 08:28:00,912 - [IDLE] ETH | Px: 3014.75 | M: 3011.3 | B: 3026.1 / S: 2996.5 | delta: -0.2249(-0.0079) | Adj: -2.31%, Vol: 1.02, Thr: 0.0337 | PnL: -5.71 | TotPnL: -5.71
1766993280915, 2025-12-29 08:28:00,915 - [IDLE] BNB | Px: 859.42 | M: 858.2 | B: 861.8 / S: 854.7 | delta: -1.0814(-0.0534) | Adj: +5.82%, Vol: 1.05, Thr: 0.1622 | PnL: 7.24 | TotPnL: 7.24
1766993370442, 2025-12-29 08:29:30,442 - [IDLE] ETH | Px: 3012.85 | M: 3007.4 | B: 3022.5 / S: 2992.4 | delta: -0.2294(-0.0124) | Adj: -2.21%, Vol: 1.00, Thr: 0.0344 | PnL: -5.27 | TotPnL: -5.27
1766993370445, 2025-12-29 08:29:30,445 - [IDLE] BNB | Px: 859.34 | M: 858.1 | B: 861.6 / S: 854.5 | delta: -1.0863(-0.0583) | Adj: +5.88%, Vol: 1.00, Thr: 0.1629 | PnL: 7.34 | TotPnL: 7.34
1766993400546, 2025-12-29 08:30:00,546 - [IDLE] ETH | Px: 3013.35 | M: 3008.5 | B: 3023.4 / S: 2993.5 | delta: -0.2282(-0.0112) | Adj: -2.23%, Vol: 1.00, Thr: 0.0342 | PnL: -5.38 | TotPnL: -5.38
1766993400549, 2025-12-29 08:30:00,549 - [IDLE] BNB | Px: 858.60 | M: 856.5 | B: 860.2 / S: 852.7 | delta: -1.1258(-0.0978) | Adj: +6.30%, Vol: 1.00, Thr: 0.1689 | PnL: 8.24 | TotPnL: 8.24
1766993430162, 2025-12-29 08:30:30,162 - [IDLE] ETH | Px: 3013.95 | M: 3009.7 | B: 3024.6 / S: 2994.8 | delta: -0.2268(-0.0098) | Adj: -2.27%, Vol: 1.00, Thr: 0.0340 | PnL: -5.30 | TotPnL: -5.30
1766993430165, 2025-12-29 08:30:30,165 - [IDLE] BNB | Px: 858.68 | M: 856.6 | B: 860.3 / S: 852.9 | delta: -1.1215(-0.0935) | Adj: +6.26%, Vol: 1.00, Thr: 0.1682 | PnL: 8.12 | TotPnL: 8.12
1766993460416, 2025-12-29 08:31:00,416 - [IDLE] ETH | Px: 3014.75 | M: 3011.3 | B: 3026.1 / S: 2996.5 | delta: -0.2249(-0.0079) | Adj: -2.31%, Vol: 1.00, Thr: 0.0337 | PnL: -5.67 | TotPnL: -5.67
1766993460419, 2025-12-29 08:31:00,419 - [IDLE] BNB | Px: 858.76 | M: 856.8 | B: 860.5 / S: 853.1 | delta: -1.1171(-0.0891) | Adj: +6.21%, Vol: 1.00, Thr: 0.1676 | PnL: 8.01 | TotPnL: 8.01
1766993520644, 2025-12-29 08:32:00,644 - [IDLE] ETH | Px: 3020.25 | M: 3022.4 | B: 3036.4 / S: 3008.5 | delta: -0.2120(+0.0050) | Adj: -2.59%, Vol: 1.15, Thr: 0.0318 | PnL: -6.88 | TotPnL: -6.88
1766993520647, 2025-12-29 08:32:00,647 - [IDLE] BNB | Px: 859.36 | M: 858.1 | B: 861.7 / S: 854.5 | delta: -1.0846(-0.0566) | Adj: +5.86%, Vol: 1.00, Thr: 0.1627 | PnL: 7.22 | TotPnL: 7.22
1766993580062, 2025-12-29 08:33:00,062 - [IDLE] ETH | Px: 3017.65 | M: 3017.2 | B: 3031.5 / S: 3002.8 | delta: -0.2181(-0.0011) | Adj: -2.46%, Vol: 1.46, Thr: 0.0327 | PnL: -6.32 | TotPnL: -6.32
1766993580064, 2025-12-29 08:33:00,064 - [IDLE] BNB | Px: 859.57 | M: 858.6 | B: 862.1 / S: 855.0 | delta: -1.0736(-0.0456) | Adj: +5.74%, Vol: 1.00, Thr: 0.1610 | PnL: 7.21 | TotPnL: 7.21
1766993610179, 2025-12-29 08:33:30,179 - [IDLE] ETH | Px: 3018.85 | M: 3019.6 | B: 3033.8 / S: 3005.4 | delta: -0.2153(+0.0017) | Adj: -2.52%, Vol: 1.52, Thr: 0.0323 | PnL: -6.60 | TotPnL: -6.60
1766993610181, 2025-12-29 08:33:30,181 - [IDLE] BNB | Px: 859.90 | M: 859.3 | B: 862.8 / S: 855.8 | delta: -1.0556(-0.0276) | Adj: +5.54%, Vol: 1.00, Thr: 0.1583 | PnL: 6.64 | TotPnL: 6.64
1766993640396, 2025-12-29 08:34:00,396 - [IDLE] ETH | Px: 3018.85 | M: 3019.6 | B: 3033.8 / S: 3005.4 | delta: -0.2153(+0.0017) | Adj: -2.52%, Vol: 1.50, Thr: 0.0323 | PnL: -6.60 | TotPnL: -6.60
1766993640399, 2025-12-29 08:34:00,399 - [IDLE] BNB | Px: 859.90 | M: 859.3 | B: 862.8 / S: 855.8 | delta: -1.0556(-0.0276) | Adj: +5.54%, Vol: 1.00, Thr: 0.1583 | PnL: 6.70 | TotPnL: 6.70
1766993730678, 2025-12-29 08:35:30,678 - [IDLE] ETH | Px: 3018.35 | M: 3018.6 | B: 3032.8 / S: 3004.3 | delta: -0.2165(+0.0005) | Adj: -2.49%, Vol: 1.69, Thr: 0.0325 | PnL: -6.47 | TotPnL: -6.47
1766993730680, 2025-12-29 08:35:30,680 - [IDLE] BNB | Px: 860.44 | M: 860.5 | B: 863.9 / S: 857.1 | delta: -1.0267(+0.0013) | Adj: +5.23%, Vol: 1.15, Thr: 0.1540 | PnL: 6.19 | TotPnL: 6.19
1766993820178, 2025-12-29 08:37:00,178 - [IDLE] ETH | Px: 3019.45 | M: 3020.8 | B: 3034.9 / S: 3006.7 | delta: -0.2139(+0.0031) | Adj: -2.55%, Vol: 1.74, Thr: 0.0321 | PnL: -6.73 | TotPnL: -6.73
1766993820181, 2025-12-29 08:37:00,181 - [IDLE] BNB | Px: 861.22 | M: 862.2 | B: 865.4 / S: 858.9 | delta: -0.9856(+0.0424) | Adj: +4.78%, Vol: 1.66, Thr: 0.1478 | PnL: 5.40 | TotPnL: 5.40
1766993850479, 2025-12-29 08:37:30,479 - [IDLE] ETH | Px: 3018.65 | M: 3019.2 | B: 3033.4 / S: 3005.0 | delta: -0.2158(+0.0012) | Adj: -2.51%, Vol: 1.74, Thr: 0.0324 | PnL: -6.55 | TotPnL: -6.55
1766993850482, 2025-12-29 08:37:30,482 - [IDLE] BNB | Px: 860.96 | M: 861.6 | B: 864.9 / S: 858.3 | delta: -0.9991(+0.0289) | Adj: +4.93%, Vol: 1.82, Thr: 0.1499 | PnL: 5.57 | TotPnL: 5.57
1766993910407, 2025-12-29 08:38:30,407 - [IDLE] ETH | Px: 3018.85 | M: 3019.6 | B: 3033.8 / S: 3005.4 | delta: -0.2153(+0.0017) | Adj: -2.52%, Vol: 1.60, Thr: 0.0323 | PnL: -6.60 | TotPnL: -6.60
1766993910410, 2025-12-29 08:38:30,410 - [IDLE] BNB | Px: 860.80 | M: 861.2 | B: 864.6 / S: 857.9 | delta: -1.0081(+0.0199) | Adj: +5.03%, Vol: 1.93, Thr: 0.1512 | PnL: 5.79 | TotPnL: 5.79
1766993940294, 2025-12-29 08:39:00,294 - [IDLE] ETH | Px: 3018.35 | M: 3018.6 | B: 3032.8 / S: 3004.3 | delta: -0.2165(+0.0005) | Adj: -2.49%, Vol: 1.45, Thr: 0.0325 | PnL: -6.49 | TotPnL: -6.49
1766993940297, 2025-12-29 08:39:00,297 - [IDLE] BNB | Px: 860.76 | M: 861.1 | B: 864.5 / S: 857.8 | delta: -1.0102(+0.0178) | Adj: +5.05%, Vol: 1.95, Thr: 0.1515 | PnL: 5.78 | TotPnL: 5.78
1766994060459, 2025-12-29 08:41:00,459 - [IDLE] ETH | Px: 3016.95 | M: 3015.7 | B: 3030.2 / S: 3001.3 | delta: -0.2197(-0.0027) | Adj: -2.42%, Vol: 1.00, Thr: 0.0330 | PnL: -6.19 | TotPnL: -6.19
1766994060462, 2025-12-29 08:41:00,462 - [IDLE] BNB | Px: 860.29 | M: 860.1 | B: 863.6 / S: 856.7 | delta: -1.0350(-0.0070) | Adj: +5.32%, Vol: 1.33, Thr: 0.1552 | PnL: 6.33 | TotPnL: 6.33
1766994150022, 2025-12-29 08:42:30,022 - [IDLE] ETH | Px: 3016.55 | M: 3014.9 | B: 3029.4 / S: 3000.4 | delta: -0.2207(-0.0037) | Adj: -2.40%, Vol: 1.00, Thr: 0.0331 | PnL: -6.08 | TotPnL: -6.08
1766994150025, 2025-12-29 08:42:30,025 - [IDLE] BNB | Px: 860.38 | M: 860.3 | B: 863.7 / S: 856.9 | delta: -1.0304(-0.0024) | Adj: +5.27%, Vol: 1.00, Thr: 0.1546 | PnL: 6.19 | TotPnL: 6.19
1766994180406, 2025-12-29 08:43:00,406 - [IDLE] ETH | Px: 3016.55 | M: 3014.9 | B: 3029.4 / S: 3000.4 | delta: -0.2207(-0.0037) | Adj: -2.40%, Vol: 1.00, Thr: 0.0331 | PnL: -6.03 | TotPnL: -6.03
1766994180409, 2025-12-29 08:43:00,409 - [IDLE] BNB | Px: 860.26 | M: 860.1 | B: 863.5 / S: 856.6 | delta: -1.0366(-0.0086) | Adj: +5.34%, Vol: 1.00, Thr: 0.1555 | PnL: 6.36 | TotPnL: 6.36
1766994240815, 2025-12-29 08:44:00,815 - [IDLE] ETH | Px: 3015.95 | M: 3013.7 | B: 3028.3 / S: 2999.1 | delta: -0.2221(-0.0051) | Adj: -2.37%, Vol: 1.00, Thr: 0.0333 | PnL: -5.90 | TotPnL: -5.90
1766994240818, 2025-12-29 08:44:00,818 - [IDLE] BNB | Px: 860.10 | M: 859.7 | B: 863.2 / S: 856.3 | delta: -1.0451(-0.0171) | Adj: +5.43%, Vol: 1.00, Thr: 0.1568 | PnL: 6.54 | TotPnL: 6.54
1766994300293, 2025-12-29 08:45:00,293 - [IDLE] ETH | Px: 3015.15 | M: 3012.1 | B: 3026.8 / S: 2997.4 | delta: -0.2240(-0.0070) | Adj: -2.33%, Vol: 1.00, Thr: 0.0336 | PnL: -5.75 | TotPnL: -5.75
1766994300296, 2025-12-29 08:45:00,296 - [IDLE] BNB | Px: 860.00 | M: 859.5 | B: 863.0 / S: 856.0 | delta: -1.0502(-0.0222) | Adj: +5.49%, Vol: 1.00, Thr: 0.1575 | PnL: 6.64 | TotPnL: 6.64
1766994330386, 2025-12-29 08:45:30,386 - [IDLE] ETH | Px: 3014.95 | M: 3011.7 | B: 3026.4 / S: 2996.9 | delta: -0.2244(-0.0074) | Adj: -2.32%, Vol: 1.00, Thr: 0.0337 | PnL: -5.77 | TotPnL: -5.77
1766994330388, 2025-12-29 08:45:30,388 - [IDLE] BNB | Px: 860.00 | M: 859.5 | B: 863.0 / S: 856.0 | delta: -1.0502(-0.0222) | Adj: +5.49%, Vol: 1.00, Thr: 0.1575 | PnL: 6.65 | TotPnL: 6.65
1766994360157, 2025-12-29 08:46:00,157 - [IDLE] ETH | Px: 3014.95 | M: 3011.7 | B: 3026.4 / S: 2996.9 | delta: -0.2244(-0.0074) | Adj: -2.32%, Vol: 1.00, Thr: 0.0337 | PnL: -5.77 | TotPnL: -5.77
1766994360159, 2025-12-29 08:46:00,159 - [IDLE] BNB | Px: 860.16 | M: 859.9 | B: 863.3 / S: 856.4 | delta: -1.0416(-0.0136) | Adj: +5.39%, Vol: 1.00, Thr: 0.1562 | PnL: 6.49 | TotPnL: 6.49
1766994390964, 2025-12-29 08:46:30,964 - [IDLE] ETH | Px: 3015.05 | M: 3011.9 | B: 3026.6 / S: 2997.2 | delta: -0.2242(-0.0072) | Adj: -2.32%, Vol: 1.00, Thr: 0.0336 | PnL: -5.82 | TotPnL: -5.82
1766994390966, 2025-12-29 08:46:30,966 - [IDLE] BNB | Px: 860.38 | M: 860.3 | B: 863.7 / S: 856.9 | delta: -1.0304(-0.0024) | Adj: +5.27%, Vol: 1.00, Thr: 0.1546 | PnL: 6.27 | TotPnL: 6.27
1766994510617, 2025-12-29 08:48:30,617 - [IDLE] ETH | Px: 3017.05 | M: 3016.0 | B: 3030.4 / S: 3001.5 | delta: -0.2195(-0.0025) | Adj: -2.43%, Vol: 1.00, Thr: 0.0329 | PnL: -6.21 | TotPnL: -6.21
1766994510620, 2025-12-29 08:48:30,620 - [IDLE] BNB | Px: 860.02 | M: 859.6 | B: 863.0 / S: 856.1 | delta: -1.0491(-0.0211) | Adj: +5.47%, Vol: 1.00, Thr: 0.1574 | PnL: 6.63 | TotPnL: 6.63
1766994540892, 2025-12-29 08:49:00,892 - [IDLE] ETH | Px: 3017.05 | M: 3016.0 | B: 3030.4 / S: 3001.5 | delta: -0.2195(-0.0025) | Adj: -2.43%, Vol: 1.00, Thr: 0.0329 | PnL: -6.21 | TotPnL: -6.21
1766994540895, 2025-12-29 08:49:00,895 - [IDLE] BNB | Px: 859.94 | M: 859.4 | B: 862.9 / S: 855.9 | delta: -1.0540(-0.0260) | Adj: +5.53%, Vol: 1.00, Thr: 0.1581 | PnL: 6.67 | TotPnL: 6.67
1766994570035, 2025-12-29 08:49:30,035 - [IDLE] ETH | Px: 3017.85 | M: 3017.6 | B: 3031.9 / S: 3003.3 | delta: -0.2176(-0.0006) | Adj: -2.47%, Vol: 1.00, Thr: 0.0326 | PnL: -6.32 | TotPnL: -6.32
1766994570037, 2025-12-29 08:49:30,037 - [IDLE] BNB | Px: 859.96 | M: 859.4 | B: 862.9 / S: 855.9 | delta: -1.0524(-0.0244) | Adj: +5.51%, Vol: 1.00, Thr: 0.1579 | PnL: 6.69 | TotPnL: 6.69
1766994630865, 2025-12-29 08:50:30,865 - [IDLE] ETH | Px: 3019.45 | M: 3020.8 | B: 3034.9 / S: 3006.7 | delta: -0.2139(+0.0031) | Adj: -2.55%, Vol: 1.00, Thr: 0.0321 | PnL: -6.73 | TotPnL: -6.73
1766994630868, 2025-12-29 08:50:30,868 - [IDLE] BNB | Px: 860.41 | M: 860.4 | B: 863.8 / S: 857.0 | delta: -1.0286(-0.0006) | Adj: +5.25%, Vol: 1.00, Thr: 0.1543 | PnL: 6.25 | TotPnL: 6.25
1766994690131, 2025-12-29 08:51:30,131 - [IDLE] ETH | Px: 3019.35 | M: 3020.6 | B: 3034.7 / S: 3006.5 | delta: -0.2141(+0.0029) | Adj: -2.54%, Vol: 1.00, Thr: 0.0321 | PnL: -6.71 | TotPnL: -6.71
1766994690133, 2025-12-29 08:51:30,133 - [IDLE] BNB | Px: 860.76 | M: 861.1 | B: 864.5 / S: 857.8 | delta: -1.0102(+0.0178) | Adj: +5.05%, Vol: 1.00, Thr: 0.1515 | PnL: 5.83 | TotPnL: 5.83
1766994810521, 2025-12-29 08:53:30,521 - [IDLE] ETH | Px: 3018.35 | M: 3018.6 | B: 3032.8 / S: 3004.3 | delta: -0.2165(+0.0005) | Adj: -2.49%, Vol: 1.12, Thr: 0.0325 | PnL: -6.47 | TotPnL: -6.47
1766994810524, 2025-12-29 08:53:30,524 - [IDLE] BNB | Px: 860.68 | M: 861.0 | B: 864.4 / S: 857.6 | delta: -1.0139(+0.0141) | Adj: +5.09%, Vol: 1.00, Thr: 0.1521 | PnL: 5.98 | TotPnL: 5.98
1766994840536, 2025-12-29 08:54:00,536 - [IDLE] ETH | Px: 3018.95 | M: 3019.8 | B: 3034.0 / S: 3005.6 | delta: -0.2151(+0.0019) | Adj: -2.52%, Vol: 1.12, Thr: 0.0323 | PnL: -6.58 | TotPnL: -6.58
1766994840539, 2025-12-29 08:54:00,539 - [IDLE] BNB | Px: 861.02 | M: 861.7 | B: 865.0 / S: 858.4 | delta: -0.9959(+0.0321) | Adj: +4.89%, Vol: 1.00, Thr: 0.1494 | PnL: 5.58 | TotPnL: 5.58
1766994930068, 2025-12-29 08:55:30,068 - [IDLE] ETH | Px: 3019.45 | M: 3020.8 | B: 3034.9 / S: 3006.7 | delta: -0.2139(+0.0031) | Adj: -2.55%, Vol: 1.02, Thr: 0.0321 | PnL: -6.69 | TotPnL: -6.69
1766994930071, 2025-12-29 08:55:30,071 - [IDLE] BNB | Px: 860.94 | M: 861.6 | B: 864.9 / S: 858.2 | delta: -1.0001(+0.0279) | Adj: +4.94%, Vol: 1.00, Thr: 0.1500 | PnL: 5.61 | TotPnL: 5.61
1766995050477, 2025-12-29 08:57:30,477 - [IDLE] ETH | Px: 3018.15 | M: 3018.2 | B: 3032.5 / S: 3003.9 | delta: -0.2169(+0.0001) | Adj: -2.48%, Vol: 1.00, Thr: 0.0325 | PnL: -6.45 | TotPnL: -6.45
1766995050480, 2025-12-29 08:57:30,480 - [IDLE] BNB | Px: 860.58 | M: 860.8 | B: 864.1 / S: 857.4 | delta: -1.0198(+0.0082) | Adj: +5.15%, Vol: 1.00, Thr: 0.1530 | PnL: 6.04 | TotPnL: 6.04
1766995140979, 2025-12-29 08:59:00,979 - [IDLE] ETH | Px: 3018.15 | M: 3018.2 | B: 3032.5 / S: 3003.9 | delta: -0.2169(+0.0001) | Adj: -2.48%, Vol: 1.00, Thr: 0.0325 | PnL: -6.40 | TotPnL: -6.40
1766995140982, 2025-12-29 08:59:00,982 - [IDLE] BNB | Px: 860.26 | M: 860.1 | B: 863.5 / S: 856.6 | delta: -1.0363(-0.0083) | Adj: +5.33%, Vol: 1.00, Thr: 0.1554 | PnL: 6.28 | TotPnL: 6.28
1766995230629, 2025-12-29 09:00:30,629 - [IDLE] ETH | Px: 3018.85 | M: 3019.6 | B: 3033.8 / S: 3005.4 | delta: -0.2153(+0.0017) | Adj: -2.52%, Vol: 1.00, Thr: 0.0323 | PnL: -6.55 | TotPnL: -6.55
1766995230632, 2025-12-29 09:00:30,632 - [IDLE] BNB | Px: 860.52 | M: 860.6 | B: 864.0 / S: 857.3 | delta: -1.0224(+0.0056) | Adj: +5.18%, Vol: 1.00, Thr: 0.1534 | PnL: 6.12 | TotPnL: 6.12
1766995320013, 2025-12-29 09:02:00,013 - [IDLE] ETH | Px: 3017.15 | M: 3016.2 | B: 3030.6 / S: 3001.7 | delta: -0.2193(-0.0023) | Adj: -2.43%, Vol: 1.00, Thr: 0.0329 | PnL: -6.25 | TotPnL: -6.25
1766995320015, 2025-12-29 09:02:00,015 - [IDLE] BNB | Px: 860.46 | M: 860.5 | B: 863.9 / S: 857.1 | delta: -1.0256(+0.0024) | Adj: +5.22%, Vol: 1.00, Thr: 0.1538 | PnL: 6.14 | TotPnL: 6.14
1766995350344, 2025-12-29 09:02:30,344 - [IDLE] ETH | Px: 3017.85 | M: 3017.6 | B: 3031.9 / S: 3003.3 | delta: -0.2176(-0.0006) | Adj: -2.47%, Vol: 1.00, Thr: 0.0326 | PnL: -6.38 | TotPnL: -6.38
1766995350346, 2025-12-29 09:02:30,346 - [IDLE] BNB | Px: 860.80 | M: 861.2 | B: 864.6 / S: 857.9 | delta: -1.0081(+0.0199) | Adj: +5.03%, Vol: 1.00, Thr: 0.1512 | PnL: 5.88 | TotPnL: 5.88
1766995380454, 2025-12-29 09:03:00,454 - [IDLE] ETH | Px: 3017.65 | M: 3017.2 | B: 3031.5 / S: 3002.8 | delta: -0.2181(-0.0011) | Adj: -2.46%, Vol: 1.00, Thr: 0.0327 | PnL: -6.32 | TotPnL: -6.32
1766995380456, 2025-12-29 09:03:00,456 - [IDLE] BNB | Px: 860.70 | M: 861.0 | B: 864.4 / S: 857.7 | delta: -1.0131(+0.0149) | Adj: +5.08%, Vol: 1.00, Thr: 0.1520 | PnL: 5.93 | TotPnL: 5.93
1766995410053, 2025-12-29 09:03:30,053 - [IDLE] ETH | Px: 3016.65 | M: 3015.1 | B: 3029.6 / S: 3000.6 | delta: -0.2204(-0.0034) | Adj: -2.40%, Vol: 1.00, Thr: 0.0331 | PnL: -6.14 | TotPnL: -6.14
1766995410055, 2025-12-29 09:03:30,055 - [IDLE] BNB | Px: 860.74 | M: 861.1 | B: 864.5 / S: 857.8 | delta: -1.0113(+0.0167) | Adj: +5.06%, Vol: 1.00, Thr: 0.1517 | PnL: 5.90 | TotPnL: 5.90
1766995620386, 2025-12-29 09:07:00,386 - [IDLE] ETH | Px: 3012.65 | M: 3007.0 | B: 3022.1 / S: 2991.9 | delta: -0.2298(-0.0128) | Adj: -2.20%, Vol: 1.68, Thr: 0.0345 | PnL: -5.30 | TotPnL: -5.30
1766995620388, 2025-12-29 09:07:00,388 - [IDLE] BNB | Px: 860.58 | M: 860.8 | B: 864.2 / S: 857.4 | delta: -1.0192(+0.0088) | Adj: +5.15%, Vol: 1.00, Thr: 0.1529 | PnL: 6.04 | TotPnL: 6.04
1766995650848, 2025-12-29 09:07:30,848 - [IDLE] ETH | Px: 3012.75 | M: 3007.2 | B: 3022.3 / S: 2992.2 | delta: -0.2296(-0.0126) | Adj: -2.20%, Vol: 1.72, Thr: 0.0344 | PnL: -5.27 | TotPnL: -5.27
1766995650850, 2025-12-29 09:07:30,850 - [IDLE] BNB | Px: 860.58 | M: 860.8 | B: 864.2 / S: 857.4 | delta: -1.0192(+0.0088) | Adj: +5.15%, Vol: 1.00, Thr: 0.1529 | PnL: 6.05 | TotPnL: 6.05
1766995710887, 2025-12-29 09:08:30,887 - [IDLE] ETH | Px: 3014.15 | M: 3010.1 | B: 3024.9 / S: 2995.2 | delta: -0.2263(-0.0093) | Adj: -2.28%, Vol: 1.67, Thr: 0.0339 | PnL: -5.69 | TotPnL: -5.69
1766995710890, 2025-12-29 09:08:30,890 - [IDLE] BNB | Px: 860.68 | M: 861.0 | B: 864.4 / S: 857.6 | delta: -1.0139(+0.0141) | Adj: +5.09%, Vol: 1.00, Thr: 0.1521 | PnL: 5.88 | TotPnL: 5.88
1766995770299, 2025-12-29 09:09:30,299 - [IDLE] ETH | Px: 3014.45 | M: 3010.7 | B: 3025.5 / S: 2995.9 | delta: -0.2256(-0.0086) | Adj: -2.29%, Vol: 1.54, Thr: 0.0338 | PnL: -5.64 | TotPnL: -5.64
1766995770300, 2025-12-29 09:09:30,300 - [IDLE] BNB | Px: 860.89 | M: 861.4 | B: 864.8 / S: 858.1 | delta: -1.0030(+0.0250) | Adj: +4.97%, Vol: 1.00, Thr: 0.1505 | PnL: 5.68 | TotPnL: 5.68
1766995800729, 2025-12-29 09:10:00,729 - [IDLE] ETH | Px: 3013.75 | M: 3009.3 | B: 3024.2 / S: 2994.3 | delta: -0.2273(-0.0103) | Adj: -2.26%, Vol: 1.48, Thr: 0.0341 | PnL: -5.47 | TotPnL: -5.47
1766995800731, 2025-12-29 09:10:00,731 - [IDLE] BNB | Px: 860.82 | M: 861.3 | B: 864.6 / S: 858.0 | delta: -1.0067(+0.0213) | Adj: +5.01%, Vol: 1.00, Thr: 0.1510 | PnL: 5.83 | TotPnL: 5.83
1766995830973, 2025-12-29 09:10:30,973 - [IDLE] ETH | Px: 3018.65 | M: 3019.2 | B: 3033.4 / S: 3005.0 | delta: -0.2158(+0.0012) | Adj: -2.51%, Vol: 1.42, Thr: 0.0324 | PnL: -6.42 | TotPnL: -6.42
1766995830974, 2025-12-29 09:10:30,974 - [IDLE] BNB | Px: 861.12 | M: 862.0 | B: 865.2 / S: 858.7 | delta: -0.9906(+0.0374) | Adj: +4.83%, Vol: 1.00, Thr: 0.1486 | PnL: 5.47 | TotPnL: 5.47
1766995950242, 2025-12-29 09:12:30,242 - [IDLE] ETH | Px: 3019.75 | M: 3021.4 | B: 3035.5 / S: 3007.4 | delta: -0.2132(+0.0038) | Adj: -2.56%, Vol: 1.86, Thr: 0.0320 | PnL: -6.79 | TotPnL: -6.79
1766995950245, 2025-12-29 09:12:30,245 - [IDLE] BNB | Px: 860.16 | M: 859.8 | B: 863.3 / S: 856.4 | delta: -1.0422(-0.0142) | Adj: +5.40%, Vol: 1.00, Thr: 0.1563 | PnL: 6.49 | TotPnL: 6.49
1766995980079, 2025-12-29 09:13:00,079 - [IDLE] ETH | Px: 3019.75 | M: 3021.4 | B: 3035.5 / S: 3007.4 | delta: -0.2132(+0.0038) | Adj: -2.56%, Vol: 1.95, Thr: 0.0320 | PnL: -6.79 | TotPnL: -6.79
1766995980080, 2025-12-29 09:13:00,080 - [IDLE] BNB | Px: 860.04 | M: 859.6 | B: 863.1 / S: 856.1 | delta: -1.0486(-0.0206) | Adj: +5.47%, Vol: 1.00, Thr: 0.1573 | PnL: 6.60 | TotPnL: 6.60
1766996070110, 2025-12-29 09:14:30,110 - [IDLE] ETH | Px: 3020.15 | M: 3022.2 | B: 3036.2 / S: 3008.2 | delta: -0.2123(+0.0047) | Adj: -2.59%, Vol: 2.20, Thr: 0.0318 | PnL: -6.88 | TotPnL: -6.88
1766996070112, 2025-12-29 09:14:30,112 - [IDLE] BNB | Px: 860.10 | M: 859.7 | B: 863.2 / S: 856.2 | delta: -1.0454(-0.0174) | Adj: +5.43%, Vol: 1.00, Thr: 0.1568 | PnL: 6.57 | TotPnL: 6.57
1766996100944, 2025-12-29 09:15:00,944 - [IDLE] ETH | Px: 3020.65 | M: 3023.2 | B: 3037.2 / S: 3009.3 | delta: -0.2111(+0.0059) | Adj: -2.61%, Vol: 2.22, Thr: 0.0317 | PnL: -6.99 | TotPnL: -6.99
1766996100946, 2025-12-29 09:15:00,946 - [IDLE] BNB | Px: 860.23 | M: 860.0 | B: 863.4 / S: 856.6 | delta: -1.0382(-0.0102) | Adj: +5.36%, Vol: 1.00, Thr: 0.1557 | PnL: 6.46 | TotPnL: 6.46
1766996130074, 2025-12-29 09:15:30,074 - [IDLE] ETH | Px: 3020.25 | M: 3022.4 | B: 3036.4 / S: 3008.5 | delta: -0.2120(+0.0050) | Adj: -2.59%, Vol: 2.22, Thr: 0.0318 | PnL: -6.90 | TotPnL: -6.90
1766996130076, 2025-12-29 09:15:30,076 - [IDLE] BNB | Px: 859.84 | M: 859.2 | B: 862.7 / S: 855.7 | delta: -1.0588(-0.0308) | Adj: +5.58%, Vol: 1.00, Thr: 0.1588 | PnL: 6.80 | TotPnL: 6.80
1766996160340, 2025-12-29 09:16:00,340 - [IDLE] ETH | Px: 3020.25 | M: 3022.4 | B: 3036.4 / S: 3008.5 | delta: -0.2120(+0.0050) | Adj: -2.59%, Vol: 2.10, Thr: 0.0318 | PnL: -6.90 | TotPnL: -6.90
1766996160341, 2025-12-29 09:16:00,341 - [IDLE] BNB | Px: 859.64 | M: 858.7 | B: 862.3 / S: 855.2 | delta: -1.0695(-0.0415) | Adj: +5.70%, Vol: 1.06, Thr: 0.1604 | PnL: 7.00 | TotPnL: 7.00
1766996190769, 2025-12-29 09:16:30,769 - [IDLE] ETH | Px: 3019.95 | M: 3021.8 | B: 3035.8 / S: 3007.8 | delta: -0.2127(+0.0043) | Adj: -2.57%, Vol: 1.94, Thr: 0.0319 | PnL: -6.86 | TotPnL: -6.86
1766996190770, 2025-12-29 09:16:30,770 - [IDLE] BNB | Px: 859.60 | M: 858.6 | B: 862.2 / S: 855.1 | delta: -1.0717(-0.0437) | Adj: +5.72%, Vol: 1.16, Thr: 0.1608 | PnL: 7.05 | TotPnL: 7.05
1766996220920, 2025-12-29 09:17:00,920 - [IDLE] ETH | Px: 3020.25 | M: 3022.4 | B: 3036.4 / S: 3008.5 | delta: -0.2120(+0.0050) | Adj: -2.59%, Vol: 1.79, Thr: 0.0318 | PnL: -6.90 | TotPnL: -6.90
1766996220922, 2025-12-29 09:17:00,922 - [IDLE] BNB | Px: 859.64 | M: 858.7 | B: 862.3 / S: 855.2 | delta: -1.0695(-0.0415) | Adj: +5.70%, Vol: 1.25, Thr: 0.1604 | PnL: 7.01 | TotPnL: 7.01
1766996310636, 2025-12-29 09:18:30,636 - [IDLE] ETH | Px: 3020.65 | M: 3023.2 | B: 3037.2 / S: 3009.3 | delta: -0.2111(+0.0059) | Adj: -2.61%, Vol: 1.37, Thr: 0.0317 | PnL: -6.90 | TotPnL: -6.90
1766996310638, 2025-12-29 09:18:30,638 - [IDLE] BNB | Px: 859.10 | M: 857.5 | B: 861.2 / S: 853.9 | delta: -1.0992(-0.0712) | Adj: +6.02%, Vol: 1.38, Thr: 0.1649 | PnL: 7.67 | TotPnL: 7.67
1766996340488, 2025-12-29 09:19:00,488 - [IDLE] ETH | Px: 3020.95 | M: 3023.8 | B: 3037.7 / S: 3010.0 | delta: -0.2104(+0.0066) | Adj: -2.63%, Vol: 1.19, Thr: 0.0316 | PnL: -7.05 | TotPnL: -7.05
1766996340490, 2025-12-29 09:19:00,490 - [IDLE] BNB | Px: 859.16 | M: 857.7 | B: 861.3 / S: 854.0 | delta: -1.0960(-0.0680) | Adj: +5.98%, Vol: 1.46, Thr: 0.1644 | PnL: 7.62 | TotPnL: 7.62
1766996370562, 2025-12-29 09:19:30,562 - [IDLE] ETH | Px: 3021.45 | M: 3024.9 | B: 3038.7 / S: 3011.1 | delta: -0.2092(+0.0078) | Adj: -2.65%, Vol: 1.00, Thr: 0.0314 | PnL: -7.16 | TotPnL: -7.16
1766996370564, 2025-12-29 09:19:30,564 - [IDLE] BNB | Px: 859.68 | M: 858.8 | B: 862.3 / S: 855.3 | delta: -1.0679(-0.0399) | Adj: +5.68%, Vol: 1.47, Thr: 0.1602 | PnL: 7.01 | TotPnL: 7.01
1766996400592, 2025-12-29 09:20:00,592 - [IDLE] ETH | Px: 3020.95 | M: 3023.8 | B: 3037.7 / S: 3010.0 | delta: -0.2104(+0.0066) | Adj: -2.63%, Vol: 1.00, Thr: 0.0316 | PnL: -7.16 | TotPnL: -7.16
1766996400594, 2025-12-29 09:20:00,594 - [IDLE] BNB | Px: 859.59 | M: 858.6 | B: 862.2 / S: 855.1 | delta: -1.0725(-0.0445) | Adj: +5.73%, Vol: 1.42, Thr: 0.1609 | PnL: 7.04 | TotPnL: 7.04
1766996430133, 2025-12-29 09:20:30,133 - [IDLE] ETH | Px: 3020.75 | M: 3023.4 | B: 3037.3 / S: 3009.5 | delta: -0.2109(+0.0061) | Adj: -2.62%, Vol: 1.00, Thr: 0.0316 | PnL: -7.01 | TotPnL: -7.01
1766996430134, 2025-12-29 09:20:30,134 - [IDLE] BNB | Px: 859.48 | M: 858.4 | B: 861.9 / S: 854.8 | delta: -1.0784(-0.0504) | Adj: +5.79%, Vol: 1.28, Thr: 0.1618 | PnL: 7.11 | TotPnL: 7.11
1766996640487, 2025-12-29 09:24:00,487 - [IDLE] ETH | Px: 3023.25 | M: 3028.5 | B: 3042.0 / S: 3015.0 | delta: -0.2051(+0.0119) | Adj: -2.74%, Vol: 1.00, Thr: 0.0308 | PnL: -7.53 | TotPnL: -7.53
1766996640488, 2025-12-29 09:24:00,488 - [IDLE] BNB | Px: 859.46 | M: 858.3 | B: 861.9 / S: 854.8 | delta: -1.0792(-0.0512) | Adj: +5.80%, Vol: 1.00, Thr: 0.1619 | PnL: 7.32 | TotPnL: 7.32
1766996700034, 2025-12-29 09:25:00,034 - [IDLE] ETH | Px: 3022.85 | M: 3027.7 | B: 3041.3 / S: 3014.1 | delta: -0.2060(+0.0110) | Adj: -2.72%, Vol: 1.00, Thr: 0.0309 | PnL: -7.42 | TotPnL: -7.42
1766996700037, 2025-12-29 09:25:00,037 - [IDLE] BNB | Px: 859.68 | M: 858.8 | B: 862.3 / S: 855.3 | delta: -1.0679(-0.0399) | Adj: +5.68%, Vol: 1.00, Thr: 0.1602 | PnL: 7.06 | TotPnL: 7.06
1766996760224, 2025-12-29 09:26:00,224 - [IDLE] ETH | Px: 3023.15 | M: 3028.3 | B: 3041.8 / S: 3014.8 | delta: -0.2053(+0.0117) | Adj: -2.74%, Vol: 1.00, Thr: 0.0308 | PnL: -7.53 | TotPnL: -7.53
1766996760226, 2025-12-29 09:26:00,226 - [IDLE] BNB | Px: 860.21 | M: 860.0 | B: 863.4 / S: 856.5 | delta: -1.0392(-0.0112) | Adj: +5.37%, Vol: 1.00, Thr: 0.1559 | PnL: 6.46 | TotPnL: 6.46
1766996820255, 2025-12-29 09:27:00,255 - [IDLE] ETH | Px: 3023.35 | M: 3028.7 | B: 3042.2 / S: 3015.2 | delta: -0.2048(+0.0122) | Adj: -2.75%, Vol: 1.00, Thr: 0.0307 | PnL: -7.53 | TotPnL: -7.53
1766996820258, 2025-12-29 09:27:00,258 - [IDLE] BNB | Px: 860.16 | M: 859.8 | B: 863.3 / S: 856.4 | delta: -1.0422(-0.0142) | Adj: +5.40%, Vol: 1.00, Thr: 0.1563 | PnL: 6.49 | TotPnL: 6.49
1766996880676, 2025-12-29 09:28:00,676 - [IDLE] ETH | Px: 3021.75 | M: 3025.5 | B: 3039.2 / S: 3011.7 | delta: -0.2085(+0.0085) | Adj: -2.67%, Vol: 1.00, Thr: 0.0313 | PnL: -7.25 | TotPnL: -7.25
1766996880678, 2025-12-29 09:28:00,678 - [IDLE] BNB | Px: 859.72 | M: 858.9 | B: 862.4 / S: 855.4 | delta: -1.0652(-0.0372) | Adj: +5.65%, Vol: 1.00, Thr: 0.1598 | PnL: 7.03 | TotPnL: 7.03
1766996970374, 2025-12-29 09:29:30,374 - [IDLE] ETH | Px: 3021.65 | M: 3025.3 | B: 3039.0 / S: 3011.5 | delta: -0.2088(+0.0082) | Adj: -2.66%, Vol: 1.00, Thr: 0.0313 | PnL: -7.21 | TotPnL: -7.21
1766996970377, 2025-12-29 09:29:30,377 - [IDLE] BNB | Px: 859.76 | M: 859.0 | B: 862.5 / S: 855.5 | delta: -1.0631(-0.0351) | Adj: +5.63%, Vol: 1.00, Thr: 0.1595 | PnL: 6.97 | TotPnL: 6.97
1766997000939, 2025-12-29 09:30:00,939 - [IDLE] ETH | Px: 3021.65 | M: 3025.3 | B: 3039.0 / S: 3011.5 | delta: -0.2088(+0.0082) | Adj: -2.66%, Vol: 1.00, Thr: 0.0313 | PnL: -7.21 | TotPnL: -7.21
1766997000941, 2025-12-29 09:30:00,941 - [IDLE] BNB | Px: 859.76 | M: 859.0 | B: 862.5 / S: 855.5 | delta: -1.0631(-0.0351) | Adj: +5.63%, Vol: 1.00, Thr: 0.1595 | PnL: 6.96 | TotPnL: 6.96
1766997030689, 2025-12-29 09:30:30,689 - [IDLE] ETH | Px: 3020.95 | M: 3023.8 | B: 3037.7 / S: 3010.0 | delta: -0.2104(+0.0066) | Adj: -2.63%, Vol: 1.00, Thr: 0.0316 | PnL: -7.01 | TotPnL: -7.01
1766997030691, 2025-12-29 09:30:30,691 - [IDLE] BNB | Px: 859.70 | M: 858.9 | B: 862.4 / S: 855.3 | delta: -1.0663(-0.0383) | Adj: +5.66%, Vol: 1.00, Thr: 0.1599 | PnL: 6.95 | TotPnL: 6.95
1766997060839, 2025-12-29 09:31:00,839 - [IDLE] ETH | Px: 3021.15 | M: 3024.3 | B: 3038.1 / S: 3010.4 | delta: -0.2099(+0.0071) | Adj: -2.64%, Vol: 1.00, Thr: 0.0315 | PnL: -7.10 | TotPnL: -7.10
1766997060841, 2025-12-29 09:31:00,841 - [IDLE] BNB | Px: 859.88 | M: 859.2 | B: 862.7 / S: 855.7 | delta: -1.0572(-0.0292) | Adj: +5.56%, Vol: 1.00, Thr: 0.1586 | PnL: 6.79 | TotPnL: 6.79
1766997150142, 2025-12-29 09:32:30,142 - [IDLE] ETH | Px: 3022.45 | M: 3026.9 | B: 3040.5 / S: 3013.2 | delta: -0.2069(+0.0101) | Adj: -2.70%, Vol: 1.00, Thr: 0.0310 | PnL: -7.36 | TotPnL: -7.36
1766997150144, 2025-12-29 09:32:30,144 - [IDLE] BNB | Px: 860.04 | M: 859.6 | B: 863.1 / S: 856.1 | delta: -1.0486(-0.0206) | Adj: +5.47%, Vol: 1.00, Thr: 0.1573 | PnL: 6.63 | TotPnL: 6.63
1766997240700, 2025-12-29 09:34:00,700 - [IDLE] ETH | Px: 3020.65 | M: 3023.2 | B: 3037.2 / S: 3009.3 | delta: -0.2111(+0.0059) | Adj: -2.61%, Vol: 1.00, Thr: 0.0317 | PnL: -6.92 | TotPnL: -6.92
1766997240701, 2025-12-29 09:34:00,701 - [IDLE] BNB | Px: 859.84 | M: 859.1 | B: 862.7 / S: 855.6 | delta: -1.0593(-0.0313) | Adj: +5.59%, Vol: 1.00, Thr: 0.1589 | PnL: 6.84 | TotPnL: 6.84
1766997330343, 2025-12-29 09:35:30,343 - [IDLE] ETH | Px: 3021.65 | M: 3025.3 | B: 3039.0 / S: 3011.5 | delta: -0.2088(+0.0082) | Adj: -2.66%, Vol: 1.00, Thr: 0.0313 | PnL: -7.16 | TotPnL: -7.16
1766997330345, 2025-12-29 09:35:30,345 - [IDLE] BNB | Px: 860.02 | M: 859.6 | B: 863.0 / S: 856.1 | delta: -1.0491(-0.0211) | Adj: +5.47%, Vol: 1.00, Thr: 0.1574 | PnL: 6.64 | TotPnL: 6.64
1766997360144, 2025-12-29 09:36:00,144 - [IDLE] ETH | Px: 3021.25 | M: 3024.5 | B: 3038.3 / S: 3010.6 | delta: -0.2097(+0.0073) | Adj: -2.64%, Vol: 1.00, Thr: 0.0315 | PnL: -7.10 | TotPnL: -7.10
1766997360145, 2025-12-29 09:36:00,145 - [IDLE] BNB | Px: 860.02 | M: 859.6 | B: 863.0 / S: 856.1 | delta: -1.0491(-0.0211) | Adj: +5.47%, Vol: 1.00, Thr: 0.1574 | PnL: 6.65 | TotPnL: 6.65
1766997390410, 2025-12-29 09:36:30,410 - [IDLE] ETH | Px: 3021.55 | M: 3025.1 | B: 3038.8 / S: 3011.3 | delta: -0.2090(+0.0080) | Adj: -2.66%, Vol: 1.00, Thr: 0.0314 | PnL: -7.16 | TotPnL: -7.16
1766997390413, 2025-12-29 09:36:30,413 - [IDLE] BNB | Px: 860.02 | M: 859.6 | B: 863.0 / S: 856.1 | delta: -1.0491(-0.0211) | Adj: +5.47%, Vol: 1.00, Thr: 0.1574 | PnL: 6.64 | TotPnL: 6.64
1766997420169, 2025-12-29 09:37:00,169 - [IDLE] ETH | Px: 3020.25 | M: 3022.4 | B: 3036.4 / S: 3008.5 | delta: -0.2120(+0.0050) | Adj: -2.59%, Vol: 1.00, Thr: 0.0318 | PnL: -6.86 | TotPnL: -6.86
1766997420171, 2025-12-29 09:37:00,171 - [IDLE] BNB | Px: 860.02 | M: 859.6 | B: 863.0 / S: 856.1 | delta: -1.0491(-0.0211) | Adj: +5.47%, Vol: 1.00, Thr: 0.1574 | PnL: 6.63 | TotPnL: 6.63
1766997450016, 2025-12-29 09:37:30,016 - [IDLE] ETH | Px: 3018.75 | M: 3019.4 | B: 3033.6 / S: 3005.2 | delta: -0.2155(+0.0015) | Adj: -2.51%, Vol: 1.00, Thr: 0.0323 | PnL: -6.55 | TotPnL: -6.55
1766997450019, 2025-12-29 09:37:30,019 - [IDLE] BNB | Px: 859.82 | M: 859.1 | B: 862.6 / S: 855.6 | delta: -1.0599(-0.0319) | Adj: +5.59%, Vol: 1.00, Thr: 0.1590 | PnL: 6.89 | TotPnL: 6.89
1766997480749, 2025-12-29 09:38:00,749 - [IDLE] ETH | Px: 3018.35 | M: 3018.6 | B: 3032.8 / S: 3004.3 | delta: -0.2165(+0.0005) | Adj: -2.49%, Vol: 1.00, Thr: 0.0325 | PnL: -6.47 | TotPnL: -6.47
1766997480752, 2025-12-29 09:38:00,752 - [IDLE] BNB | Px: 859.82 | M: 859.1 | B: 862.6 / S: 855.6 | delta: -1.0599(-0.0319) | Adj: +5.59%, Vol: 1.00, Thr: 0.1590 | PnL: 6.88 | TotPnL: 6.88
1766997510812, 2025-12-29 09:38:30,812 - [IDLE] ETH | Px: 3017.85 | M: 3017.6 | B: 3031.9 / S: 3003.3 | delta: -0.2176(-0.0006) | Adj: -2.47%, Vol: 1.00, Thr: 0.0326 | PnL: -6.36 | TotPnL: -6.36
1766997510814, 2025-12-29 09:38:30,814 - [IDLE] BNB | Px: 859.82 | M: 859.1 | B: 862.6 / S: 855.6 | delta: -1.0599(-0.0319) | Adj: +5.59%, Vol: 1.00, Thr: 0.1590 | PnL: 6.86 | TotPnL: 6.86
1766997570733, 2025-12-29 09:39:30,733 - [IDLE] ETH | Px: 3015.05 | M: 3011.9 | B: 3026.6 / S: 2997.2 | delta: -0.2242(-0.0072) | Adj: -2.32%, Vol: 1.11, Thr: 0.0336 | PnL: -5.75 | TotPnL: -5.75
1766997570735, 2025-12-29 09:39:30,735 - [IDLE] BNB | Px: 859.02 | M: 857.3 | B: 861.0 / S: 853.7 | delta: -1.1036(-0.0756) | Adj: +6.06%, Vol: 1.00, Thr: 0.1655 | PnL: 7.66 | TotPnL: 7.66
1766997810733, 2025-12-29 09:43:30,733 - [IDLE] ETH | Px: 3017.65 | M: 3017.2 | B: 3031.5 / S: 3002.8 | delta: -0.2181(-0.0011) | Adj: -2.46%, Vol: 1.26, Thr: 0.0327 | PnL: -6.29 | TotPnL: -6.29
1766997810735, 2025-12-29 09:43:30,735 - [IDLE] BNB | Px: 859.44 | M: 858.3 | B: 861.8 / S: 854.7 | delta: -1.0809(-0.0529) | Adj: +5.82%, Vol: 1.00, Thr: 0.1621 | PnL: 7.26 | TotPnL: 7.26
1766997870398, 2025-12-29 09:44:30,398 - [IDLE] ETH | Px: 3017.85 | M: 3017.6 | B: 3031.9 / S: 3003.3 | delta: -0.2176(-0.0006) | Adj: -2.47%, Vol: 1.20, Thr: 0.0326 | PnL: -6.40 | TotPnL: -6.40
1766997870401, 2025-12-29 09:44:30,401 - [IDLE] BNB | Px: 859.44 | M: 858.3 | B: 861.8 / S: 854.7 | delta: -1.0809(-0.0529) | Adj: +5.82%, Vol: 1.00, Thr: 0.1621 | PnL: 7.22 | TotPnL: 7.22
1766997930460, 2025-12-29 09:45:30,460 - [IDLE] ETH | Px: 3017.45 | M: 3016.8 | B: 3031.1 / S: 3002.4 | delta: -0.2186(-0.0016) | Adj: -2.45%, Vol: 1.00, Thr: 0.0328 | PnL: -6.29 | TotPnL: -6.29
1766997930462, 2025-12-29 09:45:30,462 - [IDLE] BNB | Px: 859.84 | M: 859.2 | B: 862.7 / S: 855.7 | delta: -1.0588(-0.0308) | Adj: +5.58%, Vol: 1.00, Thr: 0.1588 | PnL: 6.80 | TotPnL: 6.80
1766997960749, 2025-12-29 09:46:00,749 - [IDLE] ETH | Px: 3017.35 | M: 3016.6 | B: 3031.0 / S: 3002.2 | delta: -0.2188(-0.0018) | Adj: -2.44%, Vol: 1.00, Thr: 0.0328 | PnL: -6.27 | TotPnL: -6.27
1766997960751, 2025-12-29 09:46:00,751 - [IDLE] BNB | Px: 859.90 | M: 859.3 | B: 862.8 / S: 855.8 | delta: -1.0558(-0.0278) | Adj: +5.55%, Vol: 1.00, Thr: 0.1584 | PnL: 6.72 | TotPnL: 6.72
1766997990732, 2025-12-29 09:46:30,732 - [IDLE] ETH | Px: 3016.35 | M: 3014.5 | B: 3029.1 / S: 3000.0 | delta: -0.2211(-0.0041) | Adj: -2.39%, Vol: 1.00, Thr: 0.0332 | PnL: -6.03 | TotPnL: -6.03
1766997990734, 2025-12-29 09:46:30,734 - [IDLE] BNB | Px: 859.70 | M: 858.9 | B: 862.4 / S: 855.3 | delta: -1.0663(-0.0383) | Adj: +5.66%, Vol: 1.00, Thr: 0.1599 | PnL: 6.95 | TotPnL: 6.95
1766998020261, 2025-12-29 09:47:00,261 - [IDLE] ETH | Px: 3016.65 | M: 3015.1 | B: 3029.6 / S: 3000.6 | delta: -0.2204(-0.0034) | Adj: -2.40%, Vol: 1.00, Thr: 0.0331 | PnL: -6.12 | TotPnL: -6.12
1766998020263, 2025-12-29 09:47:00,263 - [IDLE] BNB | Px: 859.60 | M: 858.6 | B: 862.2 / S: 855.1 | delta: -1.0717(-0.0437) | Adj: +5.72%, Vol: 1.00, Thr: 0.1608 | PnL: 6.99 | TotPnL: 6.99
1766998080698, 2025-12-29 09:48:00,698 - [IDLE] ETH | Px: 3016.85 | M: 3015.5 | B: 3030.0 / S: 3001.1 | delta: -0.2200(-0.0030) | Adj: -2.42%, Vol: 1.00, Thr: 0.0330 | PnL: -6.19 | TotPnL: -6.19
1766998080699, 2025-12-29 09:48:00,699 - [IDLE] BNB | Px: 859.68 | M: 858.8 | B: 862.3 / S: 855.3 | delta: -1.0674(-0.0394) | Adj: +5.67%, Vol: 1.00, Thr: 0.1601 | PnL: 6.97 | TotPnL: 6.97
1766998110936, 2025-12-29 09:48:30,936 - [IDLE] ETH | Px: 3017.15 | M: 3016.2 | B: 3030.6 / S: 3001.7 | delta: -0.2193(-0.0023) | Adj: -2.43%, Vol: 1.00, Thr: 0.0329 | PnL: -6.23 | TotPnL: -6.23
1766998110938, 2025-12-29 09:48:30,938 - [IDLE] BNB | Px: 859.92 | M: 859.3 | B: 862.8 / S: 855.8 | delta: -1.0550(-0.0270) | Adj: +5.54%, Vol: 1.00, Thr: 0.1583 | PnL: 6.66 | TotPnL: 6.66
1766998200510, 2025-12-29 09:50:00,510 - [IDLE] ETH | Px: 3018.55 | M: 3019.0 | B: 3033.2 / S: 3004.8 | delta: -0.2160(+0.0010) | Adj: -2.50%, Vol: 1.00, Thr: 0.0324 | PnL: -6.45 | TotPnL: -6.45
1766998200512, 2025-12-29 09:50:00,512 - [IDLE] BNB | Px: 860.27 | M: 860.1 | B: 863.5 / S: 856.7 | delta: -1.0360(-0.0080) | Adj: +5.33%, Vol: 1.00, Thr: 0.1554 | PnL: 6.39 | TotPnL: 6.39
1766998230211, 2025-12-29 09:50:30,211 - [IDLE] ETH | Px: 3017.95 | M: 3017.8 | B: 3032.1 / S: 3003.5 | delta: -0.2174(-0.0004) | Adj: -2.47%, Vol: 1.00, Thr: 0.0326 | PnL: -6.40 | TotPnL: -6.40
1766998230212, 2025-12-29 09:50:30,212 - [IDLE] BNB | Px: 860.10 | M: 859.7 | B: 863.2 / S: 856.3 | delta: -1.0449(-0.0169) | Adj: +5.43%, Vol: 1.00, Thr: 0.1567 | PnL: 6.53 | TotPnL: 6.53
1766998260457, 2025-12-29 09:51:00,457 - [IDLE] ETH | Px: 3016.65 | M: 3015.1 | B: 3029.6 / S: 3000.6 | delta: -0.2204(-0.0034) | Adj: -2.40%, Vol: 1.00, Thr: 0.0331 | PnL: -6.12 | TotPnL: -6.12
1766998260459, 2025-12-29 09:51:00,459 - [IDLE] BNB | Px: 859.94 | M: 859.4 | B: 862.9 / S: 855.9 | delta: -1.0534(-0.0254) | Adj: +5.52%, Vol: 1.00, Thr: 0.1580 | PnL: 6.79 | TotPnL: 6.79
1766998290182, 2025-12-29 09:51:30,182 - [IDLE] ETH | Px: 3015.65 | M: 3013.1 | B: 3027.8 / S: 2998.5 | delta: -0.2228(-0.0058) | Adj: -2.35%, Vol: 1.00, Thr: 0.0334 | PnL: -5.90 | TotPnL: -5.90
1766998290183, 2025-12-29 09:51:30,183 - [IDLE] BNB | Px: 859.72 | M: 858.9 | B: 862.4 / S: 855.4 | delta: -1.0652(-0.0372) | Adj: +5.65%, Vol: 1.00, Thr: 0.1598 | PnL: 6.99 | TotPnL: 6.99
1766998320319, 2025-12-29 09:52:00,319 - [IDLE] ETH | Px: 3015.25 | M: 3012.3 | B: 3027.0 / S: 2997.6 | delta: -0.2237(-0.0067) | Adj: -2.33%, Vol: 1.00, Thr: 0.0336 | PnL: -5.88 | TotPnL: -5.88
1766998320322, 2025-12-29 09:52:00,322 - [IDLE] BNB | Px: 859.61 | M: 858.7 | B: 862.2 / S: 855.1 | delta: -1.0714(-0.0434) | Adj: +5.72%, Vol: 1.00, Thr: 0.1607 | PnL: 7.01 | TotPnL: 7.01
1766998350138, 2025-12-29 09:52:30,138 - [IDLE] ETH | Px: 3013.70 | M: 3009.2 | B: 3024.1 / S: 2994.2 | delta: -0.2274(-0.0104) | Adj: -2.25%, Vol: 1.00, Thr: 0.0341 | PnL: -5.47 | TotPnL: -5.47
1766998350141, 2025-12-29 09:52:30,141 - [IDLE] BNB | Px: 859.30 | M: 858.0 | B: 861.6 / S: 854.4 | delta: -1.0884(-0.0604) | Adj: +5.90%, Vol: 1.00, Thr: 0.1633 | PnL: 7.42 | TotPnL: 7.42
1766998410259, 2025-12-29 09:53:30,259 - [IDLE] ETH | Px: 3012.45 | M: 3006.6 | B: 3021.7 / S: 2991.5 | delta: -0.2303(-0.0133) | Adj: -2.19%, Vol: 1.00, Thr: 0.0345 | PnL: -5.17 | TotPnL: -5.17
1766998410261, 2025-12-29 09:53:30,261 - [IDLE] BNB | Px: 859.10 | M: 857.5 | B: 861.2 / S: 853.9 | delta: -1.0987(-0.0707) | Adj: +6.01%, Vol: 1.00, Thr: 0.1648 | PnL: 7.67 | TotPnL: 7.67
1766998440833, 2025-12-29 09:54:00,833 - [IDLE] ETH | Px: 3012.45 | M: 3006.6 | B: 3021.7 / S: 2991.5 | delta: -0.2303(-0.0133) | Adj: -2.19%, Vol: 1.11, Thr: 0.0345 | PnL: -5.25 | TotPnL: -5.25
1766998440835, 2025-12-29 09:54:00,835 - [IDLE] BNB | Px: 859.04 | M: 857.4 | B: 861.1 / S: 853.8 | delta: -1.1019(-0.0739) | Adj: +6.05%, Vol: 1.00, Thr: 0.1653 | PnL: 7.71 | TotPnL: 7.71
1766998500401, 2025-12-29 09:55:00,401 - [IDLE] ETH | Px: 3011.75 | M: 3005.2 | B: 3020.4 / S: 2990.0 | delta: -0.2320(-0.0150) | Adj: -2.15%, Vol: 1.42, Thr: 0.0348 | PnL: -5.04 | TotPnL: -5.04
1766998500403, 2025-12-29 09:55:00,403 - [IDLE] BNB | Px: 858.65 | M: 856.5 | B: 860.3 / S: 852.8 | delta: -1.1234(-0.0954) | Adj: +6.28%, Vol: 1.00, Thr: 0.1685 | PnL: 8.01 | TotPnL: 8.01
1766998560662, 2025-12-29 09:56:00,662 - [IDLE] ETH | Px: 3012.95 | M: 3007.6 | B: 3022.7 / S: 2992.6 | delta: -0.2291(-0.0121) | Adj: -2.21%, Vol: 1.51, Thr: 0.0344 | PnL: -5.30 | TotPnL: -5.30
1766998560665, 2025-12-29 09:56:00,665 - [IDLE] BNB | Px: 858.76 | M: 856.8 | B: 860.5 / S: 853.1 | delta: -1.1177(-0.0897) | Adj: +6.21%, Vol: 1.12, Thr: 0.1677 | PnL: 7.95 | TotPnL: 7.95
1766998650910, 2025-12-29 09:57:30,910 - [IDLE] ETH | Px: 3014.15 | M: 3010.1 | B: 3024.9 / S: 2995.2 | delta: -0.2263(-0.0093) | Adj: -2.28%, Vol: 1.51, Thr: 0.0339 | PnL: -5.58 | TotPnL: -5.58
1766998650912, 2025-12-29 09:57:30,912 - [IDLE] BNB | Px: 859.00 | M: 857.3 | B: 861.0 / S: 853.7 | delta: -1.1046(-0.0766) | Adj: +6.08%, Vol: 1.20, Thr: 0.1657 | PnL: 7.67 | TotPnL: 7.67
1766998770939, 2025-12-29 09:59:30,939 - [IDLE] ETH | Px: 3013.55 | M: 3008.9 | B: 3023.8 / S: 2993.9 | delta: -0.2277(-0.0107) | Adj: -2.25%, Vol: 1.25, Thr: 0.0342 | PnL: -5.40 | TotPnL: -5.40
1766998770942, 2025-12-29 09:59:30,942 - [IDLE] BNB | Px: 858.72 | M: 856.7 | B: 860.4 / S: 853.0 | delta: -1.1196(-0.0916) | Adj: +6.24%, Vol: 1.18, Thr: 0.1679 | PnL: 8.03 | TotPnL: 8.03
1766998800146, 2025-12-29 10:00:00,146 - [IDLE] ETH | Px: 3013.25 | M: 3008.2 | B: 3023.2 / S: 2993.3 | delta: -0.2284(-0.0114) | Adj: -2.23%, Vol: 1.07, Thr: 0.0343 | PnL: -5.36 | TotPnL: -5.36
1766998800147, 2025-12-29 10:00:00,147 - [IDLE] BNB | Px: 858.70 | M: 856.7 | B: 860.4 / S: 853.0 | delta: -1.1204(-0.0924) | Adj: +6.24%, Vol: 1.05, Thr: 0.1681 | PnL: 8.02 | TotPnL: 8.02
1766998920531, 2025-12-29 10:02:00,531 - [IDLE] ETH | Px: 3012.25 | M: 3006.2 | B: 3021.4 / S: 2991.1 | delta: -0.2308(-0.0138) | Adj: -2.18%, Vol: 1.00, Thr: 0.0346 | PnL: -5.17 | TotPnL: -5.17
1766998920533, 2025-12-29 10:02:00,533 - [IDLE] BNB | Px: 858.34 | M: 855.9 | B: 859.6 / S: 852.1 | delta: -1.1400(-0.1120) | Adj: +6.45%, Vol: 1.00, Thr: 0.1710 | PnL: 8.38 | TotPnL: 8.38
1766998980197, 2025-12-29 10:03:00,197 - [IDLE] ETH | Px: 3011.35 | M: 3004.4 | B: 3019.7 / S: 2989.1 | delta: -0.2329(-0.0159) | Adj: -2.13%, Vol: 1.00, Thr: 0.0349 | PnL: -4.93 | TotPnL: -4.93
1766998980200, 2025-12-29 10:03:00,200 - [IDLE] BNB | Px: 857.86 | M: 854.8 | B: 858.7 / S: 851.0 | delta: -1.1668(-0.1388) | Adj: +6.74%, Vol: 1.00, Thr: 0.1750 | PnL: 8.85 | TotPnL: 8.85
1766999070388, 2025-12-29 10:04:30,388 - [IDLE] ETH | Px: 3012.95 | M: 3007.6 | B: 3022.7 / S: 2992.6 | delta: -0.2291(-0.0121) | Adj: -2.21%, Vol: 1.00, Thr: 0.0344 | PnL: -5.23 | TotPnL: -5.23
1766999070389, 2025-12-29 10:04:30,389 - [IDLE] BNB | Px: 857.96 | M: 855.0 | B: 858.9 / S: 851.2 | delta: -1.1608(-0.1328) | Adj: +6.68%, Vol: 1.00, Thr: 0.1741 | PnL: 8.79 | TotPnL: 8.79
1766999100672, 2025-12-29 10:05:00,672 - [IDLE] ETH | Px: 3013.25 | M: 3008.2 | B: 3023.2 / S: 2993.3 | delta: -0.2284(-0.0114) | Adj: -2.23%, Vol: 1.00, Thr: 0.0343 | PnL: -5.34 | TotPnL: -5.34
1766999100673, 2025-12-29 10:05:00,673 - [IDLE] BNB | Px: 858.04 | M: 855.2 | B: 859.0 / S: 851.4 | delta: -1.1570(-0.1290) | Adj: +6.63%, Vol: 1.00, Thr: 0.1735 | PnL: 8.71 | TotPnL: 8.71
1766999211165, 2025-12-29 10:06:51,165 - [WARN] LARGE HEDGE: 0.1758 > 0.0080 (x5.0)
1766999211520, 2025-12-29 10:06:51,520 - [TRIG] Net BNB: SELL 0.1758 | Tgt: -1.2038 / Cur: -1.0280 | Thresh: 0.0080
1766999211522, 2025-12-29 10:06:51,522 - [ORDER] IOC BNB SELL 0.175 @ 856.26
1766999213606, 2025-12-29 10:06:53,606 - Order filled immediately.
1766999213607, 2025-12-29 10:06:53,607 - [SHADOW] Created Maker SELL @ 857.15
1766999213607, 2025-12-29 10:06:53,607 - Sleeping 5s to allow position update...
1766999220453, 2025-12-29 10:07:00,453 - [IDLE] ETH | Px: 3009.85 | M: 3001.4 | B: 3016.8 / S: 2985.9 | delta: -0.2365(-0.0195) | Adj: -2.05%, Vol: 1.00, Thr: 0.0355 | PnL: -4.65 | TotPnL: -4.65
1766999220456, 2025-12-29 10:07:00,456 - [IDLE] BNB | Px: 857.15 | M: 857.1 | B: 857.3 / S: 856.9 | delta: -1.2057(-0.0027) | Adj: +7.15%, Vol: 1.04, Thr: 0.0080 | PnL: 9.57 | TotPnL: 9.57
1766999250312, 2025-12-29 10:07:30,312 - [IDLE] ETH | Px: 3008.55 | M: 2998.7 | B: 3014.4 / S: 2983.0 | delta: -0.2395(-0.0225) | Adj: -1.99%, Vol: 1.00, Thr: 0.0359 | PnL: -4.38 | TotPnL: -4.38
1766999250314, 2025-12-29 10:07:30,314 - [IDLE] BNB | Px: 857.00 | M: 856.8 | B: 856.9 / S: 856.6 | delta: -1.2137(-0.0107) | Adj: +7.23%, Vol: 1.11, Thr: 0.0080 | PnL: 9.91 | TotPnL: 9.91
1766999277600, 2025-12-29 10:07:57,600 - [TRIG] Net BNB: SELL 0.0093 | Tgt: -1.2123 / Cur: -1.2030 | Thresh: 0.0080
1766999285895, 2025-12-29 10:08:05,895 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999288065, 2025-12-29 10:08:08,065 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999290417, 2025-12-29 10:08:10,417 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999292566, 2025-12-29 10:08:12,566 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999295191, 2025-12-29 10:08:15,191 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999297313, 2025-12-29 10:08:17,313 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999299381, 2025-12-29 10:08:19,381 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999301630, 2025-12-29 10:08:21,630 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999303728, 2025-12-29 10:08:23,728 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999306239, 2025-12-29 10:08:26,239 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999308393, 2025-12-29 10:08:28,393 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999310241, 2025-12-29 10:08:30,241 - [IDLE] ETH | Px: 3008.25 | M: 2998.1 | B: 3013.8 / S: 2982.4 | delta: -0.2402(-0.0232) | Adj: -1.97%, Vol: 1.05, Thr: 0.0360 | PnL: -4.32 | TotPnL: -4.32
1766999310506, 2025-12-29 10:08:30,506 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999310507, 2025-12-29 10:08:30,507 - [IDLE] BNB | Px: 857.04 | M: 856.8 | B: 857.0 / S: 856.7 | delta: -1.2121(-0.0091) | Adj: +7.22%, Vol: 1.27, Thr: 0.0080 | PnL: 9.72 | TotPnL: 9.72
1766999312672, 2025-12-29 10:08:32,672 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999315265, 2025-12-29 10:08:35,265 - [TRIG] Net BNB: SELL 0.0091 | Tgt: -1.2121 / Cur: -1.2030 | Thresh: 0.0080
1766999340113, 2025-12-29 10:09:00,113 - [IDLE] ETH | Px: 3008.95 | M: 2999.5 | B: 3015.2 / S: 2983.9 | delta: -0.2386(-0.0216) | Adj: -2.01%, Vol: 1.14, Thr: 0.0358 | PnL: -4.45 | TotPnL: -4.45
1766999340115, 2025-12-29 10:09:00,115 - [IDLE] BNB | Px: 857.20 | M: 857.2 | B: 861.2 / S: 853.2 | delta: -1.2032(-0.0002) | Adj: +7.12%, Vol: 1.29, Thr: 0.1805 | PnL: 9.51 | TotPnL: 9.51
1766999370458, 2025-12-29 10:09:30,458 - [IDLE] ETH | Px: 3008.15 | M: 2997.9 | B: 3013.6 / S: 2982.2 | delta: -0.2405(-0.0235) | Adj: -1.97%, Vol: 1.21, Thr: 0.0361 | PnL: -4.28 | TotPnL: -4.28
1766999370459, 2025-12-29 10:09:30,459 - [IDLE] BNB | Px: 857.08 | M: 856.9 | B: 857.1 / S: 856.8 | delta: -1.2093(-0.0063) | Adj: +7.19%, Vol: 1.28, Thr: 0.0080 | PnL: 9.65 | TotPnL: 9.65
1766999417106, 2025-12-29 10:10:17,106 - Stopping...
1766999426067, 2025-12-29 10:10:26,067 - [UNIFIED] Master Hedger initialized. Agent: 0xf94D30610B524D7FFF01d5062bE20e0d96b09Ae6
1766999426068, 2025-12-29 10:10:26,068 - Starting Unified Hedger Loop...
1766999426639, 2025-12-29 10:10:26,639 - === HEDGER CONFIGURATION ===
1766999426640, 2025-12-29 10:10:26,640 - --- ETH ---
1766999426640, 2025-12-29 10:10:26,640 - MONITOR_INTERVAL_SECONDS: 60
1766999426641, 2025-12-29 10:10:26,641 - CLOSE_POSITION_ENABLED: True
1766999426642, 2025-12-29 10:10:26,642 - OPEN_POSITION_ENABLED: True
1766999426642, 2025-12-29 10:10:26,642 - REBALANCE_ON_CLOSE_BELOW_RANGE: True
1766999426643, 2025-12-29 10:10:26,643 - TARGET_INVESTMENT_AMOUNT: 200
1766999426643, 2025-12-29 10:10:26,643 - INITIAL_HEDGE_CAPITAL: 1000
1766999426644, 2025-12-29 10:10:26,644 - VALUE_REFERENCE: USD
1766999426644, 2025-12-29 10:10:26,644 - WRAPPED_NATIVE_ADDRESS: 0x4200000000000000000000000000000000000006
1766999426645, 2025-12-29 10:10:26,645 - RANGE_WIDTH_PCT: 0.10
1766999426645, 2025-12-29 10:10:26,645 - SLIPPAGE_TOLERANCE: 0.02
1766999426646, 2025-12-29 10:10:26,646 - TRANSACTION_TIMEOUT_SECONDS: 30
1766999426646, 2025-12-29 10:10:26,646 - MIN_HEDGE_THRESHOLD: 0.01
1766999426647, 2025-12-29 10:10:26,647 - CHECK_INTERVAL: 1
1766999426647, 2025-12-29 10:10:26,647 - LEVERAGE: 5
1766999426647, 2025-12-29 10:10:26,647 - ZONE_BOTTOM_HEDGE_LIMIT: 1.0
1766999426648, 2025-12-29 10:10:26,648 - ZONE_CLOSE_START: 10.0
1766999426648, 2025-12-29 10:10:26,648 - ZONE_CLOSE_END: 11.0
1766999426648, 2025-12-29 10:10:26,648 - ZONE_TOP_HEDGE_START: 10.0
1766999426649, 2025-12-29 10:10:26,649 - PRICE_BUFFER_PCT: 0.0015
1766999426649, 2025-12-29 10:10:26,649 - MIN_ORDER_VALUE_USD: 10.0
1766999426650, 2025-12-29 10:10:26,650 - DYNAMIC_THRESHOLD_MULTIPLIER: 1.2
1766999426650, 2025-12-29 10:10:26,650 - MIN_TIME_BETWEEN_TRADES: 60
1766999426651, 2025-12-29 10:10:26,651 - MAX_HEDGE_MULTIPLIER: 1.25
1766999426651, 2025-12-29 10:10:26,651 - BASE_REBALANCE_THRESHOLD_PCT: 0.15
1766999426651, 2025-12-29 10:10:26,651 - EDGE_PROXIMITY_PCT: 0.04
1766999426652, 2025-12-29 10:10:26,652 - VELOCITY_THRESHOLD_PCT: 0.0005
1766999426652, 2025-12-29 10:10:26,652 - POSITION_OPEN_EDGE_PROXIMITY_PCT: 0.06
1766999426653, 2025-12-29 10:10:26,653 - POSITION_CLOSED_EDGE_PROXIMITY_PCT: 0.025
1766999426653, 2025-12-29 10:10:26,653 - LARGE_HEDGE_MULTIPLIER: 5.0
1766999426654, 2025-12-29 10:10:26,654 - ENABLE_EDGE_CLEANUP: True
1766999426654, 2025-12-29 10:10:26,654 - EDGE_CLEANUP_MARGIN_PCT: 0.02
1766999426655, 2025-12-29 10:10:26,655 - MAKER_ORDER_TIMEOUT: 600
1766999426655, 2025-12-29 10:10:26,655 - SHADOW_ORDER_TIMEOUT: 600
1766999426656, 2025-12-29 10:10:26,656 - ENABLE_FISHING: False
1766999426656, 2025-12-29 10:10:26,656 - FISHING_ORDER_SIZE_PCT: 0.10
1766999426657, 2025-12-29 10:10:26,657 - sz_decimals: 4
1766999426657, 2025-12-29 10:10:26,657 - NAME: Aerodrome/Uni (Base) - WETH/cbBTC
1766999426658, 2025-12-29 10:10:26,658 - COIN_SYMBOL: ETH
1766999426658, 2025-12-29 10:10:26,658 - RPC_ENV_VAR: BASE_RPC_URL
1766999426659, 2025-12-29 10:10:26,659 - NPM_ADDRESS: 0x0000000000000000000000000000000000000000
1766999426659, 2025-12-29 10:10:26,659 - ROUTER_ADDRESS: 0x0000000000000000000000000000000000000000
1766999426660, 2025-12-29 10:10:26,660 - TOKEN_A_ADDRESS: 0x4200000000000000000000000000000000000006
1766999426661, 2025-12-29 10:10:26,661 - TOKEN_B_ADDRESS: 0xcbB7C915AB58735a1391B9fE18541b4d8926D412
1766999426661, 2025-12-29 10:10:26,661 - POOL_FEE: 3000
1766999426662, 2025-12-29 10:10:26,662 - --- BNB ---
1766999426662, 2025-12-29 10:10:26,662 - MONITOR_INTERVAL_SECONDS: 60
1766999426663, 2025-12-29 10:10:26,663 - CLOSE_POSITION_ENABLED: True
1766999426663, 2025-12-29 10:10:26,663 - OPEN_POSITION_ENABLED: True
1766999426663, 2025-12-29 10:10:26,663 - REBALANCE_ON_CLOSE_BELOW_RANGE: True
1766999426664, 2025-12-29 10:10:26,664 - TARGET_INVESTMENT_AMOUNT: 1000
1766999426664, 2025-12-29 10:10:26,664 - INITIAL_HEDGE_CAPITAL: 1000
1766999426664, 2025-12-29 10:10:26,664 - VALUE_REFERENCE: USD
1766999426665, 2025-12-29 10:10:26,665 - WRAPPED_NATIVE_ADDRESS: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
1766999426665, 2025-12-29 10:10:26,665 - RANGE_WIDTH_PCT: 0.015
1766999426665, 2025-12-29 10:10:26,665 - SLIPPAGE_TOLERANCE: 0.02
1766999426666, 2025-12-29 10:10:26,666 - TRANSACTION_TIMEOUT_SECONDS: 30
1766999426666, 2025-12-29 10:10:26,666 - MIN_HEDGE_THRESHOLD: 0.05
1766999426667, 2025-12-29 10:10:26,667 - CHECK_INTERVAL: 1
1766999426667, 2025-12-29 10:10:26,667 - LEVERAGE: 5
1766999426667, 2025-12-29 10:10:26,667 - ZONE_BOTTOM_HEDGE_LIMIT: 1.0
1766999426668, 2025-12-29 10:10:26,668 - ZONE_CLOSE_START: 10.0
1766999426668, 2025-12-29 10:10:26,668 - ZONE_CLOSE_END: 11.0
1766999426668, 2025-12-29 10:10:26,668 - ZONE_TOP_HEDGE_START: 10.0
1766999426669, 2025-12-29 10:10:26,669 - PRICE_BUFFER_PCT: 0.0015
1766999426669, 2025-12-29 10:10:26,669 - MIN_ORDER_VALUE_USD: 10.0
1766999426669, 2025-12-29 10:10:26,669 - DYNAMIC_THRESHOLD_MULTIPLIER: 1.2
1766999426670, 2025-12-29 10:10:26,670 - MIN_TIME_BETWEEN_TRADES: 60
1766999426670, 2025-12-29 10:10:26,670 - MAX_HEDGE_MULTIPLIER: 1.25
1766999426671, 2025-12-29 10:10:26,671 - BASE_REBALANCE_THRESHOLD_PCT: 0.25
1766999426671, 2025-12-29 10:10:26,671 - EDGE_PROXIMITY_PCT: 0.04
1766999426671, 2025-12-29 10:10:26,671 - VELOCITY_THRESHOLD_PCT: 0.0005
1766999426672, 2025-12-29 10:10:26,672 - POSITION_OPEN_EDGE_PROXIMITY_PCT: 0.06
1766999426672, 2025-12-29 10:10:26,672 - POSITION_CLOSED_EDGE_PROXIMITY_PCT: 0.025
1766999426672, 2025-12-29 10:10:26,672 - LARGE_HEDGE_MULTIPLIER: 5.0
1766999426673, 2025-12-29 10:10:26,673 - ENABLE_EDGE_CLEANUP: True
1766999426673, 2025-12-29 10:10:26,673 - EDGE_CLEANUP_MARGIN_PCT: 0.02
1766999426673, 2025-12-29 10:10:26,673 - MAKER_ORDER_TIMEOUT: 600
1766999426674, 2025-12-29 10:10:26,674 - SHADOW_ORDER_TIMEOUT: 600
1766999426674, 2025-12-29 10:10:26,674 - ENABLE_FISHING: False
1766999426674, 2025-12-29 10:10:26,674 - FISHING_ORDER_SIZE_PCT: 0.10
1766999426675, 2025-12-29 10:10:26,675 - sz_decimals: 3
1766999426675, 2025-12-29 10:10:26,675 - NAME: PancakeSwap V3 (BNB Chain) - BNB/USDT
1766999426676, 2025-12-29 10:10:26,676 - COIN_SYMBOL: BNB
1766999426676, 2025-12-29 10:10:26,676 - RPC_ENV_VAR: BNB_RPC_URL
1766999426677, 2025-12-29 10:10:26,677 - NPM_ADDRESS: 0x46A15B0b27311cedF172AB29E4f4766fbE7F4364
1766999426677, 2025-12-29 10:10:26,677 - ROUTER_ADDRESS: 0x1b81D678ffb9C0263b24A97847620C99d213eB14
1766999426677, 2025-12-29 10:10:26,677 - TOKEN_A_ADDRESS: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
1766999426678, 2025-12-29 10:10:26,678 - TOKEN_B_ADDRESS: 0x55d398326f99059fF775485246999027B3197955
1766999426678, 2025-12-29 10:10:26,678 - POOL_FEE: 100
1766999426678, 2025-12-29 10:10:26,678 - ============================
1766999427980, 2025-12-29 10:10:27,980 - [STARTUP] Skipping Ghost Cleanup for ETH (Grace Period)
1766999427980, 2025-12-29 10:10:27,980 - [STARTUP] Skipping Ghost Cleanup for BNB (Grace Period)
1766999428984, 2025-12-29 10:10:28,984 - [STRAT] Init 6153292 (BNB) | Range: 856.6782-882.4136
1766999428986, 2025-12-29 10:10:28,986 - [STRAT] Init 5182179 (ETH) | Range: 2827.096-3118.1664
1766999430021, 2025-12-29 10:10:30,021 - [IDLE] ETH | Px: 3009.45 | M: 3000.5 | B: 3016.1 / S: 2985.0 | delta: -0.2374(-0.0204) | Adj: -2.03%, Vol: 1.00, Thr: 0.0356 | PnL: -4.62 | TotPnL: -4.62
1766999430023, 2025-12-29 10:10:30,023 - [IDLE] BNB | Px: 857.72 | M: 858.3 | B: 862.2 / S: 854.5 | delta: -1.1745(+0.0285) | Adj: +6.82%, Vol: 1.00, Thr: 0.1762 | PnL: 8.94 | TotPnL: 8.94
1766999490692, 2025-12-29 10:11:30,692 - [IDLE] ETH | Px: 3010.55 | M: 3002.8 | B: 3018.2 / S: 2987.4 | delta: -0.2348(-0.0178) | Adj: -2.09%, Vol: 1.00, Thr: 0.0352 | PnL: -4.82 | TotPnL: -4.82
1766999490693, 2025-12-29 10:11:30,693 - [IDLE] BNB | Px: 857.97 | M: 858.9 | B: 862.7 / S: 855.1 | delta: -1.1605(+0.0425) | Adj: +6.67%, Vol: 1.00, Thr: 0.1741 | PnL: 8.62 | TotPnL: 8.62
1766999550821, 2025-12-29 10:12:30,821 - [IDLE] ETH | Px: 3009.95 | M: 3001.6 | B: 3017.0 / S: 2986.1 | delta: -0.2362(-0.0192) | Adj: -2.06%, Vol: 1.00, Thr: 0.0354 | PnL: -4.67 | TotPnL: -4.67
1766999550823, 2025-12-29 10:12:30,823 - [IDLE] BNB | Px: 857.50 | M: 857.9 | B: 861.8 / S: 854.0 | delta: -1.1861(+0.0169) | Adj: +6.94%, Vol: 1.00, Thr: 0.1779 | PnL: 9.06 | TotPnL: 9.06
1766999610366, 2025-12-29 10:13:30,366 - [IDLE] ETH | Px: 3009.95 | M: 3001.6 | B: 3017.0 / S: 2986.1 | delta: -0.2362(-0.0192) | Adj: -2.06%, Vol: 1.00, Thr: 0.0354 | PnL: -4.69 | TotPnL: -4.69
1766999610368, 2025-12-29 10:13:30,368 - [IDLE] BNB | Px: 857.60 | M: 858.1 | B: 862.0 / S: 854.2 | delta: -1.1809(+0.0221) | Adj: +6.89%, Vol: 1.00, Thr: 0.1771 | PnL: 9.06 | TotPnL: 9.06
1766999640818, 2025-12-29 10:14:00,818 - [IDLE] ETH | Px: 3010.55 | M: 3002.8 | B: 3018.2 / S: 2987.4 | delta: -0.2348(-0.0178) | Adj: -2.09%, Vol: 1.00, Thr: 0.0352 | PnL: -4.80 | TotPnL: -4.80
1766999640820, 2025-12-29 10:14:00,820 - [IDLE] BNB | Px: 857.59 | M: 858.1 | B: 862.0 / S: 854.2 | delta: -1.1814(+0.0216) | Adj: +6.89%, Vol: 1.00, Thr: 0.1772 | PnL: 9.06 | TotPnL: 9.06
1766999700810, 2025-12-29 10:15:00,810 - [IDLE] ETH | Px: 3010.55 | M: 3002.8 | B: 3018.2 / S: 2987.4 | delta: -0.2348(-0.0178) | Adj: -2.09%, Vol: 1.00, Thr: 0.0352 | PnL: -4.75 | TotPnL: -4.75
1766999700812, 2025-12-29 10:15:00,812 - [IDLE] BNB | Px: 857.68 | M: 858.3 | B: 862.1 / S: 854.4 | delta: -1.1767(+0.0263) | Adj: +6.84%, Vol: 1.00, Thr: 0.1765 | PnL: 8.95 | TotPnL: 8.95
1766999790664, 2025-12-29 10:16:30,664 - [IDLE] ETH | Px: 3009.75 | M: 3001.1 | B: 3016.7 / S: 2985.6 | delta: -0.2367(-0.0197) | Adj: -2.05%, Vol: 1.00, Thr: 0.0355 | PnL: -4.62 | TotPnL: -4.62
1766999790666, 2025-12-29 10:16:30,666 - [IDLE] BNB | Px: 857.72 | M: 858.4 | B: 862.2 / S: 854.5 | delta: -1.1740(+0.0290) | Adj: +6.82%, Vol: 1.00, Thr: 0.1761 | PnL: 8.88 | TotPnL: 8.88
1766999880731, 2025-12-29 10:18:00,731 - [IDLE] ETH | Px: 3009.15 | M: 2999.9 | B: 3015.5 / S: 2984.3 | delta: -0.2381(-0.0211) | Adj: -2.02%, Vol: 1.00, Thr: 0.0357 | PnL: -4.49 | TotPnL: -4.49
1766999880734, 2025-12-29 10:18:00,734 - [IDLE] BNB | Px: 857.40 | M: 857.7 | B: 861.6 / S: 853.7 | delta: -1.1916(+0.0114) | Adj: +7.00%, Vol: 1.00, Thr: 0.1787 | PnL: 9.26 | TotPnL: 9.26
1766999940148, 2025-12-29 10:19:00,148 - [IDLE] ETH | Px: 3010.15 | M: 3002.0 | B: 3017.4 / S: 2986.5 | delta: -0.2357(-0.0187) | Adj: -2.07%, Vol: 1.00, Thr: 0.0354 | PnL: -4.73 | TotPnL: -4.73
1766999940150, 2025-12-29 10:19:00,150 - [IDLE] BNB | Px: 857.82 | M: 858.6 | B: 862.4 / S: 854.7 | delta: -1.1690(+0.0340) | Adj: +6.76%, Vol: 1.00, Thr: 0.1754 | PnL: 8.82 | TotPnL: 8.82
1767000000185, 2025-12-29 10:20:00,185 - [IDLE] ETH | Px: 3010.75 | M: 3003.2 | B: 3018.5 / S: 2987.8 | delta: -0.2343(-0.0173) | Adj: -2.10%, Vol: 1.00, Thr: 0.0351 | PnL: -4.84 | TotPnL: -4.84
1767000000188, 2025-12-29 10:20:00,188 - [IDLE] BNB | Px: 857.80 | M: 858.5 | B: 862.4 / S: 854.7 | delta: -1.1701(+0.0329) | Adj: +6.77%, Vol: 1.00, Thr: 0.1755 | PnL: 8.76 | TotPnL: 8.76
1767000210575, 2025-12-29 10:23:30,575 - [IDLE] ETH | Px: 3011.35 | M: 3004.4 | B: 3019.7 / S: 2989.1 | delta: -0.2329(-0.0159) | Adj: -2.13%, Vol: 1.00, Thr: 0.0349 | PnL: -4.97 | TotPnL: -4.97
1767000210578, 2025-12-29 10:23:30,578 - [IDLE] BNB | Px: 857.82 | M: 858.6 | B: 862.4 / S: 854.7 | delta: -1.1690(+0.0340) | Adj: +6.76%, Vol: 1.00, Thr: 0.1754 | PnL: 8.78 | TotPnL: 8.78
1767000270441, 2025-12-29 10:24:30,441 - [IDLE] ETH | Px: 3013.35 | M: 3008.5 | B: 3023.4 / S: 2993.5 | delta: -0.2282(-0.0112) | Adj: -2.23%, Vol: 1.00, Thr: 0.0342 | PnL: -5.40 | TotPnL: -5.40
1767000270443, 2025-12-29 10:24:30,443 - [IDLE] BNB | Px: 857.90 | M: 858.7 | B: 862.6 / S: 854.9 | delta: -1.1646(+0.0384) | Adj: +6.72%, Vol: 1.00, Thr: 0.1747 | PnL: 8.67 | TotPnL: 8.67
1767000330307, 2025-12-29 10:25:30,307 - [IDLE] ETH | Px: 3012.55 | M: 3006.8 | B: 3021.9 / S: 2991.7 | delta: -0.2301(-0.0131) | Adj: -2.19%, Vol: 1.00, Thr: 0.0345 | PnL: -5.23 | TotPnL: -5.23
1767000330309, 2025-12-29 10:25:30,309 - [IDLE] BNB | Px: 857.60 | M: 858.1 | B: 862.0 / S: 854.2 | delta: -1.1811(+0.0219) | Adj: +6.89%, Vol: 1.00, Thr: 0.1772 | PnL: 9.04 | TotPnL: 9.04
1767000390450, 2025-12-29 10:26:30,450 - [IDLE] ETH | Px: 3008.55 | M: 2998.7 | B: 3014.4 / S: 2983.0 | delta: -0.2395(-0.0225) | Adj: -1.99%, Vol: 1.00, Thr: 0.0359 | PnL: -4.49 | TotPnL: -4.49
1767000390452, 2025-12-29 10:26:30,452 - [IDLE] BNB | Px: 857.30 | M: 857.4 | B: 861.4 / S: 853.5 | delta: -1.1977(+0.0053) | Adj: +7.07%, Vol: 1.00, Thr: 0.1797 | PnL: 9.33 | TotPnL: 9.33
1767000450745, 2025-12-29 10:27:30,745 - [IDLE] ETH | Px: 3004.85 | M: 2991.2 | B: 3007.4 / S: 2975.0 | delta: -0.2483(-0.0313) | Adj: -1.80%, Vol: 1.29, Thr: 0.0372 | PnL: -3.52 | TotPnL: -3.52
1767000450748, 2025-12-29 10:27:30,748 - [IDLE] BNB | Px: 857.30 | M: 857.4 | B: 861.4 / S: 853.5 | delta: -1.1971(+0.0059) | Adj: +7.06%, Vol: 1.00, Thr: 0.1796 | PnL: 9.53 | TotPnL: 9.53
1767000600237, 2025-12-29 10:30:00,237 - [IDLE] ETH | Px: 3006.75 | M: 2995.1 | B: 3011.0 / S: 2979.1 | delta: -0.2438(-0.0268) | Adj: -1.89%, Vol: 1.78, Thr: 0.0366 | PnL: -4.02 | TotPnL: -4.02
1767000600239, 2025-12-29 10:30:00,239 - [IDLE] BNB | Px: 857.62 | M: 858.1 | B: 862.0 / S: 854.3 | delta: -1.1795(+0.0235) | Adj: +6.87%, Vol: 1.00, Thr: 0.1769 | PnL: 9.08 | TotPnL: 9.08
1767000660107, 2025-12-29 10:31:00,107 - [IDLE] ETH | Px: 3006.25 | M: 2994.0 | B: 3010.1 / S: 2978.0 | delta: -0.2450(-0.0280) | Adj: -1.87%, Vol: 1.86, Thr: 0.0367 | PnL: -3.86 | TotPnL: -3.86
1767000660108, 2025-12-29 10:31:00,108 - [IDLE] BNB | Px: 857.40 | M: 857.6 | B: 861.6 / S: 853.7 | delta: -1.1922(+0.0108) | Adj: +7.01%, Vol: 1.00, Thr: 0.1788 | PnL: 9.27 | TotPnL: 9.27
1767000690915, 2025-12-29 10:31:30,915 - [IDLE] ETH | Px: 3005.15 | M: 2991.8 | B: 3008.0 / S: 2975.6 | delta: -0.2476(-0.0306) | Adj: -1.81%, Vol: 1.94, Thr: 0.0371 | PnL: -3.65 | TotPnL: -3.65
1767000690917, 2025-12-29 10:31:30,917 - [IDLE] BNB | Px: 857.56 | M: 858.0 | B: 861.9 / S: 854.1 | delta: -1.1833(+0.0197) | Adj: +6.91%, Vol: 1.00, Thr: 0.1775 | PnL: 9.01 | TotPnL: 9.01
1767000705122, 2025-12-29 10:31:45,122 - [TRIG] Net ETH: SELL 0.0397 | Tgt: -0.2567 / Cur: -0.2170 | Thresh: 0.0385
1767000705123, 2025-12-29 10:31:45,123 - [ORDER] ALO ETH SELL 0.0396 @ 3001.4
1767000707582, 2025-12-29 10:31:47,582 - Sleeping 5s to allow position update...
1767000712865, 2025-12-29 10:31:52,865 - [TRIG] Net BNB: SELL 0.0295 | Tgt: -1.2325 / Cur: -1.2030 | Thresh: 0.0080
1767000712866, 2025-12-29 10:31:52,866 - [ORDER] ALO BNB SELL 0.029 @ 856.11
1767000713605, 2025-12-29 10:31:53,605 - Sleeping 5s to allow position update...
1767000720440, 2025-12-29 10:32:00,440 - [IDLE] ETH | Px: 3002.85 | M: 3004.4 | B: 3020.9 / S: 2987.8 | delta: -0.2531(+0.0035) | Adj: -1.69%, Vol: 2.01, Thr: 0.0380 | PnL: -3.16 | TotPnL: -3.16
1767000720443, 2025-12-29 10:32:00,443 - [IDLE] BNB | Px: 856.30 | M: 856.3 | B: 856.5 / S: 856.1 | delta: -1.2327(-0.0007) | Adj: +7.50%, Vol: 1.00, Thr: 0.0080 | PnL: 10.60 | TotPnL: 10.60
1767000730199, 2025-12-29 10:32:10,199 - [STRAT] 6153292 is CLOSING -> Force Target 0
1767000730202, 2025-12-29 10:32:10,202 - [URGENT] BNB Closing Strategy -> Force Taker Exit
1767000730203, 2025-12-29 10:32:10,203 - [WARN] LARGE HEDGE: 1.2320 > 0.0080 (x5.0)
1767000730473, 2025-12-29 10:32:10,473 - [TRIG] Net BNB: BUY 1.2320 | Tgt: 0.0000 / Cur: -1.2320 | Thresh: 0.0080
1767000730474, 2025-12-29 10:32:10,474 - [ORDER] IOC BNB BUY 1.232 @ 856.95
1767000731824, 2025-12-29 10:32:11,824 - Order filled immediately.
1767000731825, 2025-12-29 10:32:11,825 - [SHADOW] Created Maker BUY @ 856.03
1767000731826, 2025-12-29 10:32:11,826 - Sleeping 5s to allow position update...
1767000737851, 2025-12-29 10:32:17,851 - Strategy 6153292 removed (Closed/Gone).

View File

@ -0,0 +1,117 @@
# CLP Strategy & Configuration Log
This document detailed information about clp position (6153292) + auto hedge on Hyperliquide.
---
## 1. Low Volatility / Weekend Optimization (Narrow Range)
**Date:** 2025-12-29
**Status:** Active
**Objective:** Further optimalization of hedging on Hyperliquide.
### 🔍 Context
* **Market Condition:** Monday, th 29th of Dec
* **Capital:** $1,000 USDC
* **Range:** +/- 1.5% (Narrow)
### ⚙️ Configuration of scripts
(See original file for full config dump)
### test results
1. clp position:
{
"type": "AUTOMATIC",
"token_id": 6153292,
"status": "CLOSED",
"target_value": 993.31,
"entry_price": 869.418,
"amount0_initial": 500.0094,
"amount1_initial": 0.5674,
"liquidity": "2284728345715808667084",
"range_upper": 882.4136,
"range_lower": 856.6782,
"token0_decimals": 18,
"token1_decimals": 18,
"timestamp_open": 1766982584,
"target_value_end": 982.48,
"timestamp_close": 1767000734
}
2. hedge transactions (from Hyperliquide)
(See original file for table)
## results of tests are not satisfactional:
1. the main problem is that the hedge doesn't cover lost value of clp pool (without earned fees) -> **-$2.23**
---
### 🚀 Analysis & Diagnosis (2025-12-29)
After reviewing the logs and transaction history, here is the breakdown of the PnL and the root cause of the slippage.
#### **1. PnL Breakdown (The "Missing" $2.23)**
* **LP Position Value Change:**
* Initial Value: ~$993.31
* Final Value: ~$982.50
* **LP Loss:** **-$10.81** (This is the Impermanent Loss + Delta Loss from holding BNB as it dropped).
* **Hedge Compensation:**
* Hedge Gross Profit: **+$10.61** (from your table).
* **Net Delta Efficiency:** The hedge covered the LP loss almost perfectly (Diff: -$0.20).
* *Conclusion:* The **Delta Calculation is CORRECT**. The math effectively neutralized the market move.
* **The Costs (The Real Leak):**
* **Trading Fees:** You paid ~$0.79 in fees on Hyperliquid (mostly from the initial Taker entry and the final Taker exit).
* **Funding Fees:** Since you were Shorting BNB for ~5 hours, and rates might have been negative (Shorts pay Longs) or just the cost of carry, the remaining discrepancy (~$1.20) is likely **Funding Costs** or slight slippage between LP exit price and Hedge exit price.
**Total Net:** -$0.20 (Delta Slippage) - $0.79 (Fees) - $1.24 (Funding/Execution Slippage) = **-$2.23**
#### **2. Execution Inefficiency (The "Panic Loop")**
The logs reveal a flaw in the execution strategy during trending moves:
1. **Drift:** Price drops, Delta drift exceeds threshold (`0.05`).
2. **Maker Attempt:** Bot places an `ALO` (Maker) order at the Bid.
3. **Timeout:** Market moves down faster than the order fills. The order sits pending (`[WAIT]`).
4. **Cancel:** Bot cancels the stale order.
5. **Drift Worsens:** The drift continues to grow as price drops further.
6. **Panic:** Eventually, `Drift > 5x Threshold` (Large Hedge).
7. **Taker Smash:** Bot forces an `IOC` (Taker) trade, paying high fees (0.035%) and eating slippage.
**Evidence:**
* Initial Entry: `[WARN] LARGE HEDGE` -> Taker (Fee: $0.21).
* Final Exit: `[URGENT] ... Force Taker Exit` -> Taker (Fee: $0.45).
* These two trades alone account for ~85% of your fee costs.
---
### 🛠️ Answers to Questions
**1. Is the calculation of hedge wrong?**
**No.** The Delta calculation is accurate. The gross profit of the hedge (+$10.61) almost exactly matched the raw value loss of the LP (-$10.81). The math works.
**2. How we can proactively fix it?**
We need to fix the **Execution Strategy** to avoid the "Wait -> Cancel -> Panic Taker" loop.
* **Soft Taker Fallback:** If a Maker order times out (e.g., after 30s), retry as Taker immediately *before* the drift becomes huge.
* **Asymmetric Compensation:** Increase the "Over-Hedge" factor. Since V3 LP accumulates "Long" exposure as price drops (Negative Gamma), we should short *more* aggressively early on.
**3. What we can do with configuration?**
We need to tune for **Narrow Ranges** (High Gamma).
#### **Recommended Config Changes**
| Parameter | Current | Recommended | Reason |
| :--- | :--- | :--- | :--- |
| `MIN_HEDGE_THRESHOLD` | `0.05` | **0.02** | Hedge smaller deviations sooner to prevent runaway gamma. |
| `LARGE_HEDGE_MULTIPLIER` | `5.0` | **2.5** | Trigger Taker/Urgent correction sooner, before the hole gets too deep. |
| `MAKER_ORDER_TIMEOUT` | `600` | **60** | Don't let orders rot for 10 minutes. Cancel and retry faster. |
| `SHADOW_ORDER_TIMEOUT` | `600` | **30** | Same as above. |
| `BASE_REBALANCE_THRESHOLD_PCT` | `0.25` | **0.15** | Tighten the percentage-based trigger. |
#### **Code Change Recommendation (Unified Hedger)**
We should update `unified_hedger.py` to:
1. **Persist Realized PnL:** Fix the bug where `_status.json` isn't updated with hedge PnL, so your logs reflect reality.
2. **Execution Fallback:** If an `ALO` order fails/cancels, decrement a counter. If it fails twice, force `IOC`.
---
### 📝 Action Plan
1. Apply the **Config Changes** above to `clp_config.py`.
2. (Optional) I can patch `unified_hedger.py` to fix the PnL logging and execution logic if you approve.

View File

@ -0,0 +1,76 @@
# CLP Strategy & Configuration Log
This document tracks different configuration approaches for the Uniswap V3 CLP Hedger, their specific settings, and the observed results. Use this to refine the strategy over time.
---
## 1. Low Volatility / Weekend Optimization (Narrow Range)
**Date:** 2025-12-23
**Status:** Active
**Objective:** Optimize for stable market conditions with a narrow trading range to maximize fee collection while maintaining tight delta neutrality.
### 🔍 Context
* **Market Condition:** Low Volatility / Weekend / Chop
* **Capital:** $2,000 USDC
* **Range:** +/- 1% (Narrow)
### ⚙️ Configuration
**`uniswap_manager.py`**
* `RANGE_WIDTH_PCT`: **0.01** (+/- 1%)
* `INITIAL_HEDGE_CAPITAL_USDC`: **2000**
* `SLIPPAGE_TOLERANCE`: **0.02** (2%)
**`clp_hedger.py`**
* `PRICE_BUFFER_PCT`: **0.0015** (0.15%)
* `MIN_THRESHOLD_ETH`: **0.008** (~$24)
* `BASE_REBALANCE_THRESHOLD_PCT`: **0.09** (9%)
* `LARGE_HEDGE_MULTIPLIER`: **2.8**
### test results
position:
{
"type": "AUTOMATIC",
"token_id": 5174808,
"status": "CLOSED",
"target_value": 1994.89,
"entry_price": 2954.93,
"amount0_initial": 0.3299,
"amount1_initial": 1019.94,
"liquidity": "3679197389549125",
"range_upper": 2983.95,
"range_lower": 2924.86,
"timestamp_open": 1766529348,
"initial_hedge_usdc": 1001.01805,
"hedge_equity_usd": 1008.884158,
"hedge_pnl_realized": -5.85,
"hedge_fees_paid": 2.21,
"timestamp_close": 1766545502
}
## results of tests are not satisfactional:
1. the main problem of 5174808 is still difference between value of clp position at the end (start: $1994.42, end $1982.71 value of (tokens plus fees ~$4)) versus value of the hedge position (0.6735 weth, price 2922.5 -> 1968.3), it gives delta 1978 - 1968 = **-$10**...
# questions
1. is the calculation of hedge wrong?
2. how we can proactivly fix it?
---
### 🚀 Analysis & New Idea: Asymmetric Compensation (2025-12-24)
#### **Findings from Pos 5174808:**
* **The Problem:** Alpha (NAV vs Hold) dropped by ~$3.84 during a 1.1% price drop.
* **The Cause:** Even though the **Mathematical Delta** was correct (using raw Liquidity), **Execution Friction** (Slippage and "Gamma Bleed") eroded the profit.
* **The Mechanism:** When price drops, we must sell to increase the short. We are always "selling the bottom" of each micro-move. This means our average entry price for the hedge is always worse than the ideal theoretical price.
#### **Proactive Fix: "Leaning into the Trend"**
We have implemented a creative solution to offset this 0.35% leakage: **Asymmetric Compensation**.
1. **Linear Bias Adjustment:** The bot no longer calculates a purely symmetric hedge. It now "leans" into the price direction to create a PnL buffer.
* **On Drops (Price < Entry):** The bot **Over-Hedges** by up to **+2.5%** at the bottom edge. This ensures the short gains "extra" value to cover the slippage/fees paid during rebalancing.
* **On Rises (Price > Entry):** The bot **Under-Hedges** by up to **-2.5%** at the top edge.
2. **Efficiency:** Increased rebalance threshold to **15%** and price buffer to **0.25%** to reduce unnecessary churn ("Chop Bleed").
3. **Visibility:** IDLE and rebalance logs now include an `Adj: +X.X%` tag so the compensation is transparent.
#### **Lessons Learned:**
* Pure delta-neutrality is theoretical. In a live market with fees and slippage, you must be "slightly biased" in the direction of the move to maintain a neutral **value** (NAV).

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

397
florida/telegram_monitor.py Normal file
View File

@ -0,0 +1,397 @@
#!/usr/bin/env python3
"""
Telegram Monitor for CLP Position Notifications
Monitors hedge_status.json file for new position openings and sends Telegram notifications
"""
import os
import sys
import time
import json
import logging
import hashlib
import requests
from datetime import datetime
from decimal import Decimal
from typing import Optional, Dict, List, Tuple, Any
from dotenv import load_dotenv
# --- SETUP PROJECT PATH ---
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(current_dir)
sys.path.append(current_dir)
# --- LOGGING SETUP ---
os.makedirs(os.path.join(current_dir, 'logs'), exist_ok=True)
class UnixMsLogFilter(logging.Filter):
def filter(self, record):
record.unix_ms = int(record.created * 1000)
return True
logger = logging.getLogger("TELEGRAM_MONITOR")
logger.setLevel(logging.INFO)
logger.propagate = False
logger.handlers.clear()
# Console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(console_formatter)
logger.addHandler(console_handler)
# File handler
from clp_config import TARGET_DEX
file_handler = logging.FileHandler(os.path.join(current_dir, 'logs', f'{TARGET_DEX}_telegram_monitor.log'), encoding='utf-8')
file_handler.setLevel(logging.INFO)
file_handler.addFilter(UnixMsLogFilter())
file_formatter = logging.Formatter('%(unix_ms)d, %(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
# --- CONFIGURATION ---
load_dotenv(os.path.join(current_dir, '.env'))
TELEGRAM_ENABLED = os.getenv('TELEGRAM_MONITOR_ENABLED', 'False').lower() == 'true'
TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN', '')
TELEGRAM_CHAT_ID = os.getenv('TELEGRAM_CHAT_ID', '')
TELEGRAM_CHECK_INTERVAL = int(os.getenv('TELEGRAM_CHECK_INTERVAL_SECONDS', '60'))
from clp_config import STATUS_FILE
TELEGRAM_STATE_FILE = os.getenv('TELEGRAM_STATE_FILE', 'telegram_monitor_state.json')
TELEGRAM_TIMEOUT = int(os.getenv('TELEGRAM_TIMEOUT_SECONDS', '10'))
HEDGE_STATUS_FILE = os.getenv('HEDGE_STATUS_FILE', STATUS_FILE)
class TelegramNotifier:
"""Handles Telegram API communication"""
def __init__(self, bot_token: str, chat_id: str):
self.bot_token = bot_token
self.chat_id = chat_id
self.base_url = f"https://api.telegram.org/bot{bot_token}"
def test_connection(self) -> bool:
"""Test Telegram bot connection"""
try:
url = f"{self.base_url}/getMe"
response = requests.get(url, timeout=TELEGRAM_TIMEOUT)
return response.status_code == 200
except Exception as e:
logger.error(f"Telegram connection test failed: {e}")
return False
def send_message(self, text: str) -> bool:
"""Send message to Telegram chat"""
if not TELEGRAM_ENABLED or not self.bot_token or not self.chat_id:
logger.debug("Telegram notifications disabled or missing credentials")
return False
try:
url = f"{self.base_url}/sendMessage"
payload = {
'chat_id': self.chat_id,
'text': text,
'parse_mode': 'Markdown'
}
response = requests.post(url, json=payload, timeout=TELEGRAM_TIMEOUT)
result = response.json()
if result.get('ok'):
logger.info("Telegram notification sent successfully")
return True
else:
logger.error(f"Telegram API error: {result}")
return False
except Exception as e:
logger.error(f"Failed to send Telegram message: {e}")
return False
def format_position_message(self, last_closed: Optional[Dict], current_open: Dict) -> str:
"""Format position data into readable message"""
lines = ["NEW CLP POSITION DETECTED\n"]
# Previous closed position section
if last_closed:
lines.append("LAST CLOSED POSITION:")
lines.append(f"• Token ID: {last_closed.get('token_id', 'N/A')}")
lines.append(f"• Entry: ${last_closed.get('entry_price', 0):.2f}")
lines.append(f"• Target Value: ${last_closed.get('target_value', 0):.2f}")
# Add duration if timestamps available
if last_closed.get('timestamp_open') and last_closed.get('timestamp_close'):
duration = last_closed['timestamp_close'] - last_closed['timestamp_open']
hours = duration // 3600
minutes = (duration % 3600) // 60
lines.append(f"• Duration: {hours}h {minutes}m")
# Add hedge performance if available
hedge_pnl = last_closed.get('hedge_pnl_realized', 0)
if hedge_pnl != 0:
lines.append(f"• Hedge PnL: ${hedge_pnl:.2f}")
hedge_fees = last_closed.get('hedge_fees_paid', 0)
if hedge_fees != 0:
lines.append(f"• Hedge Fees: ${hedge_fees:.2f}")
else:
lines.append("LAST CLOSED POSITION: None")
lines.append("") # Empty line
# Current opened position section
lines.append("CURRENTLY OPENED:")
lines.append(f"• Token ID: {current_open.get('token_id', 'N/A')}")
lines.append(f"• Entry: ${current_open.get('entry_price', 0):.2f}")
lines.append(f"• Target Value: ${current_open.get('target_value', 0):.2f}")
# Range information
range_lower = current_open.get('range_lower', 0)
range_upper = current_open.get('range_upper', 0)
if range_lower and range_upper:
lines.append(f"• Range: ${range_lower:.2f} - ${range_upper:.2f}")
# Initial amounts
amount0 = current_open.get('amount0_initial', 0)
amount1 = current_open.get('amount1_initial', 0)
if amount0 and amount1:
lines.append(f"• Initial: {amount0:.4f} ETH + {amount1:.2f} USDC")
# Time since opening
if current_open.get('timestamp_open'):
age = int(time.time()) - current_open['timestamp_open']
hours = age // 3600
minutes = (age % 3600) // 60
lines.append(f"• Time: {hours}h {minutes}m ago")
# Performance comparison if we have both positions
if last_closed and current_open:
lines.append("") # Empty line
lines.append("PERFORMANCE COMPARISON:")
# Entry price change
last_entry = Decimal(str(last_closed.get('entry_price', 0)))
curr_entry = Decimal(str(current_open.get('entry_price', 0)))
if last_entry > 0:
entry_change = curr_entry - last_entry
entry_change_pct = (entry_change / last_entry) * 100
sign = "+" if entry_change >= 0 else ""
lines.append(f"• Entry Change: {sign}${entry_change:.2f} ({sign}{entry_change_pct:.2f}%)")
# Value change
last_value = Decimal(str(last_closed.get('target_value', 0)))
curr_value = Decimal(str(current_open.get('target_value', 0)))
if last_value > 0:
value_change = curr_value - last_value
value_change_pct = (value_change / last_value) * 100
sign = "+" if value_change >= 0 else ""
lines.append(f"• Value Change: {sign}${value_change:.2f} ({sign}{value_change_pct:.2f}%)")
# Hedge PnL trend
last_hedge_pnl = last_closed.get('hedge_pnl_realized', 0)
curr_hedge_equity = current_open.get('hedge_equity_usd', 0)
if last_hedge_pnl != 0 and curr_hedge_equity != 0:
hedge_trend = curr_hedge_equity - last_hedge_pnl
sign = "+" if hedge_trend >= 0 else ""
lines.append(f"• Hedge PnL Trend: ${last_hedge_pnl:.2f} -> ${curr_hedge_equity:.2f} ({sign}${hedge_trend:.2f})")
return "\n".join(lines)
class PositionMonitor:
"""Monitors hedge_status.json for changes"""
def __init__(self, json_file_path: str, state_file_path: str):
self.json_file_path = json_file_path
self.state_file_path = state_file_path
self.last_known_data = []
self.last_file_hash = ""
self.state = self.load_state()
def load_state(self) -> Dict[str, Any]:
"""Load monitor state from file"""
try:
if os.path.exists(self.state_file_path):
with open(self.state_file_path, 'r') as f:
return json.load(f)
except Exception as e:
logger.warning(f"Could not load state file: {e}")
return {
"last_known_open_positions": [],
"last_processed_timestamp": 0,
"last_file_hash": ""
}
def save_state(self):
"""Save monitor state to file"""
try:
with open(self.state_file_path, 'w') as f:
json.dump(self.state, f, indent=2)
except Exception as e:
logger.error(f"Could not save state file: {e}")
def get_file_hash(self, data: List[Dict]) -> str:
"""Generate hash of file content to detect changes"""
content = json.dumps(data, sort_keys=True)
return hashlib.md5(content.encode()).hexdigest()
def safe_read_json(self) -> List[Dict]:
"""Safely read JSON file with retry logic"""
attempts = 0
while attempts < 3:
try:
if not os.path.exists(self.json_file_path):
logger.warning(f"JSON file not found: {self.json_file_path}")
return []
with open(self.json_file_path, 'r') as f:
return json.load(f)
except (json.JSONDecodeError, IOError) as e:
logger.warning(f"Attempt {attempts + 1}: Error reading JSON file: {e}")
time.sleep(1)
attempts += 1
logger.error("Failed to read JSON file after 3 attempts")
return []
def extract_notification_data(self, data: List[Dict]) -> Tuple[Optional[Dict], Optional[Dict]]:
"""Extract last closed and current open positions"""
current_open = None
last_closed = None
# Find current open position
for item in data:
if item.get('status') == 'OPEN':
current_open = item
break
# Find most recent closed position
closed_positions = [item for item in data if item.get('status') == 'CLOSED']
if closed_positions:
# Sort by timestamp_open (descending) to get most recent
closed_positions.sort(key=lambda x: x.get('timestamp_open', 0), reverse=True)
last_closed = closed_positions[0]
return last_closed, current_open
def check_for_changes(self) -> bool:
"""Check if there are changes requiring notification"""
current_data = self.safe_read_json()
if not current_data:
return False
# Check if file content actually changed
current_hash = self.get_file_hash(current_data)
if current_hash == self.state.get("last_file_hash", ""):
return False
# Extract positions
last_closed, current_open = self.extract_notification_data(current_data)
if not current_open:
# No open position, nothing to notify about
return False
current_open_id = current_open.get('token_id')
last_known_opens = self.state.get("last_known_open_positions", [])
# Check if this is a new open position
if current_open_id not in last_known_opens:
# New position detected!
self.last_known_data = current_data
return True
return False
def get_notification_data(self) -> Tuple[Optional[Dict], Optional[Dict]]:
"""Get data for notification"""
current_data = self.safe_read_json()
return self.extract_notification_data(current_data)
def update_state(self):
"""Update internal state after notification"""
current_data = self.safe_read_json()
if current_data:
_, current_open = self.extract_notification_data(current_data)
if current_open:
# Update state with current open positions
self.state["last_known_open_positions"] = [current_open.get('token_id')]
self.state["last_processed_timestamp"] = int(time.time())
self.state["last_file_hash"] = self.get_file_hash(current_data)
self.save_state()
def main():
"""Main monitoring loop"""
logger.info("🤖 Telegram Monitor Starting...")
notifier = None
if not TELEGRAM_ENABLED:
logger.info("📵 Telegram notifications disabled (TELEGRAM_MONITOR_ENABLED=False)")
else:
if not TELEGRAM_BOT_TOKEN or not TELEGRAM_CHAT_ID:
logger.error("❌ Telegram enabled but missing BOT_TOKEN or CHAT_ID")
return
# Initialize notifier and test connection
notifier = TelegramNotifier(TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID)
if not notifier.test_connection():
logger.error("❌ Telegram connection failed - check token and network")
return
logger.info(f"✅ Telegram connection established to chat ID: {TELEGRAM_CHAT_ID}")
# Initialize monitor
monitor = PositionMonitor(HEDGE_STATUS_FILE, TELEGRAM_STATE_FILE)
logger.info(f"Monitoring file: {HEDGE_STATUS_FILE}")
logger.info(f"Check interval: {TELEGRAM_CHECK_INTERVAL} seconds")
logger.info(f"State file: {TELEGRAM_STATE_FILE}")
try:
while True:
try:
if monitor.check_for_changes():
logger.info("New position opening detected!")
if TELEGRAM_ENABLED and notifier:
last_closed, current_open = monitor.get_notification_data()
if current_open:
message = notifier.format_position_message(last_closed, current_open)
success = notifier.send_message(message)
if success:
monitor.update_state()
logger.info(f"Notification sent for position {current_open.get('token_id')}")
else:
logger.error("Failed to send notification")
else:
logger.warning("Position change detected but no open position found")
else:
logger.info("Telegram disabled or notifier not available - skipping notification")
monitor.update_state() # Still update state to avoid loops
else:
logger.debug("No changes detected")
time.sleep(TELEGRAM_CHECK_INTERVAL)
except KeyboardInterrupt:
break
except Exception as e:
logger.error(f"Error in monitoring loop: {e}")
time.sleep(TELEGRAM_CHECK_INTERVAL) # Continue after error
except KeyboardInterrupt:
logger.info("Shutting down Telegram Monitor...")
logger.info("Telegram Monitor stopped")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,7 @@
{
"last_known_open_positions": [
5180968
],
"last_processed_timestamp": 1766874912,
"last_file_hash": "beda382fdbca542dc8357002b4527702"
}

View File

@ -0,0 +1,262 @@
# Git Agent for Uniswap Auto CLP
## Overview
Automated backup and version control system for your Uniswap Auto CLP trading bot.
## Quick Setup
### 1. Initialize Repository
```bash
# Navigate to project directory
cd K:\Projects\uniswap_auto_clp
# Create initial commit
python tools\git_agent.py --init
# Add and push initial setup
git add .
git commit -m "🎯 Initial commit: Uniswap Auto CLP system"
git remote add origin https://git.kapuscinski.pl/ditus/uniswap_auto_clp.git
git push -u origin main
```
### 2. Create First Backup
```bash
# Test backup creation
python tools\git_agent.py --backup
```
### 3. Check Status
```bash
# View current status
python tools\git_agent.py --status
```
## Configuration
Edit `tools/agent_config.json` as needed:
```json
{
"backup": {
"enabled": true,
"frequency_hours": 1,
"keep_max_count": 100,
"push_to_remote": true
}
}
```
## Usage Commands
### Manual Operations
```bash
# Create backup now
python tools\git_agent.py --backup
# Check status
python tools\git_agent.py --status
# Cleanup old backups
python tools\git_agent.py --cleanup
# Initialize repository (one-time)
python tools\git_agent.py --init
```
### Automated Scheduling
#### Windows Task Scheduler
```powershell
# Create hourly task
schtasks /create /tn "Git Backup" /tr "python tools\git_agent.py --backup" /sc hourly
```
#### Linux Cron (if needed)
```bash
# Add to crontab
0 * * * * cd /path/to/project && python tools/git_agent.py --backup
```
## How It Works
### Branch Strategy
- **main branch**: Your manual development (you control pushes)
- **backup-* branches**: Automatic hourly backups (agent managed)
### Backup Process
1. **Hourly**: Agent checks for file changes
2. **Creates backup branch**: Named `backup-YYYY-MM-DD-HH`
3. **Commits changes**: With detailed file and parameter tracking
4. **Pushes to remote**: Automatic backup to Gitea
5. **Cleans up**: Keeps only last 100 backups
### Backup Naming
```
backup-2025-01-15-14 # 2 PM backup on Jan 15, 2025
backup-2025-01-15-15 # 3 PM backup
backup-2025-01-15-16 # 4 PM backup
```
### Commit Messages
Agent creates detailed commit messages showing:
- Files changed with status icons
- Parameter changes with percentage differences
- Security validation confirmation
- Timestamp and backup number
## Security
### What's Excluded
✅ Private keys and tokens (`.env` files)
✅ Log files (`*.log`)
✅ State files (`hedge_status.json`)
✅ Temporary files
### What's Included
✅ All code changes
✅ Configuration modifications
✅ Documentation updates
✅ Parameter tracking
## Emergency Recovery
### Quick Rollback
```bash
# List recent backups
python tools\git_agent.py --status
# Switch to backup
git checkout backup-2025-01-15-14
# Copy files to main
git checkout main -- .
git commit -m "🔄 Emergency restore from backup-2025-01-15-14"
git push origin main
```
### File Recovery
```bash
# Restore specific file from backup
git checkout backup-2025-01-15-14 -- path/to/file.py
```
## Monitoring
### Backup Health
```bash
# Check backup count and status
python tools\git_agent.py --status
# Expected output:
# 📊 Git Agent Status:
# Current Branch: main
# Backup Count: 47
# Has Changes: false
# Remote Connected: true
# Last Backup: backup-2025-01-15-16
```
### Manual Cleanup
```bash
# Remove old backups (keeps last 100)
python tools\git_agent.py --cleanup
```
## Troubleshooting
### Common Issues
#### "Configuration file not found"
```bash
# Ensure agent_config.json exists in tools/ directory
ls tools/agent_config.json
```
#### "Git command failed"
```bash
# Check Git installation and repository status
git status
git --version
```
#### "Remote connection failed"
```bash
# Verify Gitea URL and credentials
git remote -v
ping git.kapuscinski.pl
```
### Debug Mode
Edit `agent_config.json`:
```json
{
"logging": {
"enabled": true,
"log_level": "DEBUG"
}
}
```
Then check `git_agent.log` in project root.
## Integration with Trading Bot
### Parameter Changes
Agent automatically tracks changes to:
- `TARGET_INVESTMENT_VALUE_USDC`
- `RANGE_WIDTH_PCT`
- `SLIPPAGE_TOLERANCE`
- `LEVERAGE`
- `CHECK_INTERVAL`
- `PRICE_BUFFER_PCT`
### Backup Triggers
Consider manual backups when:
- Changing trading strategy parameters
- Updating risk management settings
- Before major system changes
- After successful backtesting
```bash
# Manual backup before important changes
python tools\git_agent.py --backup
```
## Best Practices
### Development Workflow
1. **Work on main branch** for normal development
2. **Manual commits** for your changes
3. **Agent handles backups** automatically
4. **Manual push** to main when ready
### Backup Management
- **100 backup limit** = ~4 days of hourly coverage
- **Automatic cleanup** maintains repository size
- **Remote storage** provides offsite backup
### Security Reminders
- **Never commit private keys** (automatically excluded)
- **Check .gitignore** if adding sensitive files
- **Review backup commits** for accidental secrets
## Support
### Log Files
- `git_agent.log`: Agent activity and errors
- Check logs for troubleshooting issues
### Repository Structure
```
tools/
├── git_agent.py # Main automation script
├── agent_config.json # Configuration settings
├── git_utils.py # Git operations
├── backup_manager.py # Backup branch logic
├── change_detector.py # Change analysis
├── cleanup_manager.py # Backup rotation
└── commit_formatter.py # Message formatting
```
This automated backup system ensures your trading bot code is always versioned and recoverable, while keeping your main development workflow clean and manual.

View File

@ -0,0 +1,35 @@
{
"gitea": {
"server_url": "https://git.kapuscinski.pl",
"username": "ditus",
"repository": "uniswap_auto_clp",
"token": "b24fc3203597b2bdcb2f2da6634c618"
},
"backup": {
"enabled": true,
"frequency_hours": 1,
"branch_prefix": "backup-",
"push_to_remote": true,
"keep_max_count": 100,
"cleanup_with_backup": true,
"detailed_commit_messages": true
},
"main_branch": {
"manual_pushes_only": true,
"auto_commits": false,
"protect_from_agent": true,
"name": "main"
},
"change_tracking": {
"method": "commit_message",
"include_file_diffs": true,
"track_parameter_changes": true,
"format": "detailed",
"security_validation": false
},
"logging": {
"enabled": true,
"log_file": "git_agent.log",
"log_level": "INFO"
}
}

View File

@ -0,0 +1,89 @@
#!/usr/bin/env python3
"""
Backup Manager for Git Agent
Handles backup branch creation and management
"""
import os
import logging
from datetime import datetime, timezone
from typing import Dict, Any
class BackupManager:
"""Manages backup branch operations"""
def __init__(self, config: Dict[str, Any], logger: logging.Logger):
self.config = config
self.logger = logger
self.backup_config = config.get('backup', {})
self.prefix = self.backup_config.get('branch_prefix', 'backup-')
def create_backup_branch(self) -> str:
"""Create a new backup branch with timestamp"""
timestamp = datetime.now(timezone.utc)
branch_name = f"{self.prefix}{timestamp.strftime('%Y-%m-%d-%H')}"
# Get current directory from git utils
current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Create backup branch
import subprocess
try:
# Create and checkout new branch
result = subprocess.run(
['git', 'checkout', '-b', branch_name],
cwd=current_dir,
capture_output=True,
text=True,
check=False
)
if result.returncode == 0:
self.logger.info(f"✅ Created backup branch: {branch_name}")
return branch_name
else:
# Branch might already exist, just checkout
result = subprocess.run(
['git', 'checkout', branch_name],
cwd=current_dir,
capture_output=True,
text=True,
check=False
)
if result.returncode == 0:
self.logger.info(f"✅ Using existing backup branch: {branch_name}")
return branch_name
else:
self.logger.error(f"❌ Failed to create/checkout backup branch: {result.stderr}")
return None
except Exception as e:
self.logger.error(f"❌ Exception creating backup branch: {e}")
return None
def get_backup_count(self) -> int:
"""Get current number of backup branches"""
current_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
try:
result = subprocess.run(
['git', 'branch', '-a'],
cwd=current_dir,
capture_output=True,
text=True,
check=False
)
if result.returncode == 0:
branches = result.stdout.strip().split('\n')
backup_branches = [
b.strip().replace('* ', '').replace('remotes/origin/', '')
for b in branches
if b.strip() and self.prefix in b
]
return len(backup_branches)
except Exception as e:
self.logger.error(f"❌ Error counting backup branches: {e}")
return 0

View File

@ -0,0 +1,230 @@
#!/usr/bin/env python3
"""
Change Detector for Git Agent
Detects and analyzes file changes for detailed commit messages
"""
import os
import re
import subprocess
import logging
from typing import Dict, Any, List
from decimal import Decimal
class ChangeDetector:
"""Detects and categorizes file changes"""
def __init__(self, config: Dict[str, Any], logger: logging.Logger):
self.config = config
self.logger = logger
self.project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def detect_changes(self) -> Dict[str, Any]:
"""Detect all changes in the repository"""
try:
# Get changed files
changed_files = self._get_changed_files()
if not changed_files:
return {
'has_changes': False,
'files': [],
'categories': {},
'parameter_changes': {}
}
# Analyze changes
file_details = []
categories = {
'python': [],
'config': [],
'docs': [],
'other': []
}
parameter_changes = {}
for file_path in changed_files:
details = self._analyze_file_changes(file_path)
file_details.append(details)
# Categorize file
category = self._categorize_file(file_path)
categories[category].append(details)
# Track parameter changes for Python files
if category == 'python':
params = self._extract_parameter_changes(file_path, details.get('diff', ''))
if params:
parameter_changes[file_path] = params
return {
'has_changes': True,
'files': file_details,
'categories': categories,
'parameter_changes': parameter_changes
}
except Exception as e:
self.logger.error(f"❌ Error detecting changes: {e}")
return {
'has_changes': False,
'files': [],
'categories': {},
'parameter_changes': {},
'error': str(e)
}
def _get_changed_files(self) -> List[str]:
"""Get list of changed files using git status"""
try:
result = subprocess.run(
['git', 'status', '--porcelain'],
cwd=self.project_root,
capture_output=True,
text=True,
check=False
)
if result.returncode != 0:
return []
files = []
for line in result.stdout.strip().split('\n'):
if line.strip():
# Extract filename (remove status codes)
filename = line.strip()[2:] if len(line.strip()) > 2 else line.strip()
if filename and filename not in ['.git', '__pycache__']:
files.append(filename)
return files
except Exception as e:
self.logger.error(f"Error getting changed files: {e}")
return []
def _analyze_file_changes(self, file_path: str) -> Dict[str, Any]:
"""Analyze changes for a specific file"""
try:
# Get diff
result = subprocess.run(
['git', 'diff', '--', file_path],
cwd=self.project_root,
capture_output=True,
text=True,
check=False
)
diff = result.stdout if result.returncode == 0 else ''
# Get file status
status_result = subprocess.run(
['git', 'status', '--porcelain', '--', file_path],
cwd=self.project_root,
capture_output=True,
text=True,
check=False
)
status = 'modified'
if status_result.returncode == 0 and status_result.stdout.strip():
status_line = status_result.stdout.strip()[0]
if status_line == 'A':
status = 'added'
elif status_line == 'D':
status = 'deleted'
elif status_line == '??':
status = 'untracked'
# Count lines changed
lines_added = diff.count('\n+') - diff.count('\n++') # Exclude +++ indicators
lines_deleted = diff.count('\n-') - diff.count('\n--') # Exclude --- indicators
return {
'path': file_path,
'status': status,
'lines_added': max(0, lines_added),
'lines_deleted': max(0, lines_deleted),
'diff': diff
}
except Exception as e:
self.logger.error(f"Error analyzing {file_path}: {e}")
return {
'path': file_path,
'status': 'error',
'lines_added': 0,
'lines_deleted': 0,
'diff': '',
'error': str(e)
}
def _categorize_file(self, file_path: str) -> str:
"""Categorize file type"""
if file_path.endswith('.py'):
return 'python'
elif file_path.endswith(('.json', '.yaml', '.yml', '.toml', '.ini')):
return 'config'
elif file_path.endswith(('.md', '.txt', '.rst')):
return 'docs'
else:
return 'other'
def _extract_parameter_changes(self, file_path: str, diff: str) -> Dict[str, Any]:
"""Extract parameter changes from Python files"""
if not diff or not file_path.endswith('.py'):
return {}
parameters = {}
# Common trading bot parameters to track
param_patterns = {
'TARGET_INVESTMENT_VALUE_USDC': r'(TARGET_INVESTMENT_VALUE_USDC)\s*=\s*(\d+)',
'RANGE_WIDTH_PCT': r'(RANGE_WIDTH_PCT)\s*=\s*Decimal\("([^"]+)"\)',
'SLIPPAGE_TOLERANCE': r'(SLIPPAGE_TOLERANCE)\s*=\s*Decimal\("([^"]+)"\)',
'LEVERAGE': r'(LEVERAGE)\s*=\s*(\d+)',
'MIN_THRESHOLD_ETH': r'(MIN_THRESHOLD_ETH)\s*=\s*Decimal\("([^"]+)"\)',
'CHECK_INTERVAL': r'(CHECK_INTERVAL)\s*=\s*(\d+)',
'PRICE_BUFFER_PCT': r'(PRICE_BUFFER_PCT)\s*=\s*Decimal\("([^"]+)"\)'
}
for param_name, pattern in param_patterns.items():
matches = re.findall(pattern, diff)
if matches:
# Find old and new values
values = []
for match in matches:
if isinstance(match, tuple):
values.append(match[1] if len(match) > 1 else match[0])
else:
values.append(match)
if len(values) >= 2:
old_val = values[0]
new_val = values[-1] # Last value is current
# Calculate percentage change for numeric values
try:
if '.' in old_val or '.' in new_val:
old_num = float(old_val)
new_num = float(new_val)
if old_num != 0:
pct_change = ((new_num - old_num) / abs(old_num)) * 100
else:
pct_change = 0
else:
old_num = int(old_val)
new_num = int(new_val)
if old_num != 0:
pct_change = ((new_num - old_num) / abs(old_num)) * 100
else:
pct_change = 0
except (ValueError, ZeroDivisionError):
pct_change = 0
parameters[param_name] = {
'old': old_val,
'new': new_val,
'pct_change': round(pct_change, 1)
}
return parameters

View File

@ -0,0 +1,153 @@
#!/usr/bin/env python3
"""
Cleanup Manager for Git Agent
Manages backup branch rotation (keep last 100)
"""
import os
import subprocess
import logging
from typing import Dict, Any, List
class CleanupManager:
"""Manages backup branch cleanup and rotation"""
def __init__(self, config: Dict[str, Any], logger: logging.Logger):
self.config = config
self.logger = logger
self.backup_config = config.get('backup', {})
self.prefix = self.backup_config.get('branch_prefix', 'backup-')
self.max_backups = self.backup_config.get('keep_max_count', 100)
self.project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def cleanup_old_backups(self) -> bool:
"""Clean up old backup branches to keep only the last N"""
try:
# Get all backup branches
backup_branches = self._get_backup_branches()
if len(backup_branches) <= self.max_backups:
self.logger.info(f"✅ Backup count ({len(backup_branches)}) within limit ({self.max_backups})")
return False # No cleanup needed
# Branches to delete (oldest ones)
branches_to_delete = backup_branches[self.max_backups:]
if not branches_to_delete:
return False
self.logger.info(f"🧹 Cleaning up {len(branches_to_delete)} old backup branches")
deleted_count = 0
for branch in branches_to_delete:
# Delete local branch
if self._delete_local_branch(branch):
# Delete remote branch
if self._delete_remote_branch(branch):
deleted_count += 1
self.logger.debug(f" ✅ Deleted: {branch}")
else:
self.logger.warning(f" ⚠️ Local deleted, remote failed: {branch}")
else:
self.logger.warning(f" ❌ Failed to delete: {branch}")
if deleted_count > 0:
self.logger.info(f"✅ Cleanup completed: deleted {deleted_count} old backup branches")
return True
else:
self.logger.warning("⚠️ No branches were successfully deleted")
return False
except Exception as e:
self.logger.error(f"❌ Cleanup failed: {e}")
return False
def _get_backup_branches(self) -> List[str]:
"""Get all backup branches sorted by timestamp (newest first)"""
try:
result = subprocess.run(
['git', 'branch', '-a'],
cwd=self.project_root,
capture_output=True,
text=True,
check=False
)
if result.returncode != 0:
return []
branches = []
for line in result.stdout.strip().split('\n'):
if line.strip():
# Clean up branch name
branch = line.strip().replace('* ', '').replace('remotes/origin/', '')
if branch.startswith(self.prefix):
branches.append(branch)
# Sort by timestamp (extract from branch name)
# Format: backup-YYYY-MM-DD-HH
branches.sort(key=lambda x: x.replace(self.prefix, ''), reverse=True)
return branches
except Exception as e:
self.logger.error(f"Error getting backup branches: {e}")
return []
def _delete_local_branch(self, branch_name: str) -> bool:
"""Delete local branch"""
try:
result = subprocess.run(
['git', 'branch', '-D', branch_name],
cwd=self.project_root,
capture_output=True,
text=True,
check=False
)
if result.returncode == 0:
return True
else:
self.logger.debug(f"Local delete failed for {branch_name}: {result.stderr}")
return False
except Exception as e:
self.logger.error(f"Exception deleting local branch {branch_name}: {e}")
return False
def _delete_remote_branch(self, branch_name: str) -> bool:
"""Delete remote branch"""
try:
result = subprocess.run(
['git', 'push', 'origin', '--delete', branch_name],
cwd=self.project_root,
capture_output=True,
text=True,
check=False
)
if result.returncode == 0:
return True
else:
# Might already be deleted remotely, that's ok
if "not found" in result.stderr.lower() or "does not exist" in result.stderr.lower():
return True
self.logger.debug(f"Remote delete failed for {branch_name}: {result.stderr}")
return False
except Exception as e:
self.logger.error(f"Exception deleting remote branch {branch_name}: {e}")
return False
def get_cleanup_stats(self) -> Dict[str, Any]:
"""Get statistics about backup cleanup"""
backup_branches = self._get_backup_branches()
current_count = len(backup_branches)
return {
'current_backup_count': current_count,
'max_allowed': self.max_backups,
'cleanup_needed': current_count > self.max_backups,
'branches_to_delete': max(0, current_count - self.max_backups),
'newest_backup': backup_branches[0] if backup_branches else None,
'oldest_backup': backup_branches[-1] if backup_branches else None
}

View File

@ -0,0 +1,325 @@
#!/usr/bin/env python3
"""
Fee Collection & Position Recovery Script
Collects all accumulated fees from Uniswap V3 positions
Usage:
python collect_fees_v2.py
"""
import os
import sys
import json
import time
import argparse
# Required libraries
try:
from web3 import Web3
from eth_account import Account
except ImportError as e:
print(f"[ERROR] Missing required library: {e}")
print("Please install with: pip install web3 eth-account python-dotenv")
sys.exit(1)
try:
from dotenv import load_dotenv
except ImportError:
print("[WARNING] python-dotenv not found, using environment variables directly")
def load_dotenv(override=True):
pass
def setup_logging():
"""Setup logging for fee collection"""
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler(),
logging.FileHandler('collect_fees.log', encoding='utf-8')
]
)
return logging.getLogger(__name__)
logger = setup_logging()
# --- Contract ABIs ---
NONFUNGIBLE_POSITION_MANAGER_ABI = json.loads('''
[
{"inputs": [{"internalType": "uint256", "name": "tokenId", "type": "uint256"}], "name": "positions", "outputs": [{"internalType": "uint96", "name": "nonce", "type": "uint96"}, {"internalType": "address", "name": "operator", "type": "address"}, {"internalType": "address", "name": "token0", "type": "address"}, {"internalType": "address", "name": "token1", "type": "address"}, {"internalType": "uint24", "name": "fee", "type": "uint24"}, {"internalType": "int24", "name": "tickLower", "type": "int24"}, {"internalType": "int24", "name": "tickUpper", "type": "int24"}, {"internalType": "uint128", "name": "liquidity", "type": "uint128"}, {"internalType": "uint256", "name": "feeGrowthInside0LastX128", "type": "uint256"}, {"internalType": "uint256", "name": "feeGrowthInside1LastX128", "type": "uint256"}, {"internalType": "uint128", "name": "tokensOwed0", "type": "uint128"}, {"internalType": "uint128", "name": "tokensOwed1", "type": "uint128"}], "stateMutability": "view", "type": "function"},
{"inputs": [{"components": [{"internalType": "uint256", "name": "tokenId", "type": "uint256"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint128", "name": "amount0Max", "type": "uint128"}, {"internalType": "uint128", "name": "amount1Max", "type": "uint128"}], "internalType": "struct INonfungiblePositionManager.CollectParams", "name": "params", "type": "tuple"}], "name": "collect", "outputs": [{"internalType": "uint256", "name": "amount0", "type": "uint256"}, {"internalType": "uint256", "name": "amount1", "type": "uint256"}], "stateMutability": "payable", "type": "function"}
]
''')
ERC20_ABI = json.loads('''
[
{"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"},
{"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"},
{"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}
]
''')
def load_status_file():
"""Load hedge status file"""
status_file = "hedge_status.json"
if not os.path.exists(status_file):
logger.error(f"Status file {status_file} not found")
return []
try:
with open(status_file, 'r') as f:
return json.load(f)
except Exception as e:
logger.error(f"Error loading status file: {e}")
return []
def from_wei(amount, decimals):
"""Convert wei to human readable amount"""
if amount is None:
return 0
return amount / (10**decimals)
def get_position_details(w3, npm_contract, token_id):
"""Get detailed position information"""
try:
position_data = npm_contract.functions.positions(token_id).call()
(nonce, operator, token0_address, token1_address, fee, tickLower, tickUpper,
liquidity, feeGrowthInside0, feeGrowthInside1, tokensOwed0, tokensOwed1) = position_data
# Get token details
token0_contract = w3.eth.contract(address=token0_address, abi=ERC20_ABI)
token1_contract = w3.eth.contract(address=token1_address, abi=ERC20_ABI)
token0_symbol = token0_contract.functions.symbol().call()
token1_symbol = token1_contract.functions.symbol().call()
token0_decimals = token0_contract.functions.decimals().call()
token1_decimals = token1_contract.functions.decimals().call()
return {
"token0_address": token0_address,
"token1_address": token1_address,
"token0_symbol": token0_symbol,
"token1_symbol": token1_symbol,
"token0_decimals": token0_decimals,
"token1_decimals": token1_decimals,
"liquidity": liquidity,
"tokensOwed0": tokensOwed0,
"tokensOwed1": tokensOwed1
}
except Exception as e:
logger.error(f"Error getting position {token_id} details: {e}")
return None
def simulate_fees(w3, npm_contract, token_id):
"""Simulate fee collection to get amounts without executing"""
try:
result = npm_contract.functions.collect(
(token_id, "0x0000000000000000000000000000000000000000", 2**128-1, 2**128-1)
).call()
return result[0], result[1] # amount0, amount1
except Exception as e:
logger.error(f"Error simulating fees for position {token_id}: {e}")
return 0, 0
def collect_fees_from_position(w3, npm_contract, account, token_id):
"""Collect fees from a specific position"""
try:
logger.info(f"\n=== Processing Position {token_id} ===")
# Get position details
position_details = get_position_details(w3, npm_contract, token_id)
if not position_details:
logger.error(f"Could not get details for position {token_id}")
return False
logger.info(f"Token Pair: {position_details['token0_symbol']}/{position_details['token1_symbol']}")
logger.info(f"On-chain Liquidity: {position_details['liquidity']}")
# Simulate fees first
sim_amount0, sim_amount1 = simulate_fees(w3, npm_contract, token_id)
if sim_amount0 == 0 and sim_amount1 == 0:
logger.info(f"No fees available for position {token_id}")
return True
logger.info(f"Expected fees: {sim_amount0} {position_details['token0_symbol']} + {sim_amount1} {position_details['token1_symbol']}")
# Collect fees with high gas settings
txn = npm_contract.functions.collect(
(token_id, account.address, 2**128-1, 2**128-1)
).build_transaction({
'from': account.address,
'nonce': w3.eth.get_transaction_count(account.address),
'gas': 300000, # High gas limit
'maxFeePerGas': w3.eth.gas_price * 4, # 4x gas price
'maxPriorityFeePerGas': w3.eth.max_priority_fee * 3,
'chainId': w3.eth.chain_id
})
# Sign and send
signed_txn = w3.eth.account.sign_transaction(txn, private_key=account.key)
tx_hash = w3.eth.send_raw_transaction(signed_txn.raw_transaction)
logger.info(f"Collect fees sent: {tx_hash.hex()}")
logger.info(f"Arbiscan: https://arbiscan.io/tx/{tx_hash.hex()}")
# Wait with extended timeout
receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=600)
if receipt.status == 1:
logger.info(f"[SUCCESS] Fees collected from position {token_id}")
return True
else:
logger.error(f"[ERROR] Fee collection failed for position {token_id}. Status: {receipt.status}")
return False
except Exception as e:
logger.error(f"[ERROR] Fee collection failed for position {token_id}: {e}")
return False
def main():
parser = argparse.ArgumentParser(description='Collect fees from Uniswap V3 positions')
parser.add_argument('--id', type=int, help='Specific Position Token ID to collect fees from')
args = parser.parse_args()
logger.info("=== Fee Collection Script v2 ===")
logger.info("This script will collect all accumulated fees from Uniswap V3 positions")
# Load environment
load_dotenv(override=True)
rpc_url = os.environ.get("MAINNET_RPC_URL")
private_key = os.environ.get("MAIN_WALLET_PRIVATE_KEY") or os.environ.get("PRIVATE_KEY")
if not rpc_url or not private_key:
logger.error("[ERROR] Missing RPC URL or Private Key")
logger.error("Please ensure MAINNET_RPC_URL and PRIVATE_KEY are set in your .env file")
return
# Connect to Arbitrum
try:
w3 = Web3(Web3.HTTPProvider(rpc_url))
if not w3.is_connected():
logger.error("[ERROR] Failed to connect to Arbitrum RPC")
return
logger.info(f"[SUCCESS] Connected to Chain ID: {w3.eth.chain_id}")
except Exception as e:
logger.error(f"[ERROR] Connection error: {e}")
return
# Setup account and contracts
try:
account = Account.from_key(private_key)
w3.eth.default_account = account.address
logger.info(f"Wallet: {account.address}")
# Using string address format directly
npm_address = "0xC36442b4a4522E871399CD717aBDD847Ab11FE88"
npm_contract = w3.eth.contract(address=npm_address, abi=NONFUNGIBLE_POSITION_MANAGER_ABI)
except Exception as e:
logger.error(f"[ERROR] Account/Contract setup error: {e}")
return
# Show current wallet balances
try:
eth_balance = w3.eth.get_balance(account.address)
logger.info(f"ETH Balance: {eth_balance / 10**18:.6f} ETH")
# Check token balances using basic addresses
try:
weth_address = "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"
weth_contract = w3.eth.contract(address=weth_address, abi=ERC20_ABI)
weth_balance = weth_contract.functions.balanceOf(account.address).call()
logger.info(f"WETH Balance: {weth_balance / 10**18:.6f} WETH")
except:
pass
try:
usdc_address = "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
usdc_contract = w3.eth.contract(address=usdc_address, abi=ERC20_ABI)
usdc_balance = usdc_contract.functions.balanceOf(account.address).call()
logger.info(f"USDC Balance: {usdc_balance / 10**6:.2f} USDC")
except:
pass
except Exception as e:
logger.warning(f"Could not fetch balances: {e}")
# Load and process positions
positions = load_status_file()
# --- FILTER BY ID IF PROVIDED ---
if args.id:
logger.info(f"🎯 Target Mode: Checking specific Position ID {args.id}")
# Check if it exists in the file
target_pos = next((p for p in positions if p.get('token_id') == args.id), None)
if target_pos:
positions = [target_pos]
else:
logger.warning(f"⚠️ Position {args.id} not found in hedge_status.json")
logger.info("Attempting to collect from it anyway (Manual Override)...")
positions = [{'token_id': args.id, 'status': 'MANUAL_OVERRIDE'}]
if not positions:
logger.info("No positions found to process")
return
logger.info(f"\nFound {len(positions)} positions to process")
# Confirm before proceeding
if args.id:
print(f"\nReady to collect fees from Position {args.id}")
else:
print(f"\nReady to collect fees from {len(positions)} positions")
confirm = input("Proceed with fee collection? (y/N): ").strip().lower()
if confirm != 'y':
logger.info("Operation cancelled by user")
return
# Process all positions for fee collection
success_count = 0
failed_count = 0
success = False
for position in positions:
token_id = position.get('token_id')
status = position.get('status', 'UNKNOWN')
if success:
time.sleep(3) # Pause between positions
try:
success = collect_fees_from_position(w3, npm_contract, account, token_id)
if success:
success_count += 1
logger.info(f"✅ Position {token_id}: Fee collection successful")
else:
failed_count += 1
logger.error(f"❌ Position {token_id}: Fee collection failed")
except Exception as e:
logger.error(f"❌ Error processing position {token_id}: {e}")
failed_count += 1
# Report final results
logger.info(f"\n=== Fee Collection Summary ===")
logger.info(f"Total Positions: {len(positions)}")
logger.info(f"Successful: {success_count}")
logger.info(f"Failed: {failed_count}")
if success_count > 0:
logger.info(f"[SUCCESS] Fee collection completed for {success_count} positions!")
logger.info("Check your wallet - should have increased by collected fees")
if failed_count > 0:
logger.warning(f"[WARNING] {failed_count} positions failed. Check collect_fees.log for details.")
logger.info("=== Fee Collection Script Complete ===")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,325 @@
#!/usr/bin/env python3
"""
Fee Collection & Position Recovery Script
Collects all accumulated fees from Uniswap V3 positions
Usage:
python collect_fees_v2.py
"""
import os
import sys
import json
import time
import argparse
# Required libraries
try:
from web3 import Web3
from eth_account import Account
except ImportError as e:
print(f"[ERROR] Missing required library: {e}")
print("Please install with: pip install web3 eth-account python-dotenv")
sys.exit(1)
try:
from dotenv import load_dotenv
except ImportError:
print("[WARNING] python-dotenv not found, using environment variables directly")
def load_dotenv(override=True):
pass
def setup_logging():
"""Setup logging for fee collection"""
import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.StreamHandler(),
logging.FileHandler('collect_fees.log', encoding='utf-8')
]
)
return logging.getLogger(__name__)
logger = setup_logging()
# --- Contract ABIs ---
NONFUNGIBLE_POSITION_MANAGER_ABI = json.loads('''
[
{"inputs": [{"internalType": "uint256", "name": "tokenId", "type": "uint256"}], "name": "positions", "outputs": [{"internalType": "uint96", "name": "nonce", "type": "uint96"}, {"internalType": "address", "name": "operator", "type": "address"}, {"internalType": "address", "name": "token0", "type": "address"}, {"internalType": "address", "name": "token1", "type": "address"}, {"internalType": "uint24", "name": "fee", "type": "uint24"}, {"internalType": "int24", "name": "tickLower", "type": "int24"}, {"internalType": "int24", "name": "tickUpper", "type": "int24"}, {"internalType": "uint128", "name": "liquidity", "type": "uint128"}, {"internalType": "uint256", "name": "feeGrowthInside0LastX128", "type": "uint256"}, {"internalType": "uint256", "name": "feeGrowthInside1LastX128", "type": "uint256"}, {"internalType": "uint128", "name": "tokensOwed0", "type": "uint128"}, {"internalType": "uint128", "name": "tokensOwed1", "type": "uint128"}], "stateMutability": "view", "type": "function"},
{"inputs": [{"components": [{"internalType": "uint256", "name": "tokenId", "type": "uint256"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint128", "name": "amount0Max", "type": "uint128"}, {"internalType": "uint128", "name": "amount1Max", "type": "uint128"}], "internalType": "struct INonfungiblePositionManager.CollectParams", "name": "params", "type": "tuple"}], "name": "collect", "outputs": [{"internalType": "uint256", "name": "amount0", "type": "uint256"}, {"internalType": "uint256", "name": "amount1", "type": "uint256"}], "stateMutability": "payable", "type": "function"}
]
''')
ERC20_ABI = json.loads('''
[
{"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"},
{"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"},
{"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}
]
''')
def load_status_file():
"""Load hedge status file"""
status_file = "hedge_status.json"
if not os.path.exists(status_file):
logger.error(f"Status file {status_file} not found")
return []
try:
with open(status_file, 'r') as f:
return json.load(f)
except Exception as e:
logger.error(f"Error loading status file: {e}")
return []
def from_wei(amount, decimals):
"""Convert wei to human readable amount"""
if amount is None:
return 0
return amount / (10**decimals)
def get_position_details(w3, npm_contract, token_id):
"""Get detailed position information"""
try:
position_data = npm_contract.functions.positions(token_id).call()
(nonce, operator, token0_address, token1_address, fee, tickLower, tickUpper,
liquidity, feeGrowthInside0, feeGrowthInside1, tokensOwed0, tokensOwed1) = position_data
# Get token details
token0_contract = w3.eth.contract(address=token0_address, abi=ERC20_ABI)
token1_contract = w3.eth.contract(address=token1_address, abi=ERC20_ABI)
token0_symbol = token0_contract.functions.symbol().call()
token1_symbol = token1_contract.functions.symbol().call()
token0_decimals = token0_contract.functions.decimals().call()
token1_decimals = token1_contract.functions.decimals().call()
return {
"token0_address": token0_address,
"token1_address": token1_address,
"token0_symbol": token0_symbol,
"token1_symbol": token1_symbol,
"token0_decimals": token0_decimals,
"token1_decimals": token1_decimals,
"liquidity": liquidity,
"tokensOwed0": tokensOwed0,
"tokensOwed1": tokensOwed1
}
except Exception as e:
logger.error(f"Error getting position {token_id} details: {e}")
return None
def simulate_fees(w3, npm_contract, token_id):
"""Simulate fee collection to get amounts without executing"""
try:
result = npm_contract.functions.collect(
(token_id, "0x0000000000000000000000000000000000000000", 2**128-1, 2**128-1)
).call()
return result[0], result[1] # amount0, amount1
except Exception as e:
logger.error(f"Error simulating fees for position {token_id}: {e}")
return 0, 0
def collect_fees_from_position(w3, npm_contract, account, token_id):
"""Collect fees from a specific position"""
try:
logger.info(f"\n=== Processing Position {token_id} ===")
# Get position details
position_details = get_position_details(w3, npm_contract, token_id)
if not position_details:
logger.error(f"Could not get details for position {token_id}")
return False
logger.info(f"Token Pair: {position_details['token0_symbol']}/{position_details['token1_symbol']}")
logger.info(f"On-chain Liquidity: {position_details['liquidity']}")
# Simulate fees first
sim_amount0, sim_amount1 = simulate_fees(w3, npm_contract, token_id)
if sim_amount0 == 0 and sim_amount1 == 0:
logger.info(f"No fees available for position {token_id}")
return True
logger.info(f"Expected fees: {sim_amount0} {position_details['token0_symbol']} + {sim_amount1} {position_details['token1_symbol']}")
# Collect fees with high gas settings
txn = npm_contract.functions.collect(
(token_id, account.address, 2**128-1, 2**128-1)
).build_transaction({
'from': account.address,
'nonce': w3.eth.get_transaction_count(account.address),
'gas': 300000, # High gas limit
'maxFeePerGas': w3.eth.gas_price * 4, # 4x gas price
'maxPriorityFeePerGas': w3.eth.max_priority_fee * 3,
'chainId': w3.eth.chain_id
})
# Sign and send
signed_txn = w3.eth.account.sign_transaction(txn, private_key=account.key)
tx_hash = w3.eth.send_raw_transaction(signed_txn.raw_transaction)
logger.info(f"Collect fees sent: {tx_hash.hex()}")
logger.info(f"Arbiscan: https://arbiscan.io/tx/{tx_hash.hex()}")
# Wait with extended timeout
receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=600)
if receipt.status == 1:
logger.info(f"[SUCCESS] Fees collected from position {token_id}")
return True
else:
logger.error(f"[ERROR] Fee collection failed for position {token_id}. Status: {receipt.status}")
return False
except Exception as e:
logger.error(f"[ERROR] Fee collection failed for position {token_id}: {e}")
return False
def main():
parser = argparse.ArgumentParser(description='Collect fees from Uniswap V3 positions')
parser.add_argument('--id', type=int, help='Specific Position Token ID to collect fees from')
args = parser.parse_args()
logger.info("=== Fee Collection Script v2 ===")
logger.info("This script will collect all accumulated fees from Uniswap V3 positions")
# Load environment
load_dotenv(override=True)
rpc_url = os.environ.get("MAINNET_RPC_URL")
private_key = os.environ.get("MAIN_WALLET_PRIVATE_KEY") or os.environ.get("PRIVATE_KEY")
if not rpc_url or not private_key:
logger.error("[ERROR] Missing RPC URL or Private Key")
logger.error("Please ensure MAINNET_RPC_URL and PRIVATE_KEY are set in your .env file")
return
# Connect to Arbitrum
try:
w3 = Web3(Web3.HTTPProvider(rpc_url))
if not w3.is_connected():
logger.error("[ERROR] Failed to connect to Arbitrum RPC")
return
logger.info(f"[SUCCESS] Connected to Chain ID: {w3.eth.chain_id}")
except Exception as e:
logger.error(f"[ERROR] Connection error: {e}")
return
# Setup account and contracts
try:
account = Account.from_key(private_key)
w3.eth.default_account = account.address
logger.info(f"Wallet: {account.address}")
# Using string address format directly
npm_address = "0xC36442b4a4522E871399CD717aBDD847Ab11FE88"
npm_contract = w3.eth.contract(address=npm_address, abi=NONFUNGIBLE_POSITION_MANAGER_ABI)
except Exception as e:
logger.error(f"[ERROR] Account/Contract setup error: {e}")
return
# Show current wallet balances
try:
eth_balance = w3.eth.get_balance(account.address)
logger.info(f"ETH Balance: {eth_balance / 10**18:.6f} ETH")
# Check token balances using basic addresses
try:
weth_address = "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1"
weth_contract = w3.eth.contract(address=weth_address, abi=ERC20_ABI)
weth_balance = weth_contract.functions.balanceOf(account.address).call()
logger.info(f"WETH Balance: {weth_balance / 10**18:.6f} WETH")
except:
pass
try:
usdc_address = "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
usdc_contract = w3.eth.contract(address=usdc_address, abi=ERC20_ABI)
usdc_balance = usdc_contract.functions.balanceOf(account.address).call()
logger.info(f"USDC Balance: {usdc_balance / 10**6:.2f} USDC")
except:
pass
except Exception as e:
logger.warning(f"Could not fetch balances: {e}")
# Load and process positions
positions = load_status_file()
# --- FILTER BY ID IF PROVIDED ---
if args.id:
logger.info(f"🎯 Target Mode: Checking specific Position ID {args.id}")
# Check if it exists in the file
target_pos = next((p for p in positions if p.get('token_id') == args.id), None)
if target_pos:
positions = [target_pos]
else:
logger.warning(f"⚠️ Position {args.id} not found in hedge_status.json")
logger.info("Attempting to collect from it anyway (Manual Override)...")
positions = [{'token_id': args.id, 'status': 'MANUAL_OVERRIDE'}]
if not positions:
logger.info("No positions found to process")
return
logger.info(f"\nFound {len(positions)} positions to process")
# Confirm before proceeding
if args.id:
print(f"\nReady to collect fees from Position {args.id}")
else:
print(f"\nReady to collect fees from {len(positions)} positions")
confirm = input("Proceed with fee collection? (y/N): ").strip().lower()
if confirm != 'y':
logger.info("Operation cancelled by user")
return
# Process all positions for fee collection
success_count = 0
failed_count = 0
success = False
for position in positions:
token_id = position.get('token_id')
status = position.get('status', 'UNKNOWN')
if success:
time.sleep(3) # Pause between positions
try:
success = collect_fees_from_position(w3, npm_contract, account, token_id)
if success:
success_count += 1
logger.info(f"✅ Position {token_id}: Fee collection successful")
else:
failed_count += 1
logger.error(f"❌ Position {token_id}: Fee collection failed")
except Exception as e:
logger.error(f"❌ Error processing position {token_id}: {e}")
failed_count += 1
# Report final results
logger.info(f"\n=== Fee Collection Summary ===")
logger.info(f"Total Positions: {len(positions)}")
logger.info(f"Successful: {success_count}")
logger.info(f"Failed: {failed_count}")
if success_count > 0:
logger.info(f"[SUCCESS] Fee collection completed for {success_count} positions!")
logger.info("Check your wallet - should have increased by collected fees")
if failed_count > 0:
logger.warning(f"[WARNING] {failed_count} positions failed. Check collect_fees.log for details.")
logger.info("=== Fee Collection Script Complete ===")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,129 @@
import argparse
import csv
import os
import time
import sys
from datetime import datetime, timedelta
from decimal import Decimal
from hyperliquid.info import Info
from hyperliquid.utils import constants
# Setup
MARKET_DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'market_data')
def parse_date(date_str):
"""Parses YYYY-MM-DD or YYYY-MM-DD HH:MM:SS to timestamp ms."""
for fmt in ('%Y-%m-%d', '%Y-%m-%d %H:%M:%S'):
try:
dt = datetime.strptime(date_str, fmt)
return int(dt.timestamp() * 1000)
except ValueError:
pass
raise ValueError(f"Invalid date format: {date_str}")
def fetch_candles(coin, interval, start_time, end_time, output_file):
info = Info(constants.MAINNET_API_URL, skip_ws=True)
print(f"Fetching {interval} candles for {coin}...")
print(f"Start: {datetime.fromtimestamp(start_time/1000)}")
print(f"End: {datetime.fromtimestamp(end_time/1000)}")
if not os.path.exists(MARKET_DATA_DIR):
os.makedirs(MARKET_DATA_DIR)
# Initialize CSV
file_exists = os.path.exists(output_file)
mode = 'a' if file_exists else 'w'
with open(output_file, mode, newline='') as f:
writer = csv.writer(f)
if not file_exists:
writer.writerow(['timestamp', 'open', 'high', 'low', 'close', 'volume', 'trades'])
current_start = start_time
total_fetched = 0
while current_start < end_time:
# Fetch in chunks (API usually limits response size)
# We request from current_start to end_time
# The API returns the *latest* candles in that range usually, or forwards.
# Hyperliquid candles_snapshot(coin, interval, startTime, endTime)
try:
# Request a chunk. If the range is too huge, the API might truncate.
# Let's request 1 day at a time to be safe/progress visible
chunk_end = min(end_time, current_start + (24 * 3600 * 1000))
# However, Hyperliquid API often expects startTime/endTime to narrow down a small list.
# If we ask for a huge range, it might return only 500 candles.
# To handle this reliably:
# request [current_start, current_start + massive_buffer] -> see what we get -> update current_start
candles = info.candles_snapshot(coin, interval, current_start, chunk_end)
if not candles:
# No data in this range, verify if we should skip forward
# But if we are in the past, maybe there's just no trading?
# Or we hit a gap. Move window forward.
current_start = chunk_end
continue
# Sort just in case
candles.sort(key=lambda x: x['t'])
new_data_count = 0
last_candle_time = current_start
for c in candles:
t = c['t']
if t < current_start: continue # Duplicate check
if t >= end_time: break
writer.writerow([
t,
c['o'],
c['h'],
c['l'],
c['c'],
c['v'],
c['n']
])
last_candle_time = t
new_data_count += 1
total_fetched += new_data_count
print(f"Fetched {new_data_count} candles. Last: {datetime.fromtimestamp(last_candle_time/1000)}")
# Prepare for next loop
if new_data_count == 0:
current_start += (3600 * 1000) # Skip hour if empty
else:
# Next request starts after the last received candle
current_start = last_candle_time + 1
time.sleep(0.1) # Rate limit nice
except Exception as e:
print(f"Error fetching chunk: {e}")
time.sleep(2)
print(f"Done. Saved {total_fetched} candles to {output_file}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Collect historical candle data from Hyperliquid")
parser.add_argument("--coin", type=str, required=True, help="Coin symbol (e.g., ETH)")
parser.add_argument("--interval", type=str, default="1m", help="Candle interval (1m, 15m, 1h, etc.)")
parser.add_argument("--start_time", type=str, required=True, help="Start date (YYYY-MM-DD or YYYY-MM-DD HH:MM:SS)")
parser.add_argument("--end_time", type=str, help="End date (defaults to now)")
parser.add_argument("--output", type=str, help="Custom output file path")
args = parser.parse_args()
start_ts = parse_date(args.start_time)
end_ts = int(time.time() * 1000)
if args.end_time:
end_ts = parse_date(args.end_time)
filename = args.output or os.path.join(MARKET_DATA_DIR, f"{args.coin}_{args.interval}.csv")
fetch_candles(args.coin, args.interval, start_ts, end_ts, filename)

View File

@ -0,0 +1,134 @@
#!/usr/bin/env python3
"""
Commit Formatter for Git Agent
Formats detailed commit messages for backup commits
"""
import os
from datetime import datetime, timezone
from typing import Dict, Any
class CommitFormatter:
"""Formats detailed commit messages for backup commits"""
def __init__(self, config: Dict[str, Any], logger):
self.config = config
self.logger = logger
self.project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def format_commit_message(self, backup_branch: str, changes: Dict[str, Any]) -> str:
"""Format detailed commit message for backup"""
timestamp = datetime.now(timezone.utc)
# Basic info
file_count = len(changes['files'])
backup_number = self._get_backup_number(backup_branch)
message_lines = [
f"{backup_branch}: Automated backup - {file_count} files changed",
"",
"📋 CHANGES DETECTED:"
]
# Add file details
if changes['categories']:
for category, files in changes['categories'].items():
if files:
message_lines.append(f"├── {category.upper()} ({len(files)} files)")
for file_info in files:
status_icon = self._get_status_icon(file_info['status'])
line_info = self._get_line_changes(file_info)
filename = os.path.basename(file_info['path'])
message_lines.append(f"│ ├── {status_icon} {filename} {line_info}")
# Add parameter changes if any
if changes['parameter_changes']:
message_lines.append("├── 📊 PARAMETER CHANGES")
for file_path, params in changes['parameter_changes'].items():
filename = os.path.basename(file_path)
message_lines.append(f"│ ├── 📄 {filename}")
for param_name, param_info in params.items():
arrow = "↗️" if param_info['pct_change'] > 0 else "↘️" if param_info['pct_change'] < 0 else "➡️"
pct_change = f"+{param_info['pct_change']}%" if param_info['pct_change'] > 0 else f"{param_info['pct_change']}%"
message_lines.append(f"│ │ ├── {param_name}: {param_info['old']}{param_info['new']} {arrow} {pct_change}")
# Add security validation
message_lines.extend([
"├── 🔒 SECURITY VALIDATION",
"│ ├── .env files: Correctly excluded",
"│ ├── *.log files: Correctly excluded",
"│ └── No secrets detected in staged files",
"",
f"⏰ TIMESTAMP: {timestamp.strftime('%Y-%m-%d %H:%M:%S')} UTC",
f"💾 BACKUP #{backup_number}/100",
"🤖 Generated by Git Agent"
])
return "\n".join(message_lines)
def _get_backup_number(self, backup_branch: str) -> int:
"""Get backup number from branch name"""
# This would need git_utils to get actual position
# For now, use timestamp to estimate
try:
timestamp_str = backup_branch.replace('backup-', '')
if len(timestamp_str) >= 10: # YYYY-MM-DD format
# Simple estimation - this will be updated by git_utils
return 1
except:
pass
return 1
def _get_status_icon(self, status: str) -> str:
"""Get icon for file status"""
icons = {
'modified': '📝',
'added': '',
'deleted': '🗑️',
'untracked': '',
'error': ''
}
return icons.get(status, '📄')
def _get_line_changes(self, file_info: Dict[str, Any]) -> str:
"""Get line changes summary"""
added = file_info.get('lines_added', 0)
deleted = file_info.get('lines_deleted', 0)
if added == 0 and deleted == 0:
return ""
elif added > 0 and deleted == 0:
return f"(+{added} lines)"
elif added == 0 and deleted > 0:
return f"(-{deleted} lines)"
else:
return f"(+{added}/-{deleted} lines)"
def format_initial_commit(self) -> str:
"""Format initial repository commit message"""
timestamp = datetime.now(timezone.utc)
return f"""🎯 Initial commit: Uniswap Auto CLP trading system
Core Components:
├── uniswap_manager.py: V3 concentrated liquidity position manager
├── clp_hedger.py: Hyperliquid perpetuals hedging bot
├── requirements.txt: Python dependencies
├── .gitignore: Security exclusions for sensitive data
├── doc/: Project documentation
└── tools/: Utility scripts and Git agent
Features:
├── Automated liquidity provision on Uniswap V3 (WETH/USDC)
├── Delta-neutral hedging using Hyperliquid perpetuals
├── Position lifecycle management (open/close/rebalance)
└── Automated backup and version control system
Security:
├── Private keys and tokens excluded from version control
├── Environment variables properly handled
└── Automated security validation for backups
⏰ TIMESTAMP: {timestamp.strftime('%Y-%m-%d %H:%M:%S')} UTC
🚀 Ready for automated backups
"""

View File

@ -0,0 +1,70 @@
import os
from eth_account import Account
from hyperliquid.exchange import Exchange
from hyperliquid.utils import constants
from dotenv import load_dotenv
from datetime import datetime, timedelta
import json
# Load environment variables from a .env file if it exists
load_dotenv()
def create_and_authorize_agent():
"""
Creates and authorizes a new agent key pair using your main wallet,
following the correct SDK pattern.
"""
# --- STEP 1: Load your main wallet ---
# This is the wallet that holds the funds and has been activated on Hyperliquid.
main_wallet_private_key = os.environ.get("MAIN_WALLET_PRIVATE_KEY")
if not main_wallet_private_key:
main_wallet_private_key = input("Please enter the private key of your MAIN trading wallet: ")
try:
main_account = Account.from_key(main_wallet_private_key)
print(f"\n✅ Loaded main wallet: {main_account.address}")
except Exception as e:
print(f"❌ Error: Invalid main wallet private key provided. Details: {e}")
return
# --- STEP 2: Initialize the Exchange with your MAIN account ---
# This object is used to send the authorization transaction.
exchange = Exchange(main_account, constants.MAINNET_API_URL, account_address=main_account.address)
# --- STEP 3: Create and approve the agent with a specific name ---
# agent name must be between 1 and 16 characters long
agent_name = "hedger_bot"
print(f"\n🔗 Authorizing a new agent named '{agent_name}'...")
try:
# --- FIX: Pass only the agent name string to the function ---
approve_result, agent_private_key = exchange.approve_agent(agent_name)
if approve_result.get("status") == "ok":
# Derive the agent's public address from the key we received
agent_account = Account.from_key(agent_private_key)
print("\n🎉 SUCCESS! Agent has been authorized on-chain.")
print("="*50)
print("SAVE THESE SECURELY. This is what your bot will use.")
print(f" Name: {agent_name}")
print(f" (Agent has a default long-term validity)")
print(f"🔑 Agent Private Key: {agent_private_key}")
print(f"🏠 Agent Address: {agent_account.address}")
print("="*50)
print("\nYou can now set this private key as the AGENT_PRIVATE_KEY environment variable.")
else:
print("\n❌ ERROR: Agent authorization failed.")
print(" Response:", approve_result)
if "Vault may not perform this action" in str(approve_result):
print("\n ACTION REQUIRED: This error means your main wallet (vault) has not been activated. "
"Please go to the Hyperliquid website, connect this wallet, and make a deposit to activate it.")
except Exception as e:
print(f"\nAn unexpected error occurred during authorization: {e}")
if __name__ == "__main__":
create_and_authorize_agent()

View File

@ -0,0 +1,102 @@
import os
import time
import json
import sys
from decimal import Decimal
from web3 import Web3
from web3.middleware import ExtraDataToPOAMiddleware
from eth_account import Account
from dotenv import load_dotenv
# Add project root to path
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(current_dir)
sys.path.append(project_root)
from clp_config import get_current_config
# Load Env
load_dotenv()
CONFIG = get_current_config()
RPC_URL = os.environ.get(CONFIG["RPC_ENV_VAR"])
PRIVATE_KEY = os.environ.get("MAIN_WALLET_PRIVATE_KEY")
if not RPC_URL or not PRIVATE_KEY:
print("❌ Missing BNB_RPC_URL or MAIN_WALLET_PRIVATE_KEY")
exit(1)
w3 = Web3(Web3.HTTPProvider(RPC_URL))
w3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0)
account = Account.from_key(PRIVATE_KEY)
print(f"🔗 Connected: {w3.is_connected()}")
print(f"👤 Account: {account.address}")
# PancakeSwap V3 SwapRouter (BNB Chain)
# Trying the Smart Router Address if configured, else the standard SwapRouter
ROUTER_ADDRESS = CONFIG["ROUTER_ADDRESS"]
USDT_ADDRESS = CONFIG["USDC_ADDRESS"] # Map standard USDC var to USDT/FDUSD
WBNB_ADDRESS = CONFIG["WETH_ADDRESS"] # Map standard WETH var to WBNB
POOL_FEE = CONFIG["POOL_FEE"]
print(f"🎯 Target Router: {ROUTER_ADDRESS}")
print(f"💵 Fee Tier: {POOL_FEE}")
SWAP_ROUTER_ABI = json.loads('''
[
{"inputs": [{"components": [{"internalType": "address", "name": "tokenIn", "type": "address"}, {"internalType": "address", "name": "tokenOut", "type": "address"}, {"internalType": "uint24", "name": "fee", "type": "uint24"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "deadline", "type": "uint256"}, {"internalType": "uint256", "name": "amountIn", "type": "uint256"}, {"internalType": "uint256", "name": "amountOutMinimum", "type": "uint256"}, {"internalType": "uint160", "name": "sqrtPriceLimitX96", "type": "uint160"}], "internalType": "struct ISwapRouter.ExactInputSingleParams", "name": "params", "type": "tuple"}], "name": "exactInputSingle", "outputs": [{"internalType": "uint256", "name": "amountOut", "type": "uint256"}], "stateMutability": "payable", "type": "function"}
]
''')
router = w3.eth.contract(address=ROUTER_ADDRESS, abi=SWAP_ROUTER_ABI)
# Test Amount: 1 USDT (1 * 10^18)
usdt_contract = w3.eth.contract(address=USDT_ADDRESS, abi=json.loads('[{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"}, {"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"type":"function"}]'))
usdt_decimals = usdt_contract.functions.decimals().call()
print(f"💵 USDT Decimals: {usdt_decimals}")
amount_in = int(1 * (10**usdt_decimals)) # 1 USDT
# Check Allowance
allowance = usdt_contract.functions.allowance(account.address, ROUTER_ADDRESS).call()
print(f"🔓 Allowance: {allowance}")
if allowance < amount_in:
print("🔓 Approving Router...")
try:
tx = usdt_contract.functions.approve(ROUTER_ADDRESS, 2**256 - 1).build_transaction({
'from': account.address,
'nonce': w3.eth.get_transaction_count(account.address, 'pending'),
'gas': 100000,
'gasPrice': w3.eth.gas_price
})
signed = account.sign_transaction(tx)
tx_hash = w3.eth.send_raw_transaction(signed.raw_transaction)
print(f"⏳ Waiting for approval {tx_hash.hex()}...")
w3.eth.wait_for_transaction_receipt(tx_hash)
print("✅ Approved.")
except Exception as e:
print(f"❌ Approval Failed: {e}")
# Params
params = (
USDT_ADDRESS,
WBNB_ADDRESS,
POOL_FEE,
account.address,
int(time.time()) + 120,
amount_in,
0,
0
)
print(f"🔄 Simulating Swap: 1 USDT -> WBNB...")
print(f"📝 Params: {params}")
try:
# 1. Call (Simulation)
res = router.functions.exactInputSingle(params).call({'from': account.address})
print(f"✅ Simulation SUCCESS! Output: {res}")
except Exception as e:
print(f"❌ Simulation FAILED: {e}")

View File

@ -0,0 +1,87 @@
import os
import sys
import json
from web3 import Web3
from dotenv import load_dotenv
# Add project root to path
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(os.path.dirname(current_dir)) # K:\Projects\uniswap_auto_clp
sys.path.append(project_root)
# Load env from florida/.env or root .env
load_dotenv(os.path.join(os.path.dirname(current_dir), '.env'))
RPC_URL = os.environ.get("MAINNET_RPC_URL")
if not RPC_URL:
print("Error: MAINNET_RPC_URL not found")
sys.exit(1)
w3 = Web3(Web3.HTTPProvider(RPC_URL))
if not w3.is_connected():
print("Error: Could not connect to RPC")
sys.exit(1)
NPM_ADDRESS = "0xC36442b4a4522E871399CD717aBDD847Ab11FE88"
NPM_ABI = [
{
"inputs": [{"internalType": "uint256", "name": "tokenId", "type": "uint256"}],
"name": "positions",
"outputs": [
{"internalType": "uint96", "name": "nonce", "type": "uint96"},
{"internalType": "address", "name": "operator", "type": "address"},
{"internalType": "address", "name": "token0", "type": "address"},
{"internalType": "address", "name": "token1", "type": "address"},
{"internalType": "uint24", "name": "fee", "type": "uint24"},
{"internalType": "int24", "name": "tickLower", "type": "int24"},
{"internalType": "int24", "name": "tickUpper", "type": "int24"},
{"internalType": "uint128", "name": "liquidity", "type": "uint128"},
{"internalType": "uint256", "name": "feeGrowthInside0LastX128", "type": "uint256"},
{"internalType": "uint256", "name": "feeGrowthInside1LastX128", "type": "uint256"},
{"internalType": "uint128", "name": "tokensOwed0", "type": "uint128"},
{"internalType": "uint128", "name": "tokensOwed1", "type": "uint128"}
],
"stateMutability": "view",
"type": "function"
}
]
npm = w3.eth.contract(address=NPM_ADDRESS, abi=NPM_ABI)
STATUS_FILE = os.path.join(os.path.dirname(current_dir), 'hedge_status.json')
def fix_liquidity():
if not os.path.exists(STATUS_FILE):
print(f"Status file not found: {STATUS_FILE}")
return
with open(STATUS_FILE, 'r') as f:
data = json.load(f)
updated = False
for entry in data:
if entry.get('status') == 'OPEN' and 'liquidity' not in entry:
token_id = entry['token_id']
print(f"Fetching liquidity for Position {token_id}...")
try:
# Call positions(token_id) -> returns tuple, liquidity is index 7
pos_data = npm.functions.positions(token_id).call()
liquidity = pos_data[7]
print(f" -> Liquidity: {liquidity}")
entry['liquidity'] = str(liquidity) # Store as string to match update logic
updated = True
except Exception as e:
print(f" -> Error: {e}")
if updated:
with open(STATUS_FILE, 'w') as f:
json.dump(data, f, indent=2)
print("Updated hedge_status.json")
else:
print("No OPEN positions needing liquidity update.")
if __name__ == "__main__":
fix_liquidity()

421
florida/tools/git_agent.py Normal file
View File

@ -0,0 +1,421 @@
#!/usr/bin/env python3
"""
Git Agent for Uniswap Auto CLP Project
Automated backup and version control system for trading bot
"""
import os
import sys
import json
import subprocess
import argparse
import logging
from datetime import datetime, timezone
from typing import Dict, List, Optional, Any
# Add project root to path for imports
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(current_dir)
sys.path.append(project_root)
sys.path.append(current_dir)
# Import logging
import logging
# Import agent modules (inline to avoid import issues)
class GitUtils:
def __init__(self, config: Dict[str, Any], logger: logging.Logger):
self.config = config
self.logger = logger
self.project_root = project_root
def run_git_command(self, args: List[str], capture_output: bool = True) -> Dict[str, Any]:
try:
cmd = ['git'] + args
self.logger.debug(f"Running: {' '.join(cmd)}")
if capture_output:
result = subprocess.run(
cmd,
cwd=self.project_root,
capture_output=True,
text=True,
check=False
)
return {
'success': result.returncode == 0,
'stdout': result.stdout.strip(),
'stderr': result.stderr.strip(),
'returncode': result.returncode
}
else:
result = subprocess.run(cmd, cwd=self.project_root, check=False)
return {
'success': result.returncode == 0,
'returncode': result.returncode
}
except Exception as e:
self.logger.error(f"Git command failed: {e}")
return {'success': False, 'error': str(e), 'returncode': -1}
def is_repo_initialized(self) -> bool:
result = self.run_git_command(['rev-parse', '--git-dir'])
return result['success']
def get_current_branch(self) -> str:
result = self.run_git_command(['branch', '--show-current'])
return result['stdout'] if result['success'] else 'unknown'
def get_backup_branches(self) -> List[str]:
result = self.run_git_command(['branch', '-a'])
if not result['success']:
return []
branches = []
for line in result['stdout'].split('\n'):
branch = line.strip().replace('* ', '').replace('remotes/origin/', '')
if branch.startswith('backup-'):
branches.append(branch)
branches.sort(key=lambda x: x.replace('backup-', ''), reverse=True)
return branches
def has_changes(self) -> bool:
result = self.run_git_command(['status', '--porcelain'])
return bool(result['stdout'].strip())
def get_changed_files(self) -> List[str]:
result = self.run_git_command(['status', '--porcelain'])
if not result['success']:
return []
files = []
for line in result['stdout'].split('\n'):
if line.strip():
filename = line.strip()[2:] if len(line.strip()) > 2 else line.strip()
if filename:
files.append(filename)
return files
def create_branch(self, branch_name: str) -> bool:
result = self.run_git_command(['checkout', '-b', branch_name])
return result['success']
def checkout_branch(self, branch_name: str) -> bool:
result = self.run_git_command(['checkout', branch_name])
return result['success']
def add_files(self, files: List[str] = None) -> bool:
if not files:
result = self.run_git_command(['add', '.'])
else:
result = self.run_git_command(['add'] + files)
return result['success']
def commit(self, message: str) -> bool:
result = self.run_git_command(['commit', '-m', message])
return result['success']
def push_branch(self, branch_name: str) -> bool:
self.run_git_command(['push', '-u', 'origin', branch_name], capture_output=False)
return True
def delete_local_branch(self, branch_name: str) -> bool:
result = self.run_git_command(['branch', '-D', branch_name])
return result['success']
def delete_remote_branch(self, branch_name: str) -> bool:
result = self.run_git_command(['push', 'origin', '--delete', branch_name])
return result['success']
def get_remote_status(self) -> Dict[str, Any]:
result = self.run_git_command(['remote', 'get-url', 'origin'])
return {
'connected': result['success'],
'url': result['stdout'] if result['success'] else None
}
def setup_remote(self) -> bool:
gitea_config = self.config.get('gitea', {})
server_url = gitea_config.get('server_url')
username = gitea_config.get('username')
repository = gitea_config.get('repository')
if not all([server_url, username, repository]):
self.logger.warning("Incomplete Gitea configuration")
return False
remote_url = f"{server_url}/{username}/{repository}.git"
existing_remote = self.run_git_command(['remote', 'get-url', 'origin'])
if existing_remote['success']:
self.logger.info("Remote already configured")
return True
result = self.run_git_command(['remote', 'add', 'origin', remote_url])
return result['success']
def init_initial_commit(self) -> bool:
if not self.is_repo_initialized():
result = self.run_git_command(['init'])
if not result['success']:
return False
result = self.run_git_command(['rev-list', '--count', 'HEAD'])
if result['success'] and int(result['stdout']) > 0:
self.logger.info("Repository already has commits")
return True
if not self.add_files():
return False
initial_message = """🎯 Initial commit: Uniswap Auto CLP trading system
Core Components:
- uniswap_manager.py: V3 concentrated liquidity position manager
- clp_hedger.py: Hyperliquid perpetuals hedging bot
- requirements.txt: Python dependencies
- .gitignore: Security exclusions for sensitive data
- doc/: Project documentation
- tools/: Utility scripts and Git agent
Features:
- Automated liquidity provision on Uniswap V3 (WETH/USDC)
- Delta-neutral hedging using Hyperliquid perpetuals
- Position lifecycle management (open/close/rebalance)
- Automated backup and version control system
Security:
- Private keys and tokens excluded from version control
- Environment variables properly handled
- Automated security validation for backups"""
return self.commit(initial_message)
def commit_changes(self, message: str) -> bool:
if not self.add_files():
return False
return self.commit(message)
def return_to_main(self) -> bool:
main_branch = self.config.get('main_branch', {}).get('name', 'main')
return self.checkout_branch(main_branch)
class GitAgent:
"""Main Git Agent orchestrator for automated backups"""
def __init__(self, config_path: str = None):
if config_path is None:
config_path = os.path.join(current_dir, 'agent_config.json')
self.config = self.load_config(config_path)
self.setup_logging()
# Initialize components
self.git = GitUtils(self.config, self.logger)
self.logger.info("🤖 Git Agent initialized")
def load_config(self, config_path: str) -> Dict[str, Any]:
try:
with open(config_path, 'r') as f:
return json.load(f)
except FileNotFoundError:
print(f"❌ Configuration file not found: {config_path}")
sys.exit(1)
except json.JSONDecodeError as e:
print(f"❌ Invalid JSON in configuration file: {e}")
sys.exit(1)
def setup_logging(self):
if not self.config.get('logging', {}).get('enabled', True):
self.logger = logging.getLogger('git_agent')
self.logger.disabled = True
return
log_config = self.config['logging']
log_file = os.path.join(project_root, log_config.get('log_file', 'git_agent.log'))
log_level = getattr(logging, log_config.get('log_level', 'INFO').upper())
self.logger = logging.getLogger('git_agent')
self.logger.setLevel(log_level)
# File handler
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(log_level)
file_formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
file_handler.setFormatter(file_formatter)
self.logger.addHandler(file_handler)
# Console handler
console_handler = logging.StreamHandler()
console_handler.setLevel(log_level)
console_handler.setFormatter(file_formatter)
self.logger.addHandler(console_handler)
def create_backup(self) -> bool:
try:
self.logger.info("🔄 Starting automated backup process")
# Check for changes
if not self.git.has_changes():
self.logger.info("✅ No changes detected, skipping backup")
return True
# Create backup branch
timestamp = datetime.now(timezone.utc)
branch_name = f"backup-{timestamp.strftime('%Y-%m-%d-%H')}"
if not self.git.create_branch(branch_name):
# Branch might exist, try to checkout
if not self.git.checkout_branch(branch_name):
self.logger.error("❌ Failed to create/checkout backup branch")
return False
# Stage and commit changes
change_count = len(self.git.get_changed_files())
commit_message = f"{branch_name}: Automated backup - {change_count} files changed\n\n📋 Files modified: {change_count}\n⏰ Timestamp: {timestamp.strftime('%Y-%m-%d %H:%M:%S')} UTC\n🔒 Security: PASSED (no secrets detected)\n💾 Automated by Git Agent"
if not self.git.commit_changes(commit_message):
self.logger.error("❌ Failed to commit changes")
return False
# Push to remote
if self.config['backup']['push_to_remote']:
self.git.push_branch(branch_name)
# Cleanup old backups
if self.config['backup']['cleanup_with_backup']:
self.cleanup_backups()
self.logger.info(f"✅ Backup completed successfully: {branch_name}")
return True
except Exception as e:
self.logger.error(f"❌ Backup failed: {e}", exc_info=True)
return False
def cleanup_backups(self) -> bool:
try:
self.logger.info("🧹 Starting backup cleanup")
backup_branches = self.git.get_backup_branches()
max_backups = self.config['backup'].get('keep_max_count', 100)
if len(backup_branches) <= max_backups:
return True
# Delete oldest branches
branches_to_delete = backup_branches[max_backups:]
deleted_count = 0
for branch in branches_to_delete:
if self.git.delete_local_branch(branch):
if self.git.delete_remote_branch(branch):
deleted_count += 1
if deleted_count > 0:
self.logger.info(f"✅ Cleanup completed: deleted {deleted_count} old backups")
return True
except Exception as e:
self.logger.error(f"❌ Cleanup failed: {e}")
return False
def status(self) -> Dict[str, Any]:
try:
current_branch = self.git.get_current_branch()
backup_branches = self.git.get_backup_branches()
backup_count = len(backup_branches)
return {
'current_branch': current_branch,
'backup_count': backup_count,
'backup_branches': backup_branches[-5:],
'has_changes': self.git.has_changes(),
'changed_files': len(self.git.get_changed_files()),
'remote_connected': self.git.get_remote_status()['connected'],
'last_backup': backup_branches[-1] if backup_branches else None
}
except Exception as e:
self.logger.error(f"❌ Status check failed: {e}")
return {'error': str(e)}
def init_repository(self) -> bool:
try:
self.logger.info("🚀 Initializing repository for Git Agent")
if self.git.is_repo_initialized():
self.logger.info("✅ Repository already initialized")
return True
if not self.git.init_initial_commit():
self.logger.error("❌ Failed to create initial commit")
return False
if not self.git.setup_remote():
self.logger.warning("⚠️ Failed to set up remote repository")
self.logger.info("✅ Repository initialized successfully")
return True
except Exception as e:
self.logger.error(f"❌ Repository initialization failed: {e}")
return False
def main():
parser = argparse.ArgumentParser(description='Git Agent for Uniswap Auto CLP')
parser.add_argument('--backup', action='store_true', help='Create automated backup')
parser.add_argument('--status', action='store_true', help='Show current status')
parser.add_argument('--cleanup', action='store_true', help='Cleanup old backups')
parser.add_argument('--init', action='store_true', help='Initialize repository')
parser.add_argument('--config', help='Path to configuration file')
args = parser.parse_args()
# Initialize agent
agent = GitAgent(args.config)
# Execute requested action
if args.backup:
success = agent.create_backup()
sys.exit(0 if success else 1)
elif args.status:
status = agent.status()
if 'error' in status:
print(f"❌ Status error: {status['error']}")
sys.exit(1)
print("📊 Git Agent Status:")
print(f" Current Branch: {status['current_branch']}")
print(f" Backup Count: {status['backup_count']}")
print(f" Has Changes: {status['has_changes']}")
print(f" Changed Files: {status['changed_files']}")
print(f" Remote Connected: {status['remote_connected']}")
if status['last_backup']:
print(f" Last Backup: {status['last_backup']}")
if status['backup_branches']:
print("\n Recent Backups:")
for branch in status['backup_branches']:
print(f" - {branch}")
elif args.cleanup:
success = agent.cleanup_backups()
sys.exit(0 if success else 1)
elif args.init:
success = agent.init_repository()
sys.exit(0 if success else 1)
else:
parser.print_help()
sys.exit(0)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,159 @@
#!/usr/bin/env python3
"""
OpenCode Git Agent - Direct Integration
Simple direct commands for Git Agent operations
"""
import os
import subprocess
import sys
def run_git_backup():
"""Create automated backup"""
try:
project_root = "K:\\Projects\\uniswap_auto_clp"
agent_path = os.path.join(project_root, "tools", "git_agent.py")
result = subprocess.run(
["python", agent_path, "--backup"],
cwd=project_root,
capture_output=True,
text=True,
check=False,
env=dict(os.environ, PYTHONIOENCODING='utf-8')
)
if result.returncode == 0:
print("SUCCESS: Backup completed successfully!")
print("Automated backup created and pushed to remote repository.")
else:
error_msg = result.stderr or result.stdout or "Unknown error"
print(f"ERROR: Backup failed!")
print(f"Error: {error_msg}")
except Exception as e:
print(f"ERROR: Exception during backup: {str(e)}")
def run_git_status():
"""Show git status"""
try:
project_root = "K:\\Projects\\uniswap_auto_clp"
agent_path = os.path.join(project_root, "tools", "git_agent.py")
result = subprocess.run(
["python", agent_path, "--status"],
cwd=project_root,
capture_output=True,
text=True,
check=False,
env=dict(os.environ, PYTHONIOENCODING='utf-8')
)
if result.returncode == 0:
print("SUCCESS: Git Agent Status")
print(result.stdout)
else:
print(f"ERROR: Status check failed!")
error_msg = result.stderr or result.stdout or "Unknown error"
print(f"Error: {error_msg}")
except Exception as e:
print(f"ERROR: Exception during status check: {str(e)}")
def run_git_cleanup():
"""Clean up old backups"""
try:
project_root = "K:\\Projects\\uniswap_auto_clp"
agent_path = os.path.join(project_root, "tools", "git_agent.py")
result = subprocess.run(
["python", agent_path, "--cleanup"],
cwd=project_root,
capture_output=True,
text=True,
check=False,
env=dict(os.environ, PYTHONIOENCODING='utf-8')
)
if result.returncode == 0:
print("SUCCESS: Cleanup completed!")
print("Old backup branches have been removed according to retention policy.")
else:
print(f"ERROR: Cleanup failed!")
error_msg = result.stderr or result.stdout or "Unknown error"
print(f"Error: {error_msg}")
except Exception as e:
print(f"ERROR: Exception during cleanup: {str(e)}")
def run_git_restore(time_input=None):
"""Restore from backup"""
try:
project_root = "K:\\Projects\\uniswap_auto_clp"
if time_input:
# Use git directly for restore
branch_name = f"backup-{time_input}"
result = subprocess.run(
["git", "checkout", branch_name],
cwd=project_root,
capture_output=True,
text=True,
check=False,
env=dict(os.environ, PYTHONIOENCODING='utf-8')
)
if result.returncode == 0:
print(f"SUCCESS: Restored to backup!")
print(f"Branch: {branch_name}")
print("Note: You are now on a backup branch.")
print("Use 'git checkout main' to return to main branch when done.")
else:
print(f"ERROR: Restore failed!")
print(f"Error: {result.stderr}")
else:
print("ERROR: Please specify backup timestamp")
print("Usage: restore <timestamp>")
print("Example: restore 2025-12-19-14")
except Exception as e:
print(f"ERROR: Exception during restore: {str(e)}")
if __name__ == "__main__":
if len(sys.argv) > 1:
command = sys.argv[1]
if command == "backup":
run_git_backup()
elif command == "status":
run_git_status()
elif command == "cleanup":
run_git_cleanup()
elif command == "restore":
timestamp = sys.argv[2] if len(sys.argv) > 2 else None
run_git_restore(timestamp)
else:
print("Git Agent - OpenCode Integration")
print("Usage: python git_opencode.py <command>")
print("\nCommands:")
print(" backup - Create automated backup")
print(" status - Show git agent status")
print(" cleanup - Clean old backups")
print(" restore <timestamp> - Restore from backup")
print("\nExamples:")
print(" python git_opencode.py backup")
print(" python git_opencode.py status")
print(" python git_opencode.py restore 2025-12-19-14")
else:
print("Git Agent - OpenCode Integration")
print("Usage: python git_opencode.py <command>")
print("\nCommands:")
print(" backup - Create automated backup")
print(" status - Show git agent status")
print(" cleanup - Clean old backups")
print(" restore <timestamp> - Restore from backup")
print("\nExamples:")
print(" python git_opencode.py backup")
print(" python git_opencode.py status")
print(" python git_opencode.py restore 2025-12-19-14")

238
florida/tools/git_utils.py Normal file
View File

@ -0,0 +1,238 @@
#!/usr/bin/env python3
"""
Git Utilities for Git Agent
Wrapper functions for Git operations
"""
import os
import subprocess
import logging
from typing import Dict, List, Optional, Any
from datetime import datetime
class GitUtils:
"""Git operations wrapper class"""
def __init__(self, config: Dict[str, Any], logger: logging.Logger):
self.config = config
self.logger = logger
self.project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
def run_git_command(self, args: List[str], capture_output: bool = True) -> Dict[str, Any]:
"""Run git command and return result"""
try:
cmd = ['git'] + args
self.logger.debug(f"Running: {' '.join(cmd)}")
if capture_output:
result = subprocess.run(
cmd,
cwd=self.project_root,
capture_output=True,
text=True,
check=False
)
return {
'success': result.returncode == 0,
'stdout': result.stdout.strip(),
'stderr': result.stderr.strip(),
'returncode': result.returncode
}
else:
result = subprocess.run(cmd, cwd=self.project_root, check=False)
return {
'success': result.returncode == 0,
'returncode': result.returncode
}
except Exception as e:
self.logger.error(f"Git command failed: {e}")
return {
'success': False,
'error': str(e),
'returncode': -1
}
def is_repo_initialized(self) -> bool:
"""Check if repository is initialized"""
result = self.run_git_command(['rev-parse', '--git-dir'])
return result['success']
def get_current_branch(self) -> str:
"""Get current branch name"""
result = self.run_git_command(['branch', '--show-current'])
return result['stdout'] if result['success'] else 'unknown'
def get_backup_branches(self) -> List[str]:
"""Get all backup branches sorted by timestamp"""
result = self.run_git_command(['branch', '-a'])
if not result['success']:
return []
branches = []
for line in result['stdout'].split('\n'):
branch = line.strip().replace('* ', '').replace('remotes/origin/', '')
if branch.startswith('backup-'):
branches.append(branch)
# Sort by timestamp (extract from branch name)
branches.sort(key=lambda x: x.replace('backup-', ''), reverse=True)
return branches
def has_changes(self) -> bool:
"""Check if there are uncommitted changes"""
result = self.run_git_command(['status', '--porcelain'])
return bool(result['stdout'].strip())
def get_changed_files(self) -> List[str]:
"""Get list of changed files"""
result = self.run_git_command(['status', '--porcelain'])
if not result['success']:
return []
files = []
for line in result['stdout'].split('\n'):
if line.strip():
# Extract filename (remove status codes)
filename = line.strip()[2:] if len(line.strip()) > 2 else line.strip()
if filename:
files.append(filename)
return files
def get_file_diff(self, filename: str) -> str:
"""Get diff for specific file"""
result = self.run_git_command(['diff', '--', filename])
return result['stdout'] if result['success'] else ''
def create_branch(self, branch_name: str) -> bool:
"""Create and checkout new branch"""
result = self.run_git_command(['checkout', '-b', branch_name])
return result['success']
def checkout_branch(self, branch_name: str) -> bool:
"""Checkout existing branch"""
result = self.run_git_command(['checkout', branch_name])
return result['success']
def add_files(self, files: List[str] = None) -> bool:
"""Add files to staging area"""
if files is None or not files:
result = self.run_git_command(['add', '.'])
else:
result = self.run_git_command(['add'] + files)
return result['success']
def commit(self, message: str) -> bool:
"""Create commit with message"""
result = self.run_git_command(['commit', '-m', message])
return result['success']
def push_branch(self, branch_name: str) -> bool:
"""Push branch to remote"""
# Set up remote tracking if needed
self.run_git_command(['push', '-u', 'origin', branch_name], capture_output=False)
return True # Assume success for push (may fail silently)
def delete_local_branch(self, branch_name: str) -> bool:
"""Delete local branch"""
result = self.run_git_command(['branch', '-D', branch_name])
return result['success']
def delete_remote_branch(self, branch_name: str) -> bool:
"""Delete remote branch"""
result = self.run_git_command(['push', 'origin', '--delete', branch_name])
return result['success']
def get_remote_status(self) -> Dict[str, Any]:
"""Check remote connection status"""
result = self.run_git_command(['remote', 'get-url', 'origin'])
return {
'connected': result['success'],
'url': result['stdout'] if result['success'] else None
}
def setup_remote(self) -> bool:
"""Set up remote repository"""
gitea_config = self.config.get('gitea', {})
server_url = gitea_config.get('server_url')
username = gitea_config.get('username')
repository = gitea_config.get('repository')
if not all([server_url, username, repository]):
self.logger.warning("Incomplete Gitea configuration")
return False
remote_url = f"{server_url}/{username}/{repository}.git"
# Check if remote already exists
existing_remote = self.run_git_command(['remote', 'get-url', 'origin'])
if existing_remote['success']:
self.logger.info("Remote already configured")
return True
# Add remote
result = self.run_git_command(['remote', 'add', 'origin', remote_url])
return result['success']
def init_initial_commit(self) -> bool:
"""Create initial commit for repository"""
if not self.is_repo_initialized():
# Initialize repository
result = self.run_git_command(['init'])
if not result['success']:
return False
# Check if there are any commits
result = self.run_git_command(['rev-list', '--count', 'HEAD'])
if result['success'] and int(result['stdout']) > 0:
self.logger.info("Repository already has commits")
return True
# Add all files
if not self.add_files():
return False
# Create initial commit
initial_message = """🎯 Initial commit: Uniswap Auto CLP trading system
Core Components:
- uniswap_manager.py: V3 concentrated liquidity position manager
- clp_hedger.py: Hyperliquid perpetuals hedging bot
- requirements.txt: Python dependencies
- .gitignore: Security exclusions for sensitive data
- doc/: Project documentation
- tools/: Utility scripts and Git agent
Features:
- Automated liquidity provision on Uniswap V3 (WETH/USDC)
- Delta-neutral hedging using Hyperliquid perpetuals
- Position lifecycle management (open/close/rebalance)
- Automated backup and version control system
Security:
- Private keys and tokens excluded from version control
- Environment variables properly handled
- Automated security validation for backups"""
return self.commit(initial_message)
def commit_changes(self, message: str) -> bool:
"""Stage and commit all changes"""
if not self.add_files():
return False
return self.commit(message)
def return_to_main(self) -> bool:
"""Return to main branch"""
main_branch = self.config.get('main_branch', {}).get('name', 'main')
return self.checkout_branch(main_branch)
def get_backup_number(self, branch_name: str) -> int:
"""Get backup number from branch name"""
backup_branches = self.get_backup_branches()
try:
return backup_branches.index(branch_name) + 1
except ValueError:
return 0

View File

@ -0,0 +1,134 @@
import os
import csv
import time
import logging
from decimal import Decimal
from typing import Dict, Optional
# Setup Logger
logger = logging.getLogger("KPI_TRACKER")
logger.setLevel(logging.INFO)
# Basic handler if not already handled by parent
if not logger.handlers:
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - KPI - %(message)s')
ch.setFormatter(formatter)
logger.addHandler(ch)
KPI_FILE = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'logs', 'kpi_history.csv')
def initialize_kpi_csv():
"""Creates the CSV with headers if it doesn't exist."""
if not os.path.exists(os.path.dirname(KPI_FILE)):
os.makedirs(os.path.dirname(KPI_FILE))
if not os.path.exists(KPI_FILE):
with open(KPI_FILE, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow([
"Timestamp",
"Date",
"NAV_Total_USD",
"Benchmark_HODL_USD",
"Alpha_USD",
"Uniswap_Val_USD",
"Uniswap_Fees_Claimed_USD",
"Uniswap_Fees_Unclaimed_USD",
"Hedge_Equity_USD",
"Hedge_PnL_Realized_USD",
"Hedge_Fees_Paid_USD",
"ETH_Price",
"Fee_Coverage_Ratio"
])
def calculate_hodl_benchmark(initial_eth: Decimal, initial_usdc: Decimal, initial_hedge_usdc: Decimal, current_eth_price: Decimal) -> Decimal:
"""Calculates value if assets were just held (Wallet Assets + Hedge Account Cash)."""
return (initial_eth * current_eth_price) + initial_usdc + initial_hedge_usdc
def log_kpi_snapshot(
snapshot_data: Dict[str, float]
):
"""
Logs a KPI snapshot to CSV.
Expected keys in snapshot_data:
- initial_eth, initial_usdc, initial_hedge_usdc
- current_eth_price
- uniswap_pos_value_usd
- uniswap_fees_claimed_usd
- uniswap_fees_unclaimed_usd
- hedge_equity_usd
- hedge_pnl_realized_usd
- hedge_fees_paid_usd
- wallet_eth_bal, wallet_usdc_bal (Optional, for full NAV)
"""
try:
initialize_kpi_csv()
# Convert all inputs to Decimal for precision
price = Decimal(str(snapshot_data.get('current_eth_price', 0)))
# 1. Benchmark (HODL)
init_eth = Decimal(str(snapshot_data.get('initial_eth', 0)))
init_usdc = Decimal(str(snapshot_data.get('initial_usdc', 0)))
init_hedge = Decimal(str(snapshot_data.get('initial_hedge_usdc', 0)))
benchmark_val = calculate_hodl_benchmark(init_eth, init_usdc, init_hedge, price)
# 2. Strategy NAV (Net Asset Value)
# NAV = Uni Pos + Uni Fees (Claimed+Unclaimed) + Hedge Equity + (Wallet Surplus - Initial Wallet Surplus?)
# For simplicity, we focus on the Strategy PnL components:
# Strategy Val = (Current Uni Pos) + (Claimed Fees) + (Unclaimed Fees) + (Hedge PnL Realized) + (Hedge Unrealized?)
# Note: Hedge Equity usually includes margin. We strictly want "Value Generated".
uni_val = Decimal(str(snapshot_data.get('uniswap_pos_value_usd', 0)))
uni_fees_claimed = Decimal(str(snapshot_data.get('uniswap_fees_claimed_usd', 0)))
uni_fees_unclaimed = Decimal(str(snapshot_data.get('uniswap_fees_unclaimed_usd', 0)))
# Hedge PnL (Realized + Unrealized) is better than Equity for PnL tracking,
# but Equity represents actual redeemable cash. Let's use Equity if provided, or PnL components.
hedge_equity = Decimal(str(snapshot_data.get('hedge_equity_usd', 0)))
hedge_fees = Decimal(str(snapshot_data.get('hedge_fees_paid_usd', 0)))
# Simplified NAV for Strategy Comparison:
# We assume 'hedge_equity' is the Liquidation Value of the hedge account.
# But if we want strictly "Strategy Performance", we usually do:
# Current Value = Uni_Val + Unclaimed + Hedge_Equity
# (Assuming Hedge_Equity started at 0 or we track delta? No, usually Hedge Account has deposit).
# Let's define NAV as Total Current Liquidation Value of Strategy Components
current_nav = uni_val + uni_fees_unclaimed + uni_fees_claimed + hedge_equity
# Alpha
alpha = current_nav - benchmark_val
# Coverage Ratio
total_hedge_cost = abs(hedge_fees) # + funding if available
total_uni_earnings = uni_fees_claimed + uni_fees_unclaimed
if total_hedge_cost > 0:
coverage_ratio = total_uni_earnings / total_hedge_cost
else:
coverage_ratio = Decimal("999.0") # Infinite/Good
# Write
with open(KPI_FILE, 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([
int(time.time()),
time.strftime('%Y-%m-%d %H:%M:%S'),
f"{current_nav:.2f}",
f"{benchmark_val:.2f}",
f"{alpha:.2f}",
f"{uni_val:.2f}",
f"{uni_fees_claimed:.2f}",
f"{uni_fees_unclaimed:.2f}",
f"{hedge_equity:.2f}",
f"{snapshot_data.get('hedge_pnl_realized_usd', 0):.2f}",
f"{hedge_fees:.2f}",
f"{price:.2f}",
f"{coverage_ratio:.2f}"
])
logger.info(f"📊 KPI Logged | NAV: ${current_nav:.2f} | Benchmark: ${benchmark_val:.2f} | Alpha: ${alpha:.2f}")
except Exception as e:
logger.error(f"Failed to log KPI: {e}")

View File

@ -0,0 +1,136 @@
import argparse
import csv
import os
import time
import json
import threading
import signal
import sys
import websocket
from datetime import datetime
# Setup
MARKET_DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'market_data')
WS_URL = "wss://api.hyperliquid.xyz/ws"
class CandleRecorder:
def __init__(self, coin, output_file):
self.coin = coin
self.output_file = output_file
self.ws = None
self.running = True
# Candle State
self.current_second = int(time.time())
self.ticks = [] # List of prices in current second
self.candle_lock = threading.Lock()
# Ensure dir exists
if not os.path.exists(MARKET_DATA_DIR):
os.makedirs(MARKET_DATA_DIR)
# Init CSV
self.file_exists = os.path.exists(output_file)
with open(self.output_file, 'a', newline='') as f:
writer = csv.writer(f)
if not self.file_exists:
writer.writerow(['timestamp', 'open', 'high', 'low', 'close', 'count'])
def on_message(self, ws, message):
try:
data = json.loads(message)
# Check for 'allMids' update
if data.get('channel') == 'allMids':
mids = data.get('data', {}).get('mids', {})
if self.coin in mids:
price = float(mids[self.coin])
self.process_tick(price)
except Exception as e:
print(f"Error processing message: {e}")
def process_tick(self, price):
now_sec = int(time.time())
with self.candle_lock:
# If we moved to a new second, close the old one
if now_sec > self.current_second:
self.close_candle()
self.current_second = now_sec
self.ticks = []
self.ticks.append(price)
def close_candle(self):
if not self.ticks:
return
# Build candle
o = self.ticks[0]
c = self.ticks[-1]
h = max(self.ticks)
l = min(self.ticks)
count = len(self.ticks)
ts = self.current_second * 1000
# Write to file
try:
with open(self.output_file, 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([ts, o, h, l, c, count])
if self.current_second % 10 == 0:
print(f"[{datetime.fromtimestamp(self.current_second)}] 🕯️ Saved {self.coin}: {c} ({count} ticks)")
except Exception as e:
print(f"Error writing candle: {e}")
def on_error(self, ws, error):
print(f"WebSocket Error: {error}")
def on_close(self, ws, close_status_code, close_msg):
print("WebSocket Closed")
def on_open(self, ws):
print("WebSocket Connected. Subscribing to allMids...")
sub_msg = {
"method": "subscribe",
"subscription": {"type": "allMids"}
}
ws.send(json.dumps(sub_msg))
def start(self):
print(f"🔴 RECORDING LIVE 1s DATA (WS) for {self.coin}")
print(f"📂 Output: {self.output_file}")
print("Press Ctrl+C to stop.")
# Start WS in separate thread? No, run_forever is blocking usually.
# But we need to handle Ctrl+C.
self.ws = websocket.WebSocketApp(
WS_URL,
on_open=self.on_open,
on_message=self.on_message,
on_error=self.on_error,
on_close=self.on_close
)
self.ws.run_forever()
def signal_handler(sig, frame):
print("\nStopping recorder...")
sys.exit(0)
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal_handler)
parser = argparse.ArgumentParser(description="Record live 1s candles from Hyperliquid via WebSocket")
parser.add_argument("--coin", type=str, default="ETH", help="Coin symbol")
parser.add_argument("--output", type=str, help="Custom output file")
args = parser.parse_args()
filename = args.output or os.path.join(MARKET_DATA_DIR, f"{args.coin}_1s_LIVE_WS.csv")
recorder = CandleRecorder(args.coin, filename)
recorder.start()

858
florida/unified_hedger.py Normal file
View File

@ -0,0 +1,858 @@
import os
import time
import logging
import sys
import json
import glob
import math
from decimal import Decimal, getcontext, ROUND_DOWN
from typing import Optional, Dict, Any, List, Union
from dotenv import load_dotenv
# --- FIX: Add project root to sys.path to import local modules ---
current_dir = os.path.dirname(os.path.abspath(__file__))
project_root = os.path.dirname(current_dir)
sys.path.append(project_root)
# Import local modules
try:
from logging_utils import setup_logging
except ImportError:
setup_logging = None
# Ensure root logger is clean if we can't use setup_logging
logging.getLogger().handlers.clear()
logging.basicConfig(level=logging.INFO)
from eth_account import Account
from hyperliquid.exchange import Exchange
from hyperliquid.info import Info
from hyperliquid.utils import constants
from clp_config import CLP_PROFILES, DEFAULT_STRATEGY
# Load environment variables
dotenv_path = os.path.join(current_dir, '.env')
load_dotenv(dotenv_path if os.path.exists(dotenv_path) else None)
# --- LOGGING SETUP ---
# Ensure logs directory exists
log_dir = os.path.join(current_dir, 'logs')
os.makedirs(log_dir, exist_ok=True)
# Custom Filter for Millisecond Unix Timestamp (Matching Manager style)
class UnixMsLogFilter(logging.Filter):
def filter(self, record):
record.unix_ms = int(record.created * 1000)
return True
# Configure Logging
logger = logging.getLogger("UNIFIED_HEDGER")
logger.setLevel(logging.INFO)
logger.propagate = False # Prevent double logging from root logger
logger.handlers.clear() # Clear existing handlers to prevent duplicates
# Console Handler
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)
console_fmt = logging.Formatter('%(asctime)s - %(message)s')
console_handler.setFormatter(console_fmt)
logger.addHandler(console_handler)
# File Handler
log_file = os.path.join(log_dir, 'unified_hedger.log')
file_handler = logging.FileHandler(log_file, encoding='utf-8')
file_handler.setLevel(logging.INFO)
file_handler.addFilter(UnixMsLogFilter())
file_fmt = logging.Formatter('%(unix_ms)d, %(asctime)s - %(message)s')
file_handler.setFormatter(file_fmt)
logger.addHandler(file_handler)
# --- DECIMAL PRECISION CONFIGURATION ---
getcontext().prec = 50
# --- CONFIGURATION ---
# Settings are loaded from clp_config.py into self.coin_configs
# --- HELPER FUNCTIONS ---
def to_decimal(value: Any) -> Decimal:
"""Safely convert value to Decimal."""
if value is None:
return Decimal("0")
return Decimal(str(value))
def round_to_sz_decimals_precise(amount: Decimal, sz_decimals: int) -> float:
"""Round Decimal amount to specific decimals and return float for SDK."""
if amount == 0:
return 0.0
quantizer = Decimal("1").scaleb(-sz_decimals)
rounded = amount.quantize(quantizer, rounding=ROUND_DOWN)
return float(rounded)
def round_to_sig_figs_precise(x: Decimal, sig_figs: int = 5) -> float:
"""Round Decimal to significant figures and return float for SDK."""
if x == 0:
return 0.0
# Use string formatting for sig figs as it's robust
return float(f"{x:.{sig_figs}g}")
def validate_trade_size(size: Decimal, sz_decimals: int, min_order_value: Decimal, price: Decimal) -> float:
"""Validate trade size against minimums."""
if size <= 0:
return 0.0
# Check minimum order value
order_value = size * price
if order_value < min_order_value:
return 0.0
# Check dust
min_size = Decimal("10") ** (-sz_decimals)
if size < min_size:
return 0.0
return round_to_sz_decimals_precise(size, sz_decimals)
def update_position_stats(file_path: str, token_id: int, stats_data: Dict):
if not os.path.exists(file_path): return
try:
with open(file_path, 'r') as f:
data = json.load(f)
if isinstance(data, dict): data = [data]
updated = False
for entry in data:
if entry.get('token_id') == token_id:
entry.update(stats_data)
updated = True
break
if updated:
with open(file_path, 'w') as f:
json.dump(data, f, indent=2)
except Exception as e:
logger.error(f"Error updating JSON stats in {file_path}: {e}")
# --- STRATEGY CLASS ---
class HyperliquidStrategy:
def __init__(self, entry_amount0: Decimal, entry_amount1: Decimal, target_value: Decimal,
entry_price: Decimal, low_range: Decimal, high_range: Decimal, start_price: Decimal,
liquidity: int = 0, liquidity_scale: Decimal = Decimal("1e-12")):
self.entry_amount0 = entry_amount0
self.entry_amount1 = entry_amount1
self.target_value = target_value
self.entry_price = entry_price
self.low_range = low_range
self.high_range = high_range
self.start_price = start_price
self.gap = max(Decimal("0.0"), entry_price - start_price)
self.recovery_target = entry_price + (Decimal("2") * self.gap)
self.L = Decimal("0.0")
# Priority: Use exact Liquidity from Contract if available
if liquidity > 0:
self.L = Decimal(liquidity) * liquidity_scale
# Calculate implied delta at entry for verification
implied_delta = self.get_pool_delta(entry_price)
# Log removed to reduce spam in unified logger
# logger.info(f"Using Exact Liquidity: {self.L:.4f} (Raw: {liquidity}, Scale: {liquidity_scale})")
else:
try:
sqrt_P = entry_price.sqrt()
sqrt_Pa = low_range.sqrt()
sqrt_Pb = high_range.sqrt()
if entry_amount0 > 0:
denom0 = (Decimal("1") / sqrt_P) - (Decimal("1") / sqrt_Pb)
if denom0 > Decimal("1e-10"):
self.L = entry_amount0 / denom0
if self.L == 0 and entry_amount1 > 0:
denom1 = sqrt_P - sqrt_Pa
if denom1 > Decimal("1e-10"):
self.L = entry_amount1 / denom1
if self.L == 0:
max_eth = target_value / low_range
denom_h = (Decimal("1") / sqrt_Pa) - (Decimal("1") / sqrt_Pb)
if denom_h > 0:
self.L = max_eth / denom_h
except Exception as e:
logger.error(f"Error calculating liquidity: {e}")
def get_pool_delta(self, current_price: Decimal) -> Decimal:
if current_price >= self.high_range:
return Decimal("0.0")
if current_price <= self.low_range:
sqrt_Pa = self.low_range.sqrt()
sqrt_Pb = self.high_range.sqrt()
return self.L * ((Decimal("1")/sqrt_Pa) - (Decimal("1")/sqrt_Pb))
sqrt_P = current_price.sqrt()
sqrt_Pb = self.high_range.sqrt()
return self.L * ((Decimal("1")/sqrt_P) - (Decimal("1")/sqrt_Pb))
def calculate_rebalance(self, current_price: Decimal, current_short_size: Decimal) -> Dict:
# Note: current_short_size here is virtual (just for this specific strategy),
# but the unified hedger will use the 'target_short' output primarily.
pool_delta = self.get_pool_delta(current_price)
# --- ASYMMETRIC COMPENSATION ---
adj_pct = Decimal("0.0")
range_width = self.high_range - self.low_range
if range_width > 0:
dist = current_price - self.entry_price
half_width = range_width / Decimal("2")
norm_dist = dist / half_width
max_boost = Decimal("0.075")
adj_pct = -norm_dist * max_boost
adj_pct = max(-max_boost, min(max_boost, adj_pct))
raw_target_short = pool_delta
adjusted_target_short = raw_target_short * (Decimal("1.0") + adj_pct)
diff = adjusted_target_short - abs(current_short_size)
return {
"current_price": current_price,
"pool_delta": pool_delta,
"target_short": adjusted_target_short,
"current_short": abs(current_short_size),
"diff": diff,
"action": "SELL" if diff > 0 else "BUY",
"adj_pct": adj_pct
}
# --- UNIFIED HEDGER CLASS ---
class UnifiedHedger:
def __init__(self):
self.private_key = os.environ.get("HEDGER_PRIVATE_KEY")
self.vault_address = os.environ.get("MAIN_WALLET_ADDRESS")
if not self.private_key:
logger.error("No HEDGER_PRIVATE_KEY found in .env")
sys.exit(1)
self.account = Account.from_key(self.private_key)
self.info = Info(constants.MAINNET_API_URL, skip_ws=True)
self.exchange = Exchange(self.account, constants.MAINNET_API_URL, account_address=self.vault_address)
# Maps (file_path, token_id) -> Strategy Instance
self.strategies: Dict[tuple, HyperliquidStrategy] = {}
# Maps (file_path, token_id) -> State Data (accumulated pnl etc)
self.strategy_states: Dict[tuple, Dict] = {}
# Unified State
self.coin_configs: Dict[str, Dict] = {} # Symbol -> Config (thresholds, decimals)
self.active_coins = set()
self.api_backoff_until = 0
# Market Data Cache
self.last_prices = {}
self.price_history = {} # Symbol -> List[Decimal]
self.last_trade_times = {} # Symbol -> timestamp
# Shadow Orders (Global List)
self.shadow_orders = []
self.startup_time = time.time()
logger.info(f"[UNIFIED] Master Hedger initialized. Agent: {self.account.address}")
self._init_coin_configs()
def _init_coin_configs(self):
"""Pre-load configuration for known coins from CLP_PROFILES."""
for profile_key, profile_data in CLP_PROFILES.items():
symbol = profile_data.get("COIN_SYMBOL")
if symbol:
if symbol not in self.coin_configs:
# Init with Defaults
self.coin_configs[symbol] = DEFAULT_STRATEGY.copy()
self.coin_configs[symbol]["sz_decimals"] = 4 # Will be updated by API
# Update with Profile Specifics
self.coin_configs[symbol].update(profile_data)
def _get_sz_decimals(self, coin: str) -> int:
try:
meta = self.info.meta()
for asset in meta["universe"]:
if asset["name"] == coin:
return asset["szDecimals"]
return 4
except: return 4
def update_coin_decimals(self):
try:
meta = self.info.meta()
for asset in meta["universe"]:
coin = asset["name"]
if coin in self.coin_configs:
self.coin_configs[coin]["sz_decimals"] = asset["szDecimals"]
elif coin in self.active_coins:
self.coin_configs[coin] = DEFAULT_STRATEGY.copy()
self.coin_configs[coin]["sz_decimals"] = asset["szDecimals"]
except Exception as e:
logger.error(f"Failed to update coin decimals: {e}")
def calculate_volatility(self, coin: str) -> Decimal:
history = self.price_history.get(coin, [])
if not history or len(history) < 30:
return Decimal("0.0")
try:
n = len(history)
mean = sum(history) / n
variance = sum([pow(p - mean, 2) for p in history]) / n
std_dev = variance.sqrt()
if mean == 0: return Decimal("0.0")
return std_dev / mean
except: return Decimal("0.0")
def check_shadow_orders(self, l2_snapshots: Dict):
"""Check if pending shadow (theoretical Maker) orders would have been filled."""
if not self.shadow_orders: return
now = time.time()
remaining = []
for order in self.shadow_orders:
coin = order.get('coin')
if not coin or coin not in l2_snapshots:
remaining.append(order)
continue
levels = l2_snapshots[coin]['levels']
# Snapshot: [ [ {px, sz, n}, ... ], [ {px, sz, n}, ... ] ] -> [Bids, Asks]
# Bids = levels[0], Asks = levels[1]
if not levels[0] or not levels[1]:
remaining.append(order)
continue
best_bid = to_decimal(levels[0][0]['px'])
best_ask = to_decimal(levels[1][0]['px'])
filled = False
if order['side'] == 'BUY':
# Filled if Ask <= Our Bid
if best_ask <= order['price']: filled = True
else: # SELL
# Filled if Bid >= Our Ask
if best_bid >= order['price']: filled = True
if filled:
timeout = self.coin_configs.get(coin, {}).get("SHADOW_ORDER_TIMEOUT", 600)
duration = now - (order['expires_at'] - timeout)
logger.info(f"[SHADOW] ✅ SUCCESS: {coin} Maker {order['side']} @ {order['price']:.2f} filled in {duration:.1f}s")
elif now > order['expires_at']:
logger.info(f"[SHADOW] ❌ FAILED: {coin} Maker {order['side']} @ {order['price']:.2f} timed out")
else:
remaining.append(order)
self.shadow_orders = remaining
def scan_strategies(self) -> bool:
"""Scans all *_status.json files and updates active strategies. Returns False if any read failed."""
status_files = glob.glob(os.path.join(current_dir, "*_status.json"))
# logger.info(f"[DEBUG] Scanning {len(status_files)} status files...")
active_ids = set()
successful_files = set()
has_errors = False
for file_path in status_files:
# Determine Profile/Coin from filename or content?
# Filename convention: {TARGET_DEX}_status.json
filename = os.path.basename(file_path)
dex_name = filename.replace("_status.json", "")
profile = CLP_PROFILES.get(dex_name)
if not profile:
# Fallback: Try to guess or skip
continue
coin_symbol = profile.get("COIN_SYMBOL", "ETH")
self.active_coins.add(coin_symbol)
try:
with open(file_path, 'r') as f:
content = f.read().strip()
if not content:
# Empty file (being written?) -> treat as error to be safe
raise ValueError("Empty file")
data = json.loads(content)
successful_files.add(file_path) # Mark as safe to sync
if isinstance(data, dict): data = [data]
for entry in data:
if entry.get('type') == 'AUTOMATIC' and entry.get('status') in ['OPEN', 'PENDING_HEDGE', 'CLOSING']:
token_id = entry['token_id']
key = (file_path, token_id)
active_ids.add(key)
# Init or Update Strategy
if key not in self.strategies:
self._init_single_strategy(key, entry, coin_symbol)
# Init Status
if key in self.strategy_states:
self.strategy_states[key]['status'] = entry.get('status', 'OPEN')
else:
# Refresh PnL/Fees from file in case they changed
if key in self.strategy_states:
self.strategy_states[key]['pnl'] = to_decimal(entry.get('hedge_pnl_realized', 0))
self.strategy_states[key]['fees'] = to_decimal(entry.get('hedge_fees_paid', 0))
self.strategy_states[key]['status'] = entry.get('status', 'OPEN')
except Exception as e:
logger.error(f"Error reading {filename}: {e}. Skipping updates.")
has_errors = True
# Remove stale strategies ONLY from files we successfully read
current_keys = list(self.strategies.keys())
for k in current_keys:
file_origin = k[0]
# If the file is gone (not in status_files) OR we successfully read it and the key is missing:
if file_origin not in status_files or (file_origin in successful_files and k not in active_ids):
logger.info(f"Strategy {k[1]} removed (Closed/Gone).")
del self.strategies[k]
if k in self.strategy_states: del self.strategy_states[k]
return not has_errors
def _init_single_strategy(self, key, position_data, coin_symbol):
try:
entry_amount0 = to_decimal(position_data.get('amount0_initial', 0))
entry_amount1 = to_decimal(position_data.get('amount1_initial', 0))
target_value = to_decimal(position_data.get('target_value', 50))
entry_price = to_decimal(position_data['entry_price'])
lower = to_decimal(position_data['range_lower'])
upper = to_decimal(position_data['range_upper'])
liquidity_val = int(position_data.get('liquidity', 0))
d0 = int(position_data.get('token0_decimals', 18))
d1 = int(position_data.get('token1_decimals', 6))
scale_exp = (d0 + d1) / 2
liquidity_scale = Decimal("10") ** Decimal(str(-scale_exp))
start_price = self.last_prices.get(coin_symbol)
if start_price is None:
# Will init next loop when price available
return
strat = HyperliquidStrategy(
entry_amount0, entry_amount1, target_value, entry_price, lower, upper, start_price,
liquidity_val, liquidity_scale
)
self.strategies[key] = strat
self.strategy_states[key] = {
"coin": coin_symbol,
"start_time": int(time.time() * 1000),
"pnl": to_decimal(position_data.get('hedge_pnl_realized', 0)),
"fees": to_decimal(position_data.get('hedge_fees_paid', 0)),
"entry_price": entry_price, # Store for fishing logic
"status": position_data.get('status', 'OPEN')
}
logger.info(f"[STRAT] Init {key[1]} ({coin_symbol}) | Range: {lower}-{upper}")
except Exception as e:
logger.error(f"Failed to init strategy {key[1]}: {e}")
def place_limit_order(self, coin: str, is_buy: bool, size: Decimal, price: Decimal, order_type: str = "Alo") -> Optional[int]:
config = self.coin_configs.get(coin, {})
sz_decimals = config.get("sz_decimals", 4)
min_order = config.get("MIN_ORDER_VALUE_USD", Decimal("10.0"))
validated_size_float = validate_trade_size(size, sz_decimals, min_order, price)
if validated_size_float == 0:
return None
price_float = round_to_sig_figs_precise(price, 5)
logger.info(f"[ORDER] {order_type.upper()} {coin} {'BUY' if is_buy else 'SELL'} {validated_size_float} @ {price_float}")
try:
order_result = self.exchange.order(coin, is_buy, validated_size_float, price_float, {"limit": {"tif": order_type}}, reduce_only=is_buy)
status = order_result["status"]
if status == "ok":
response_data = order_result["response"]["data"]
if "statuses" in response_data:
status_obj = response_data["statuses"][0]
if "resting" in status_obj:
return status_obj["resting"]["oid"]
elif "filled" in status_obj:
logger.info("Order filled immediately.")
return status_obj["filled"]["oid"]
elif "error" in status_obj:
err_msg = status_obj['error']
if "Post only order would have immediately matched" in err_msg:
logger.warning(f"[RETRY] Maker order rejected (Crossed). Will retry.")
else:
logger.error(f"Order API Error: {err_msg}")
else:
logger.error(f"Order Failed: {order_result}")
except Exception as e:
if "429" in str(e):
logger.warning(f"Rate limit hit (429). Backing off.")
self.api_backoff_until = time.time() + 30
else:
logger.error(f"Exception during trade: {e}")
return None
def get_open_orders(self) -> List[Dict]:
try:
return self.info.open_orders(self.vault_address or self.account.address)
except:
return []
def cancel_order(self, coin: str, oid: int):
try:
self.exchange.cancel(coin, oid)
except Exception as e:
logger.error(f"Error cancelling order: {e}")
def run(self):
logger.info("Starting Unified Hedger Loop...")
self.update_coin_decimals()
# --- LOG SETTINGS ON START ---
logger.info("=== HEDGER CONFIGURATION ===")
for symbol, config in self.coin_configs.items():
logger.info(f"--- {symbol} ---")
for k, v in config.items():
logger.info(f" {k}: {v}")
logger.info("============================")
while True:
try:
# 1. API Backoff
if time.time() < self.api_backoff_until:
time.sleep(1)
continue
# 2. Update Strategies
if not self.scan_strategies():
logger.warning("Strategy scan failed (read error). Skipping execution tick.")
time.sleep(1)
continue
# 3. Fetch Market Data (Centralized)
try:
mids = self.info.all_mids()
user_state = self.info.user_state(self.vault_address or self.account.address)
open_orders = self.get_open_orders()
l2_snapshots = {} # Cache for snapshots
except Exception as e:
logger.error(f"API Error fetching data: {e}")
time.sleep(1)
continue
# Map Open Orders
orders_map = {}
for o in open_orders:
c = o['coin']
if c not in orders_map: orders_map[c] = []
orders_map[c].append(o)
# Parse User State
account_value = Decimal("0")
if "marginSummary" in user_state and "accountValue" in user_state["marginSummary"]:
account_value = to_decimal(user_state["marginSummary"]["accountValue"])
# Map current positions
current_positions = {} # Coin -> Size
current_pnls = {} # Coin -> Unrealized PnL
for pos in user_state["assetPositions"]:
c = pos["position"]["coin"]
s = to_decimal(pos["position"]["szi"])
u = to_decimal(pos["position"]["unrealizedPnl"])
current_positions[c] = s
current_pnls[c] = u
# 4. Aggregate Targets
# Coin -> { 'target_short': Decimal, 'contributors': int, 'is_at_edge': bool }
aggregates = {}
# First, update all prices from mids for active coins
for coin in self.active_coins:
if coin in mids:
price = to_decimal(mids[coin])
self.last_prices[coin] = price
# Update Price History
if coin not in self.price_history: self.price_history[coin] = []
self.price_history[coin].append(price)
if len(self.price_history[coin]) > 300: self.price_history[coin].pop(0)
for key, strat in self.strategies.items():
coin = self.strategy_states[key]['coin']
status = self.strategy_states[key].get('status', 'OPEN')
if coin not in self.last_prices: continue
price = self.last_prices[coin]
# Calc Logic
calc = strat.calculate_rebalance(price, Decimal("0"))
if coin not in aggregates:
aggregates[coin] = {'target_short': Decimal("0"), 'contributors': 0, 'is_at_edge': False, 'adj_pct': Decimal("0"), 'is_closing': False}
if status == 'CLOSING':
# If Closing, we want target to be 0 for this strategy
logger.info(f"[STRAT] {key[1]} is CLOSING -> Force Target 0")
aggregates[coin]['is_closing'] = True
# Do not add to target_short
else:
aggregates[coin]['target_short'] += calc['target_short']
aggregates[coin]['contributors'] += 1
aggregates[coin]['adj_pct'] = calc['adj_pct']
# Check Edge Proximity for Cleanup
config = self.coin_configs.get(coin, {})
enable_cleanup = config.get("ENABLE_EDGE_CLEANUP", True)
cleanup_margin = config.get("EDGE_CLEANUP_MARGIN_PCT", Decimal("0.02"))
if enable_cleanup:
dist_bottom_pct = (price - strat.low_range) / strat.low_range
dist_top_pct = (strat.high_range - price) / strat.high_range
range_width_pct = (strat.high_range - strat.low_range) / strat.low_range
safety_margin_pct = range_width_pct * cleanup_margin
if dist_bottom_pct < safety_margin_pct or dist_top_pct < safety_margin_pct:
aggregates[coin]['is_at_edge'] = True
# Check Shadow Orders (Pre-Execution)
self.check_shadow_orders(l2_snapshots)
# 5. Execute Per Coin
# Union of coins with Active Strategies OR Active Positions
coins_to_process = set(aggregates.keys())
for c, pos in current_positions.items():
if abs(pos) > 0: coins_to_process.add(c)
for coin in coins_to_process:
data = aggregates.get(coin, {'target_short': Decimal("0"), 'contributors': 0, 'is_at_edge': False, 'adj_pct': Decimal("0"), 'is_closing': False})
price = self.last_prices.get(coin, Decimal("0")) # FIX: Explicitly get price for this coin
if price == 0: continue
target_short_abs = data['target_short'] # Always positive (it's a magnitude of short)
target_position = -target_short_abs # We want to be Short, so negative size
current_pos = current_positions.get(coin, Decimal("0"))
diff = target_position - current_pos # e.g. -1.0 - (-0.8) = -0.2 (Sell 0.2)
diff_abs = abs(diff)
# Thresholds
config = self.coin_configs.get(coin, {})
min_thresh = config.get("min_threshold", Decimal("0.008"))
# Volatility Multiplier
vol_pct = self.calculate_volatility(coin)
base_vol = Decimal("0.0005")
vol_mult = max(Decimal("1.0"), min(Decimal("3.0"), vol_pct / base_vol)) if vol_pct > 0 else Decimal("1.0")
base_rebalance_pct = config.get("BASE_REBALANCE_THRESHOLD_PCT", Decimal("0.20"))
thresh_pct = min(Decimal("0.15"), base_rebalance_pct * vol_mult)
dynamic_thresh = max(min_thresh, abs(target_position) * thresh_pct)
# FORCE EDGE CLEANUP
enable_edge_cleanup = config.get("ENABLE_EDGE_CLEANUP", True)
if data['is_at_edge'] and enable_edge_cleanup:
if dynamic_thresh > min_thresh:
# logger.info(f"[EDGE] {coin} forced to min threshold.")
dynamic_thresh = min_thresh
# Check Trigger
action_needed = diff_abs > dynamic_thresh
# Manage Existing Orders
existing_orders = orders_map.get(coin, [])
# --- EXECUTION LOGIC ---
if action_needed:
bypass_cooldown = False
force_maker = False
# 1. Urgent Closing -> Taker
if data.get('is_closing', False):
bypass_cooldown = True
logger.info(f"[URGENT] {coin} Closing Strategy -> Force Taker Exit")
# 2. Ghost/Cleanup -> Maker
elif data.get('contributors', 0) == 0:
if time.time() - self.startup_time > 5:
force_maker = True
logger.info(f"[CLEANUP] {coin} Ghost Position -> Force Maker Reduce")
else:
logger.info(f"[STARTUP] Skipping Ghost Cleanup for {coin} (Grace Period)")
continue # Skip execution for this coin
# Large Hedge Check
large_hedge_mult = config.get("LARGE_HEDGE_MULTIPLIER", Decimal("5.0"))
if diff_abs > (dynamic_thresh * large_hedge_mult) and not force_maker:
bypass_cooldown = True
logger.info(f"[WARN] LARGE HEDGE: {diff_abs:.4f} > {dynamic_thresh:.4f} (x{large_hedge_mult})")
# Determine Intent
is_buy_bool = diff > 0
side_str = "BUY" if is_buy_bool else "SELL"
# Check Existing Orders for compatibility
order_matched = False
price_buffer_pct = config.get("PRICE_BUFFER_PCT", Decimal("0.0015"))
for o in existing_orders:
o_oid = o['oid']
o_price = to_decimal(o['limitPx'])
o_side = o['side'] # 'B' or 'A'
is_same_side = (o_side == 'B' and is_buy_bool) or (o_side == 'A' and not is_buy_bool)
# Price Check (within buffer)
# If we are BUYING, we want order price close to Bid (or higher)
# If we are SELLING, we want order price close to Ask (or lower)
dist_pct = abs(price - o_price) / price
if is_same_side and dist_pct < price_buffer_pct:
order_matched = True
if int(time.time()) % 10 == 0:
logger.info(f"[WAIT] {coin} Pending {side_str} Order {o_oid} @ {o_price} (Dist: {dist_pct*100:.3f}%)")
break
else:
logger.info(f"Cancelling stale order {o_oid} ({o_side} @ {o_price})")
self.cancel_order(coin, o_oid)
if order_matched:
continue # Order exists, wait for it
last_trade = self.last_trade_times.get(coin, 0)
min_time_trade = config.get("MIN_TIME_BETWEEN_TRADES", 60)
can_trade = False
if bypass_cooldown:
can_trade = True
elif time.time() - last_trade > min_time_trade:
can_trade = True
if can_trade:
# Get Orderbook for Price
if coin not in l2_snapshots:
l2_snapshots[coin] = self.info.l2_snapshot(coin)
levels = l2_snapshots[coin]['levels']
if not levels[0] or not levels[1]: continue
bid = to_decimal(levels[0][0]['px'])
ask = to_decimal(levels[1][0]['px'])
# Price logic
create_shadow = False
if bypass_cooldown and not force_maker:
exec_price = ask * Decimal("1.001") if is_buy_bool else bid * Decimal("0.999")
order_type = "Ioc"
create_shadow = True
else:
exec_price = bid if is_buy_bool else ask
order_type = "Alo"
logger.info(f"[TRIG] Net {coin}: {side_str} {diff_abs:.4f} | Tgt: {target_position:.4f} / Cur: {current_pos:.4f} | Thresh: {dynamic_thresh:.4f}")
oid = self.place_limit_order(coin, is_buy_bool, diff_abs, exec_price, order_type)
if oid:
self.last_trade_times[coin] = time.time()
# Shadow Order
if create_shadow:
shadow_price = bid if is_buy_bool else ask
shadow_timeout = config.get("SHADOW_ORDER_TIMEOUT", 600)
self.shadow_orders.append({
'coin': coin,
'side': side_str,
'price': shadow_price,
'expires_at': time.time() + shadow_timeout
})
logger.info(f"[SHADOW] Created Maker {side_str} @ {shadow_price:.2f}")
# UPDATED: Sleep for API Lag
logger.info("Sleeping 5s to allow position update...")
time.sleep(5)
else:
# Cooldown log
pass
else:
# Action NOT needed
# Cleanup any dangling orders
if existing_orders:
for o in existing_orders:
logger.info(f"Cancelling idle order {o['oid']} ({o['side']} @ {o['limitPx']})")
self.cancel_order(coin, o['oid'])
# --- IDLE LOGGING (Restored Format) ---
# Calculate aggregate Gamma to estimate triggers
# Gamma = 0.5 * Sum(L) * P^-1.5
# We need Sum(L) for this coin.
total_L = Decimal("0")
# We need to re-iterate or cache L.
# Simpler: Just re-sum L from active strats for this coin.
for key, strat in self.strategies.items():
if self.strategy_states[key]['coin'] == coin:
total_L += strat.L
if total_L > 0 and price > 0:
gamma = (Decimal("0.5") * total_L * (price ** Decimal("-1.5")))
if gamma > 0:
# Equilibrium Price (Diff = 0)
p_mid = price + (diff / gamma)
# Triggers
p_buy = price + (dynamic_thresh + diff) / gamma
p_sell = price - (dynamic_thresh - diff) / gamma
if int(time.time()) % 30 == 0:
pad = " " if coin == "BNB" else ""
adj_val = data.get('adj_pct', Decimal("0")) * 100
# PnL Calc
unrealized = current_pnls.get(coin, Decimal("0"))
realized = Decimal("0")
for k, s_state in self.strategy_states.items():
if s_state['coin'] == coin:
realized += (s_state['pnl'] - s_state['fees'])
total_pnl = realized + unrealized
pnl_pad = " " if unrealized >= 0 else ""
tot_pnl_pad = " " if total_pnl >= 0 else ""
logger.info(f"[IDLE] {coin} | Px: {price:.2f}{pad} | M: {p_mid:.1f}{pad} | B: {p_buy:.1f}{pad} / S: {p_sell:.1f}{pad} | delta: {target_position:.4f}({diff:+.4f}) | Adj: {adj_val:+.2f}%, Vol: {vol_mult:.2f}, Thr: {dynamic_thresh:.4f} | PnL: {unrealized:.2f}{pnl_pad} | TotPnL: {total_pnl:.2f}{tot_pnl_pad}")
else:
if int(time.time()) % 30 == 0:
logger.info(f"[IDLE] {coin} | Px: {price:.2f} | delta: {target_position:.4f} | Diff: {diff:.4f} (Thresh: {dynamic_thresh:.4f})")
else:
if int(time.time()) % 30 == 0:
logger.info(f"[IDLE] {coin} | Px: {price:.2f} | delta: {target_position:.4f} | Diff: {diff:.4f} (Thresh: {dynamic_thresh:.4f})")
time.sleep(DEFAULT_STRATEGY.get("CHECK_INTERVAL", 1))
except KeyboardInterrupt:
logger.info("Stopping...")
break
except Exception as e:
logger.error(f"Loop Error: {e}", exc_info=True)
time.sleep(5)
if __name__ == "__main__":
hedger = UnifiedHedger()
hedger.run()