feat(routing): wire AI target_asset end-to-end — bot trades the right perp
Closes the loop on the asset-routing prompt change. Previously the v5 prompt emitted target_asset (e.g. SOL, TRUMP) but bot_engine still read price_impact_asset and only ever traded BTC/ETH. Now the trade actually fires on whatever perp the AI picked. Schema (alembic 006): posts.target_asset (str) — HL perp ticker, any of the universe posts.category (str) — 6-class enum (direct_named, etc.) posts.expected_move_pct (float) — AI's 1h move estimate Wiring: truth_social.py persists the three fields when creating Post rows. bot_engine.py routing: asset = target_asset || price_impact_asset || BTC Old rows (target_asset=NULL) fall back to legacy BTC/ETH path — no retroactive scoring needed; new rows route correctly from now on. Hyperliquid trader doesn't need changes — `coin` is already a parameter, and analysis.py validated against HL_PERPS before storing target_asset so by the time bot_engine reads the field, it's guaranteed tradeable. Deployment: alembic upgrade head # adds the 3 columns Restart api container Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
"""Add target_asset / category / expected_move_pct to posts (v5 routing)
|
||||
|
||||
Revision ID: 006
|
||||
Revises: 005
|
||||
Create Date: 2026-05-08 00:00:00.000000
|
||||
|
||||
The v5 AI prompt outputs not just signal direction but also which specific
|
||||
perp to trade (could be BTC/ETH/SOL/TRUMP/anything on Hyperliquid). The
|
||||
bot reads `target_asset` to route the trade. `price_impact_asset` stays
|
||||
bound to BTC/ETH for the existing price_impact_monitor.
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision: str = "006"
|
||||
down_revision: Union[str, None] = "005"
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
with op.batch_alter_table("posts") as batch_op:
|
||||
batch_op.add_column(sa.Column("target_asset", sa.String(16), nullable=True))
|
||||
batch_op.add_column(sa.Column("category", sa.String(24), nullable=True))
|
||||
batch_op.add_column(sa.Column("expected_move_pct", sa.Float(), nullable=True))
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
with op.batch_alter_table("posts") as batch_op:
|
||||
batch_op.drop_column("expected_move_pct")
|
||||
batch_op.drop_column("category")
|
||||
batch_op.drop_column("target_asset")
|
||||
Reference in New Issue
Block a user