Found both bots and the checklist. Let me read the key files.
2026-04-24 11:29:58
TOOL (hermes, minimax/minimax-m2.7)
{"content": " 1|# Trading Strategy Audit Checklist\n 2|\n 3|## Pre-Deployment Verification for Algorithmic Trading Strategies\n 4|\n 5|---\n 6|\n 7|## 1. POSITION MANAGEMENT\n 8|\n 9|| Check | Status | Notes |\n 10||-------|--------|-------|\n 11|| [ ] Max position size defined and enforced | | |\n 12|| [ ] Lot size correctly configured | | |\n 13|| [ ] Position limit check before every entry | | |\n 14|| [ ] Cannot exceed max lots under any scenario | | |\n 15|| [ ] Position reconciliation with broker | | |\n 16|| [ ] Handles partial fills correctly | | |\n 17|\n 18|---\n 19|\n 20|## 2. ORDER EXECUTION\n 21|\n 22|| Check | Status | Notes |\n 23||-------|--------|-------|\n 24|| [ ] Order fill verification after placement | | |\n 25|| [ ] Retry logic for failed quotes | | |\n 26|| [ ] Fallback for LTP fetch failures | | |\n 27|| [ ] Limit price buffer appropriate (not too tight/loose) | | |\n 28|| [ ] Correct exchange specified (NSE/NFO/BSE) | | |\n 29|| [ ] Correct product type (NRML/MIS/CNC) | | |\n 30|| [ ] Order response validation | | |\n 31|| [ ] No orders placed with price = 0 | | |\n 32|\n 33|---\n 34|\n 35|## 3. SYMBOL & INSTRUMENT\n 36|\n 37|| Check | Status | Notes |\n 38||-------|--------|-------|\n 39|| [ ] Symbol format matches broker expectation | | |\n 40|| [ ] Expiry date correctly formatted | | |\n 41|| [ ] Strike selection logic correct (ATM/ITM/OTM) | | |\n 42|| [ ] Strike step size accurate for instrument | | |\n 43|| [ ] Underlying symbol correct | | |\n 44|| [ ] Fallback symbol construction tested | | |\n 45|\n 46|---\n 47|\n 48|## 4. RISK CONTROLS\n 49|\n 50|| Check | Status | Notes |\n 51||-------|--------|-------|\n 52|| [ ] Stop loss logic implemented | | |\n 53|| [ ] SL checked on every tick/interval | | |\n 54|| [ ] Max trades per day enforced | | |\n 55|| [ ] Daily loss limit (if applicable) | | |\n 56|| [ ] No naked short positions possible | | |\n 57|| [ ] Exit logic on trend reversal | | |\n 58|| [ ] Emergency exit capability | | |\n 59|\n 60|---\n 61|\n 62|## 5. STATE MANAGEMENT\n 63|\n 64|**Preferred approach**: No state file. Session RAM only. Broker positionbook is truth (see Section 6).\n 65|If a state file IS used, every item below becomes a risk to audit carefully.\n 66|\n 67|| Check | Status | Notes |\n 68||-------|--------|-------|\n 69|| [ ] **If state file used**: can it go stale across days? | | Stale anchor caused wrong trade 2026-03-27 |\n 70|| [ ] **If state file used**: is date checked and reset daily? | | |\n 71|| [ ] **If state file used**: is it reconciled with broker on startup? | | |\n 72|| [ ] Session-only RAM (prev_ltp, skip flags) resets cleanly on restart | | Never persisted |\n 73|| [ ] Daily counters reset correctly | | |\n 74|| [ ] No state corruption on crash
... [15516 chars total, truncated]
2026-04-24 11:29:58
TOOL (hermes, minimax/minimax-m2.7)
{"content": " 1|\"\"\"\r\n 2|╔═══════════════════════════════════════════════════════════════════════════════╗\r\n 3|║ TELEGRAM BOT MODULE ║\r\n 4|║ ═══════════════════ ║\r\n 5|║ Handles outbound alerts and inbound commands via Telegram. ║\r\n 6|╚═══════════════════════════════════════════════════════════════════════════════╝\r\n 7|\"\"\"\r\n 8|import requests\r\n 9|import threading\r\n 10|import time\r\n 11|import logging\r\n 12|import json\r\n 13|import subprocess\r\n 14|\r\n 15|logger = logging.getLogger(\"telegram\")\r\n 16|\r\n 17|\r\n 18|class TelegramBot:\r\n 19| \"\"\"\r\n 20| Telegram Bot for trading alerts and remote commands.\r\n 21|\r\n 22| Outbound:\r\n 23| bot.send(\"Message\") → sends to your chat\r\n 24| bot.alert(\"🚀 BUY DLF CE\") → same, but prefixed with alert emoji\r\n 25|\r\n 26| Inbound (runs in background thread):\r\n 27| Listens for commands like /status, /squareoff, /pause, /resume\r\n 28| Calls registered callback functions.\r\n 29| \"\"\"\r\n 30|\r\n 31| def __init__(self, token, chat_id, command_handler=None):\r\n 32| self.token = token\r\n 33| self.chat_id = chat_id\r\n 34| self.base_url = f\"https://api.telegram.org/bot{token}\"\r\n 35| self.command_handler = command_handler # callback(command, args)\r\n 36| self.enabled = token != \"YOUR_BOT_TOKEN_HERE\" and chat_id != \"YOUR_CHAT_ID_HERE\"\r\n 37| self._last_update_id = 0\r\n 38| self._listener_thread = None\r\n 39| self._running = False\r\n 40| self._start_time = time.time()\r\n 41| self._RESTART_GRACE_SECS = 30 # ignore /restartbot for 30s after startup\r\n 42| self._heartbeat_count = 0 # increments every heartbeat; table sent every 4th\r\n 43|\r\n 44| if not self.enabled:\r\n 45| logger.warning(\"Telegram not configured — running without alerts\")\r\n 46|\r\n 47| # ─────────────────────────────────────────────\r\n 48| # OUTBOUND: Send messages to user\r\n 49| # ─────────────────────────────────────────────\r\n 50|\r\n 51| def send(self, message, parse_mode=\"Markdown\"):\r\n 52| \"\"\"Send a message to the configured chat.\"\"\"\r\n 53| if not self.enabled:\r\n 54| logger.info(f\"[TG-SKIP] {message}\")\r\n 55| return False\r\n 56|\r\n 57| try:\r\n 58| url = f\"{self.base_url}/sendMessage\"\r\n 59| payload = {\r\n 60| \"chat_id\": self.chat_id,\r\n 61| \"text\": message,\r\n 62| }\r\n 63| if parse_mode:\r\n 64| payload[\"parse_mode\"] = pa
... [26423 chars total, truncated]
2026-04-24 11:29:58
TOOL (hermes, minimax/minimax-m2.7)
{"content": " 1|#!/usr/bin/env python3\n 2|\"\"\"\n 3|LT 3-Candle Renko VIDYA — Intraday Trading Bot\n 4|===============================================\n 5|Candle data flow:\n 6| Every 5-min poll → fetch new 5-min candles from broker → append to candles_5min DB\n 7| Every 3 x 5-min complete a 15-min slot → build OHLC → append to candles_15min DB\n 8| 3-candle window runs off candles_15min (local DB, no live API for history)\n 9|\n 10|Strategy:\n 11| - Daily bias: futures LTP at 9:15 vs VIDYA(20) on 5-pt close-based Renko\n 12| - GREEN (price > VIDYA) → monitor for CALL entries\n 13| - RED (price < VIDYA) → monitor for PUT entries\n 14|\n 15|Entry (2-candle setup):\n 16| - GREEN: track candle-1 low. If candle 2 holds above it → BUY ATM CALL\n 17| - RED: track candle-1 high. If candle 2 holds below it → BUY ATM PUT\n 18| - Break candle becomes new candle 1 (rolling window)\n 19| - Strike = floor(futures_ltp / 20) * 20\n 20|\n 21|Exit triggers:\n 22| - 2-candle level break: 15-min candle closes below/above SL level\n 23| - Rs 1000 loss: checked every 5-min poll\n 24|\n 25|Limits:\n 26| - 2 orders per direction per 3-hour window (W1: 9:15-12:15, W2: 12:15-15:30)\n 27| - Max 2 lots at any time (broker check before every order)\n 28| - NRML — holds overnight, resumes next morning\n 29|\n 30|While in position:\n 31| - Skipped setups tracked as #1, #2... with futures high since entry (Telegram)\n 32| - Exit failure → 2 retries → hedge ATM opposite → Telegram every 5 min\n 33|\"\"\"\n 34|\n 35|import sys\n 36|import os\n 37|import sqlite3\n 38|import json\n 39|import time\n 40|import math\n 41|from datetime import datetime as dt, timedelta, time as dtime\n 42|from collections import defaultdict\n 43|\n 44|sys.path.insert(0, \"/home/ubuntu/Claude_bot\")\n 45|from openalgo import api\n 46|\n 47|_DIR = os.path.dirname(os.path.abspath(__file__))\n 48|sys.path.insert(0, _DIR)\n 49|from lt_3candle_eod import (\n 50| DB_PATH, init_db,\n 51| build_renko, compute_vidya, fetch_daily_ohlc,\n 52| compute_and_store_anchors, load_anchors,\n 53|)\n 54|\n 55|# Kotak — live trading (quotes, orders, positions)\n 56|# Flattrade — all historical candle fetching (5-min intraday + daily OHLC)\n 57|# Kotak does NOT have a history/candle API\n 58|API_KEY=\"f6a95f...4716\"\n 59|HOST = \"https://kotak.openalgo.theworkpc.com\"\n 60|\n 61|FT_API_KEY=\"bace7f...7b62\"\n 62|FT_HOST = \"https://flattrade.openalgo.theworkpc.com\"\n 63|\n 64|# ── Log setup ─────────────────────────────────────────────────────────────────\n 65|_LOG_DIR = os.path.join(_DIR, \"logs\")\n 66|os.makedirs(_LOG_DIR, exist_ok=True)\n 67|LOG_FILE = os.path.join(_LOG_DIR, \"lt_3candle.log\")\n 68|try:\n 69| sys.stdout = open(LOG_FILE, \"a\", buffering=1)\n 70|
... [23774 chars total, truncated]
2026-04-24 11:29:58
TOOL (hermes, minimax/minimax-m2.7)
{"content": " 1|# VIDYA Renko 2-Candle Trading Bot — Design Document\n 2|\n 3|> **Status**: Active — Built 2026-03-25, updated to 2-candle strategy 2026-03-26\n 4|> **Symbol**: LT (Larsen & Toubro) — futures `LT30MAR26FUT`, options `LT30MAR26{STRIKE}{CE/PE}`\n 5|> **Lot size**: 175 (configurable)\n 6|\n 7|---\n 8|\n 9|## 1. Overview\n 10|\n 11|A **trend-following options bot** that:\n 12|- Uses **daily 5-brick Renko** to determine intraday bias (GREEN/RED) at BOD\n 13|- Monitors **2-consecutive 15-min candles** for entry signals\n 14|- Trades **1 ATM option lot** per order with **Rs 1000 max loss** per position\n 15|- Enforces **2 orders per direction per 3-hour fixed window**\n 16|- Runs on **Flattrade** (OpenAlgo backend)\n 17|\n 18|---\n 19|\n 20|## 2. Daily Bias — VIDYA Calculation\n 21|\n 22|### 2.1 At Market Open (9:15 IST)\n 23|\n 24|1. Fetch **previous day's daily candle** close price\n 25|2. Build **daily Renko 5-brick** (same brick size as HAL VIDYA bot):\n 26| - Brick size = 5 bricks × instrument tick size\n 27| - Calculate VIDYA value = N-1 brick close\n 28|3. Compare **current futures price** vs VIDYA value:\n 29| - Price **> VIDYA** → **GREEN** (bullish bias) → monitor for CALL entries\n 30| - Price **< VIDYA** → **RED** (bearish bias) → monitor for PUT entries\n 31|4. VIDYA color is **fixed for the entire trading day** — not recalculated intraday\n 32|\n 33|### 2.2 VIDYA Formula\n 34|\n 35|Same as existing HAL VIDYA bot — close-based Renko (not HL-based):\n 36|\n 37|```\n 38|Brick direction = SIGN(close - previous_brick_close)\n 39|New brick when |close - brick_open| >= brick_size\n 40|VIDYA = N-1 brick close\n 41|```\n 42|\n 43|---\n 44|\n 45|## 3. Candle Data Management\n 46|\n 47|### 3.1 Local SQLite DB\n 48|\n 49|- Store **5-min candles** in local SQLite DB\n 50|- **Build 15-min candles** from 3 × 5-min candles locally\n 51|- Avoid broker API calls for historical data on every poll\n 52|\n 53|### 3.2 Candle Build Schedule\n 54|\n 55|- Poll every **5 minutes** for new 5-min candle data\n 56|- Every 3rd 5-min candle = 1 completed **15-min candle** (append to DB)\n 57|- After 3 consecutive 15-min candles complete → ready to evaluate entry\n 58|\n 59|### 3.3 Incremental Pattern (API load reduction)\n 60|\n 61|- **Startup**: Full fetch of historical 5-min candles (lookback TBD)\n 62|- **Runtime**: Fetch only last 5-min candle from broker → append to DB → build 15-min when 3 × 5-min are complete\n 63|- **In-progress candle excluded** from indicator calculations\n 64|\n 65|### 3.4 Data Source Split (2026-04-13)\n 66|\n 67|**Kotak is used for live trading only** (quotes, orders, positions). It does not have a candle history API.\n 68|\n 69|**Flattrade is used for all historical candle data:**\n 70|- Daily OHLC fo
... [17962 chars total, truncated]
2026-04-24 11:29:58
TOOL (hermes, minimax/minimax-m2.7)
{"content": " 1|---\n 2|name: bot_rules\n 3|description: Critical trading bot rules for new Renko VIDYA bot\n 4|type: project\n 5|---\n 6|\n 7|## Symbol Construction (dynamic, user-configured)\n 8|- **Futures symbol**: `{SYMBOL}{EXPIRY}FUT` e.g., `LT30MAR26FUT`\n 9|- **Options symbol**: `{SYMBOL}{EXPIRY}{STRIKE}{CE/PE}` e.g., `LT30MAR263660PE`\n 10|- **Strike ladder**: 20-point increments\n 11|- Lot size per symbol: configured by user (e.g., LT = 175)\n 12|- Bot must construct both futures and option symbols dynamically from config\n 13|\n 14|## Position & Order Rules\n 15|\n 16|**Broker is source of truth** — always confirm positions with broker. Never rely solely on local state.\n 17|\n 18|**Never exceed 2 lots position** at any time.\n 19|\n 20|**Derivative trades are always LIMIT orders** — never market orders.\n 21|- Entry (BUY): option LTP **+ 5** points (aggressive — willing to pay more to get filled)\n 22|- Exit (SELL): option LTP **- 5** points (passive — willing to accept slightly less to get filled)\n 23|- ⚠️ CRITICAL: BUY and SELL offsets are **opposite directions**. Using LTP+5 for SELL places limit above market → order never fills.\n 24|- +5 / -5 is applied to option LTP, NOT futures price\n 25|\n 26|**Exit failure protocol**:\n 27|1. Attempt to exit (sell) up to 2 times\n 28|2. If both attempts fail → immediately buy opposite ATM option\n 29|3. Send Telegram warning alert\n 30|4. Do not wait — act, then alert\n 31|\n 32|**Exit monitoring**: After entry, do NOT pre-place exit order. Monitor passively and place SELL only when SL condition is hit.\n 33|\n 34|**SL check intervals**:\n 35|- 15-min candle close → check 2-candle level break\n 36|- 5-min polling → check INR 1000 loss threshold\n 37|\n 38|**No cooldown period** after exit — next order can be placed immediately if within window limits.\n 39|\n 40|## Market Open (9:15) Position Check\n 41|- Fetch open positions from broker\n 42|- **If position is ours** (from previous day) → continue monitoring for SL as normal\n 43|- **If position is NOT ours** (orphan) → send Telegram warning every 5 minutes until resolved\n 44|", "total_lines": 43, "file_size": 1926, "truncated": false, "is_binary": false, "is_image": false}
2026-04-24 11:29:58
ASSISTANT (hermes, minimax/minimax-m2.7)
Now let me look at the Claude_bot's main strategy files.
{"content": " 501| price=price, strategy=STRATEGY_TAG,\n 502| )\n 503| log(f\"ORDER {action} {symbol} qty={LOT_SIZE} price={price} [{reason}]\")\n 504| return order\n 505| except Exception as e:\n 506| log(f\"Order error {action} {symbol}: {e}\")\n 507| self.telegram.send(f\"🔴 Order error {action} {symbol}: {e}\")\n 508| return None\n 509|\n 510| # ── BOD setup ─────────────────────────────────────────────────────────────\n 511| def setup_day(self):\n 512| \"\"\"Called once at market open. Load VIDYA, set bias, check positions, seed candles.\"\"\"\n 513| today = dt.now().strftime(\"%Y-%m-%d\")\n 514|\n 515| # Load VIDYA anchor\n 516| anchors = load_anchors(self.conn, today)\n 517| if not anchors:\n 518| log(\"No anchors for today — computing on-demand\")\n 519| try:\n 520| all_candles = fetch_daily_ohlc(self.ft_client, self.conn)\n 521| past = [c for c in all_candles if c['date'] < today]\n 522| bricks = build_renko(past)\n 523| vidya = compute_vidya(bricks)\n 524| compute_and_store_anchors(self.conn, bricks, vidya, for_date=today)\n 525| anchors = load_anchors(self.conn, today)\n 526| except Exception as e:\n 527| log(f\"EOD fallback error: {e}\")\n 528|\n 529| if not anchors:\n 530| log(\"CRITICAL: Cannot determine VIDYA — bot will not trade today\")\n 531| return False\n 532|\n 533| self.state['fixed_vidya'] = anchors['fixed_vidya']\n 534| vidya = anchors['fixed_vidya']\n 535|\n 536| fut_ltp = self.get_futures_ltp()\n 537| if not fut_ltp:\n 538| log(\"Cannot fetch futures LTP at BOD\")\n 539| return False\n 540|\n 541| bias = \"GREEN\" if fut_ltp > vidya else \"RED\"\n 542| self.state['bias'] = bias\n 543| log(f\"BOD | VIDYA={vidya} Futures={fut_ltp:.1f} Bias={bias}\")\n 544|\n 545| # Seed 5-min/15-min candle DB\n 546| self.seed_intraday_candles()\n 547|\n 548| # Replay window if fresh start (no last_15min_ts from today)\n 549| if not self.state.get('last_15min_ts'):\n 550| self.replay_15min_window()\n 551|\n 552| # Check overnight positions\n 553| pos = self.state.get('position')\n 554| if pos:\n 555| broker_qty = self.get_broker_qty(pos['symbol'])\n 556| if broker_qty == 0:\n 557| log(f\"Overnight position {pos['symbol']} not at broker — clearing\")\n 558| self.telegram.send(f\"⚠️ Overnight {pos['symbol']} not at broker — state cleared\")\n 559| self.state['position'] = None\n 560| self.state['setup_count'] = 0\n 561
... [24905 chars total, truncated]
2026-04-24 11:29:58
ASSISTANT (hermes, minimax/minimax-m2.7)
Let me also read the rest of the HAL bot and the Claude_bot main entry point.
2026-04-24 11:29:58
TOOL (hermes, minimax/minimax-m2.7)
{"content": " 501| def clear_manual_exit_flags(self, fut_ltp, anchors):\n 502| \"\"\"\n 503| Re-arm a leg once price has moved away from the signal level.\n 504| Sell PUT : price > swing_low → signal no longer active\n 505| Sell CALL: price < swing_high → signal no longer active\n 506| Buy PUT : price ≥ lower_band → price back inside VIDYA band\n 507| Buy CALL : price ≤ upper_band → price back inside VIDYA band\n 508| \"\"\"\n 509| high = anchors['swing_high']\n 510| low = anchors['swing_low']\n 511| upper_band = anchors['fixed_vidya'] + VIDYA_BUFFER\n 512| lower_band = anchors['fixed_vidya'] - VIDYA_BUFFER\n 513|\n 514| for leg in list(self._skip_entry):\n 515| cleared = False\n 516| if leg == 'sell_put' and fut_ltp > low:\n 517| cleared = True\n 518| elif leg == 'sell_call' and fut_ltp < high:\n 519| cleared = True\n 520| elif leg == 'buy_put' and fut_ltp >= lower_band:\n 521| cleared = True\n 522| elif leg == 'buy_call' and fut_ltp <= upper_band:\n 523| cleared = True\n 524| if cleared:\n 525| self._skip_entry.discard(leg)\n 526| log(f\"{leg} manual-exit block cleared — price moved away from signal level\")\n 527|\n 528| # ── Leg 1: Sell Entry ─────────────────────────────────────────────────────\n 529| STARTUP_BUFFER = 50 # pts past level to allow startup entry without crossover\n 530|\n 531| def check_sell_entry(self, fut_ltp, positions, anchors, prev_ltp=None):\n 532| \"\"\"\n 533| Gate : live positionbook has no short CE/PE\n 534| Signal :\n 535| Startup (prev_ltp=None) — enter only if price is 50+ pts past the level\n 536| In-session — require actual crossover this session\n 537| After manual exit — skip until price returns to safe side, then next crossover\n 538| \"\"\"\n 539| high = anchors['swing_high']\n 540| low = anchors['swing_low']\n 541|\n 542| if prev_ltp is None:\n 543| # Sell entries need price to cross the level — never fire on startup\n 544| sell_call_signal = False\n 545| sell_put_signal = False\n 546| else:\n 547| sell_call_signal = prev_ltp < high <= fut_ltp # just crossed up through high\n 548| sell_put_signal = prev_ltp > low >= fut_ltp # just crossed down through low\n 549|\n 550| # ── Sell CALL spread: BUY ATM CE (unless long CE already exists) + SELL ITM1 CE ──\n 551| short_ce, _ = self._find_in(positions, 'CE', 'short')\n 552| if not short_ce and sell_call_signal:\n 553| if 'sell_call' in self._skip_entry:\n 554| log(f\"SELL
... [23144 chars total, truncated]
Alright, I've done a thorough review of both bots and the checklist. Let me share the key nuances I spotted, then we'll dive into questions for the new bot.
---
## Key Nuances Found
### CLAUDE_BOT (RSI + SMMA — `unified_strategy.py`)
**Good patterns:**
- Broker position filter: `underlying in symbol` — isolates positions per underlying ✅
- `prev_ltp` is RAM-only, not persisted — no stale anchor bug on restart ✅
- Dual-trigger entry (SMMA2 crossover + RSI gap) is well-designed
- RSI re-entry (up to 2x after gap exit) is clean
- Manual exit detection + re-arm logic is solid
**Risks / nuances:**
- State file IS used and IS persisted — violates Section 5 and Section 16 of the checklist ⚠️
- `prev_smma_side`, `prev_rsi_state`, `smma_crossover_pending` etc. all survive restart
- If bot crashes with an active position + pending state, on restart it loads that state from file — but broker position is truth, so there's a mismatch risk
- `get_all_underlying_positions()` accumulates qty across ALL symbols matching the underlying — correct ✅ but only called for lot cap check, not for entry gating
- No explicit startup entry guard (prev_ltp=None on HAL bot but not on SMMA bot — different codebases)
- Friday squareoff at 15:28 but market close is 15:30 — 2-min buffer
---
### LT 3-CANDLE BOT (`lt_3candle_bot.py`)
**Good patterns:**
- Data source split: Flattrade for history, Kotak for live — necessary since Kotak has no history API ✅
- `prev_ltp` is RAM-only, not persisted ✅
- 15-min candles built from 3×5-min locally — zero extra API calls for history ✅
- Stale candle detection with Telegram alert ✅
- Symbol filtering: `symbol.startswith(SYMBOL_UNDER)` in positionbook — correct per Section 20 ✅
- EOD squareoff only on Fridays (NRML carry Mon-Thu) ✅
- Replay on startup without firing signals ✅
**Risks / nuances:**
- State file IS used (but position is preserved across days correctly) ⚠️
- `exit_failed` and `hedge_placed` ARE persisted — if bot restarts mid-failure, it reloads this state
- PnL calculation formula: `(opt_ltp - pos['entry_price']) * LOT_SIZE` — always treats as long profit, works here since bot only goes LONG, but fragile
- Entry price check: `qty >= LOT_SIZE` for BUY confirmation — but this doesn't distinguish long from short (if somehow a short existed from another bot, `qty >= LOT_SIZE` would be true)
- No manual exit detection (different from HAL bot which has `_session_legs` tracking)
- Exit failure → hedge + Telegram alert every 5 min, but if bot restarts the every-5-min alert doesn't restore
---
### BOT RULES (`bot_rules.md`) — Critical Reference
The 3 rules that caused real bugs in production:
1. **BUY offset = +5, SELL offset = -5** (opposite directions) — same bug hit two bots independently
2. **Broker is sole truth** — no state file comparisons on entry/exit
3. **Crossover, not level** — `prev_ltp > level >= fut_ltp` not `fut_ltp >= level`
---
Now let's build the new bot. I'll start asking you questions in priority order:
**Q1: Direction — Long or Spread?**
Both existing bots only go LONG (buy options, never sell). The HAL Renko VIDYA bot does a spread (BUY ATM + SELL ITM1) but only for the sell leg to reduce margin. The LT 3-candle bot is purely directional.
Is the new bot going to be:
- **A) Pure Long** — buy options only, simple but requires more margin
- **B) Spread** — BUY + SELL combination (credit spread or debit spread), lower margin
- **C) Either leg independently** — sometimes BUY sometimes SELL based on signal
Which are you thinking for the new bot?