feat: add florida module for unified hedging and monitoring
This commit is contained in:
8
florida/.gemini/settings.json
Normal file
8
florida/.gemini/settings.json
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"ui": {
|
||||||
|
"useAlternateBuffer": true
|
||||||
|
},
|
||||||
|
"tools": {
|
||||||
|
"truncateToolOutputLines": 10000
|
||||||
|
}
|
||||||
|
}
|
||||||
137
florida/GEMINI.md
Normal file
137
florida/GEMINI.md
Normal 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.
|
||||||
123
florida/PANCAKESWAP_BNB_status.json
Normal file
123
florida/PANCAKESWAP_BNB_status.json
Normal 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
|
||||||
|
}
|
||||||
|
]
|
||||||
303
florida/UNISWAP_V3_status.json
Normal file
303
florida/UNISWAP_V3_status.json
Normal 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
124
florida/clp_config.py
Normal 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
|
||||||
230
florida/doc/CLP_OPTIMIZATION_PLAN.md
Normal file
230
florida/doc/CLP_OPTIMIZATION_PLAN.md
Normal 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*
|
||||||
143
florida/doc/UNIFIED_HEDGER_LOGIC.md
Normal file
143
florida/doc/UNIFIED_HEDGER_LOGIC.md
Normal 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. |
|
||||||
57
florida/doc/UNIFIED_HEDGER_LOGS.md
Normal file
57
florida/doc/UNIFIED_HEDGER_LOGS.md
Normal 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.
|
||||||
2649
florida/market_data/BNB_1s_LIVE_WS.csv
Normal file
2649
florida/market_data/BNB_1s_LIVE_WS.csv
Normal file
File diff suppressed because it is too large
Load Diff
0
florida/market_data/ETH_1s.csv
Normal file
0
florida/market_data/ETH_1s.csv
Normal file
|
|
2817
florida/market_data/ETH_1s_LIVE_WS.csv
Normal file
2817
florida/market_data/ETH_1s_LIVE_WS.csv
Normal file
File diff suppressed because it is too large
Load Diff
12
florida/requirements.txt
Normal file
12
florida/requirements.txt
Normal 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
|
||||||
BIN
florida/summaries/5178639.PNG
Normal file
BIN
florida/summaries/5178639.PNG
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 138 KiB |
@ -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).
|
||||||
117
florida/summaries/6153292/6153292_analisis.md
Normal file
117
florida/summaries/6153292/6153292_analisis.md
Normal 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.
|
||||||
76
florida/summaries/CLP_STRATEGY_LOG.md
Normal file
76
florida/summaries/CLP_STRATEGY_LOG.md
Normal 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).
|
||||||
BIN
florida/summaries/positions_chart.PNG
Normal file
BIN
florida/summaries/positions_chart.PNG
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 161 KiB |
397
florida/telegram_monitor.py
Normal file
397
florida/telegram_monitor.py
Normal 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()
|
||||||
7
florida/telegram_monitor_state.json
Normal file
7
florida/telegram_monitor_state.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"last_known_open_positions": [
|
||||||
|
5180968
|
||||||
|
],
|
||||||
|
"last_processed_timestamp": 1766874912,
|
||||||
|
"last_file_hash": "beda382fdbca542dc8357002b4527702"
|
||||||
|
}
|
||||||
262
florida/tools/README_GIT_AGENT.md
Normal file
262
florida/tools/README_GIT_AGENT.md
Normal 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.
|
||||||
35
florida/tools/agent_config.json
Normal file
35
florida/tools/agent_config.json
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
89
florida/tools/backup_manager.py
Normal file
89
florida/tools/backup_manager.py
Normal 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
|
||||||
230
florida/tools/change_detector.py
Normal file
230
florida/tools/change_detector.py
Normal 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
|
||||||
153
florida/tools/cleanup_manager.py
Normal file
153
florida/tools/cleanup_manager.py
Normal 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
|
||||||
|
}
|
||||||
325
florida/tools/collect_fees_v2 copy.py
Normal file
325
florida/tools/collect_fees_v2 copy.py
Normal 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()
|
||||||
325
florida/tools/collect_fees_v2.py
Normal file
325
florida/tools/collect_fees_v2.py
Normal 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()
|
||||||
129
florida/tools/collect_market_data.py
Normal file
129
florida/tools/collect_market_data.py
Normal 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)
|
||||||
134
florida/tools/commit_formatter.py
Normal file
134
florida/tools/commit_formatter.py
Normal 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
|
||||||
|
"""
|
||||||
70
florida/tools/create_agent.py
Normal file
70
florida/tools/create_agent.py
Normal 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()
|
||||||
|
|
||||||
102
florida/tools/debug_bnb_swap.py
Normal file
102
florida/tools/debug_bnb_swap.py
Normal 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}")
|
||||||
87
florida/tools/fix_liquidity.py
Normal file
87
florida/tools/fix_liquidity.py
Normal 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
421
florida/tools/git_agent.py
Normal 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()
|
||||||
159
florida/tools/git_opencode.py
Normal file
159
florida/tools/git_opencode.py
Normal 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
238
florida/tools/git_utils.py
Normal 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
|
||||||
134
florida/tools/kpi_tracker.py
Normal file
134
florida/tools/kpi_tracker.py
Normal 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}")
|
||||||
136
florida/tools/record_live_data.py
Normal file
136
florida/tools/record_live_data.py
Normal 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
858
florida/unified_hedger.py
Normal 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()
|
||||||
Reference in New Issue
Block a user