ATLAS CEO AGENT

Prompt

ATLAS CEO AGENT

Creator:

About this prompt

The ATLAS (Autonomous Trading Leadership & Aggregation System) CEO Agent is the hierarchical coordinator for the IntelliTrade swarm.

Features:
Hierarchical swarm coordination using SwarmsAI HierarchicalSwarm
Multi-agent signal aggregation with weighted voting
Dynamic capital allocation across strategies
Win-only position management
Real-time P&L tracking and Telegram alerts

Characters13,509
Words1,172
~Tokens3,378
Size14.5 KB

atlas_real_trading.py

Real AsterDEX perpetuals trading coordinator + Flash Scalper skeleton

WARNING: USE AT YOUR OWN RISK — MONEY CAN BE LOST VERY QUICKLY

Paper trade / testnet FIRST. No stop-losses = very high risk.

import os import time import logging from dataclasses import dataclass from typing import List, Optional, Dict from enum import Enum from datetime import datetime

────────────────────────────────────────────────

Dependencies — install these

pip install aster-connector-python python-dotenv tenacity

(or use official aster_dex SDK if you have access)

────────────────────────────────────────────────

try: from aster.rest_api import Client as AsterClient except ImportError: raise ImportError( "Please install aster-connector-python: pip install aster-connector-python\n" "GitHub: https://github.com/asterdex/aster-connector-python" )

from tenacity import retry, stop_after_attempt, wait_exponential

────────────────────────────────────────────────

Logging

────────────────────────────────────────────────

logging.basicConfig( level=logging.INFO, format="%(asctime)s | %(levelname)7s | %(message)s", datefmt="%Y-%m-%d %H:%M:%S", ) logger = logging.getLogger("ATLAS-REAL")

────────────────────────────────────────────────

Domain models

────────────────────────────────────────────────

class Direction(Enum): LONG = "BUY" SHORT = "SELL"

@dataclass class Signal: symbol: str direction: Direction confidence: float # 0.0–1.0 expected_profit_usd: float

@dataclass class ProfitTargetConfig: quick_scalp: float = 2.00 standard: float = 2.50 high: float = 3.50 ultra: float = 4.00

@dataclass class AtlasConfig: min_trade_size_usd: float = 30.0 max_trade_size_usd: float = 150.0 max_open_positions: int = 8 leverage: int = 10 cycle_interval_sec: float = 15.0 min_consensus_confidence: float = 0.80 min_confirming_agents: int = 2 watched_symbols: List[str] = None dry_run: bool = True # ← VERY IMPORTANT — set False only when ready

def __post_init__(self):
    if self.watched_symbols is None:
        self.watched_symbols = ["BTCUSDT", "ETHUSDT", "SOLUSDT", "BNBUSDT"]

────────────────────────────────────────────────

Real AsterDEX Exchange Wrapper

────────────────────────────────────────────────

class AsterDEXExchange: def init(self, api_key: str, api_secret: str, testnet: bool = False): base_url = "https://fapi-testnet.asterdex.com" if testnet else "https://fapi.asterdex.com" self.client = AsterClient( key=api_key, secret=api_secret, base_url=base_url, timeout=5, show_limit_usage=True, ) self.testnet = testnet logger.info(f"Connected to AsterDEX {'TESTNET' if testnet else 'MAINNET'}")

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def get_mark_price(self, symbol: str) -> Optional[float]:
    try:
        ticker = self.client.ticker_price(symbol=symbol.upper())
        return float(ticker["price"])
    except Exception as e:
        logger.error(f"Failed to get mark price {symbol}: {e}")
        return None

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=30))
def get_positions(self) -> List[dict]:
    """Returns list of current open positions (simplified)"""
    try:
        return self.client.position()
    except Exception as e:
        logger.error(f"Positions fetch failed: {e}")
        return []

@retry(stop=stop_after_attempt(2), wait=wait_exponential(multiplier=1, min=4, max=15))
def get_balance(self) -> float:
    try:
        bal = self.client.balance()
        for asset in bal:
            if asset["asset"] == "USDT":
                return float(asset.get("availableBalance", 0.0))
        return 0.0
    except Exception as e:
        logger.error(f"Balance fetch failed: {e}")
        return 0.0

def open_market_position(self, symbol: str, side: str, quantity: float, leverage: int, dry_run: bool = True) -> bool:
    if dry_run:
        logger.warning(f"[DRY-RUN] Would open {side} {quantity:.4f} {symbol} @ market (leverage {leverage}x)")
        return True

    try:
        params = {
            "symbol": symbol.upper(),
            "side": side.upper(),
            "type": "MARKET",
            "quantity": f"{quantity:.3f}",  # adjust precision per symbol
            "leverage": str(leverage),
            "positionSide": "BOTH",        # or LONG/SHORT if hedge mode
        }
        resp = self.client.new_order(**params)
        logger.info(f"OPENED {side} {symbol} qty={quantity:.3f} → {resp}")
        return True
    except Exception as e:
        logger.error(f"Open failed {symbol} {side}: {e}")
        return False

def close_position(self, position: dict, dry_run: bool = True) -> bool:
    symbol = position["symbol"]
    side = "SELL" if position["positionAmt"].startswith("+") else "BUY"  # opposite
    qty = abs(float(position["positionAmt"]))

    if dry_run:
        logger.warning(f"[DRY-RUN] Would CLOSE {symbol} {qty:.4f} ({side})")
        return True

    try:
        params = {
            "symbol": symbol,
            "side": side,
            "type": "MARKET",
            "quantity": f"{qty:.3f}",
            "reduceOnly": "true",
        }
        resp = self.client.new_order(**params)
        logger.info(f"CLOSED {symbol} → {resp}")
        return True
    except Exception as e:
        logger.error(f"Close failed {symbol}: {e}")
        return False

────────────────────────────────────────────────

Flash Scalper — IMPLEMENT YOUR REAL LOGIC HERE

────────────────────────────────────────────────

class FlashScalper: def init(self, name: str = "FlashScalper"): self.name = name self.weight = 1.00

def generate_signal(self, symbol: str, exchange: AsterDEXExchange) -> Optional[Signal]:
    """
    IMPLEMENT REAL SIGNAL LOGIC HERE
    Examples:
      - Fetch 1s/5s klines via websocket or REST → momentum / RSI / breakout
      - Use external predictor (ML model, oracle agent, sentiment score)
      - Check order-book imbalance
    """
    # Placeholder — REPLACE completely
    mark_price = exchange.get_mark_price(symbol)
    if not mark_price:
        return None

    # Example dummy condition — YOU MUST CHANGE THIS
    if random.random() > 0.92:  # just ~8% chance — replace with real condition
        direction = Direction.LONG if random.random() > 0.5 else Direction.SHORT
        confidence = round(random.uniform(0.78, 0.96), 3)
        profit_target = round(random.uniform(2.0, 4.2), 2)
        return Signal(symbol, direction, confidence, profit_target)

    return None

────────────────────────────────────────────────

ATLAS CEO — real trading coordinator

────────────────────────────────────────────────

class AtlasCEO: def init( self, config: AtlasConfig, profit_config: ProfitTargetConfig, exchange: AsterDEXExchange, ): self.config = config self.profit_config = profit_config self.exchange = exchange

    # Add real agents when you implement them
    self.workers = [FlashScalper("Flash_v1")]

def collect_signals(self) -> Dict[str, List[Signal]]:
    signals: Dict[str, List[Signal]] = {sym: [] for sym in self.config.watched_symbols}

    for worker in self.workers:
        for symbol in self.config.watched_symbols:
            sig = worker.generate_signal(symbol, self.exchange)
            if sig:
                signals[symbol].append(sig)

    return signals

def aggregate_signals(self, signals_per_symbol: Dict[str, List[Signal]]) -> List[Signal]:
    decisions = []

    for symbol, sigs in signals_per_symbol.items():
        if len(sigs) < self.config.min_confirming_agents:
            continue

        long_score = sum(s.confidence * w for s in sigs if s.direction == Direction.LONG for w in [1.0])
        short_score = sum(s.confidence * w for s in sigs if s.direction == Direction.SHORT for w in [1.0])
        total_w = len(sigs)  # simplified; use real weights later

        if total_w == 0:
            continue

        long_score /= total_w
        short_score /= total_w

        if long_score > short_score and long_score >= self.config.min_consensus_confidence:
            best = max((s for s in sigs if s.direction == Direction.LONG), key=lambda x: x.confidence)
            decisions.append(best)
        elif short_score > long_score and short_score >= self.config.min_consensus_confidence:
            best = max((s for s in sigs if s.direction == Direction.SHORT), key=lambda x: x.confidence)
            decisions.append(best)

    return decisions

def decide_quantity(self, symbol: str, usd_size: float) -> float:
    price = self.exchange.get_mark_price(symbol)
    if not price or price <= 0:
        return 0.0
    # Very naive — in reality use contract size / step size from /exchangeInfo
    qty = usd_size / price
    return round(qty, 3)  # adjust precision per symbol

def check_and_close_winners(self):
    positions = self.exchange.get_positions()
    for pos in positions:
        if float(pos.get("positionAmt", 0)) == 0:
            continue

        unrealized = float(pos.get("unRealizedProfit", 0))
        if unrealized < self.profit_config.quick_scalp:
            continue  # not profitable enough

        logger.info(f"Profitable position detected {pos['symbol']} PnL ${unrealized:.2f}")
        self.exchange.close_position(pos, dry_run=self.config.dry_run)

def run_cycle(self):
    logger.info(f"Cycle {datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S UTC')} — balance ~${self.exchange.get_balance():,.1f}")

    self.check_and_close_winners()

    current_positions = len([p for p in self.exchange.get_positions() if float(p.get("positionAmt", 0)) != 0])
    if current_positions >= self.config.max_open_positions:
        logger.info("Max positions reached — skipping entries")
        return

    signals_by_symbol = self.collect_signals()
    final_signals = self.aggregate_signals(signals_by_symbol)

    for sig in final_signals:
        if current_positions >= self.config.max_open_positions:
            break

        size_usd = min(
            max(self.config.min_trade_size_usd, random.uniform(0.7, 1.0) * self.config.max_trade_size_usd),
            self.exchange.get_balance() * 0.15  # max ~15% per trade
        )

        qty = self.decide_quantity(sig.symbol, size_usd)
        if qty <= 0:
            continue

        success = self.exchange.open_market_position(
            symbol=sig.symbol,
            side=sig.direction.value,
            quantity=qty,
            leverage=self.config.leverage,
            dry_run=self.config.dry_run
        )
        if success:
            current_positions += 1

def run(self, cycles: int = 999_999):
    logger.warning("====================================================================")
    logger.warning("          REAL TRADING MODE — MONEY AT RISK — NO STOP LOSSES         ")
    logger.warning(f"                    Dry-run = {self.config.dry_run}                        ")
    logger.warning("====================================================================")

    for i in range(cycles):
        try:
            self.run_cycle()
        except KeyboardInterrupt:
            logger.info("Keyboard interrupt — shutting down")
            break
        except Exception as e:
            logger.exception(f"Cycle crashed: {e}")

        time.sleep(self.config.cycle_interval_sec)

────────────────────────────────────────────────

Main

────────────────────────────────────────────────

if name == "main": from dotenv import load_dotenv load_dotenv()

config = AtlasConfig(
    min_trade_size_usd=35.0,
    max_trade_size_usd=140.0,
    max_open_positions=5,
    leverage=10,
    cycle_interval_sec=12.0,
    min_consensus_confidence=0.78,
    min_confirming_agents=1,   # increase when you have more agents
    dry_run=True,              # ← CHANGE TO FALSE ONLY WHEN YOU ARE READY
)

profit_config = ProfitTargetConfig(
    quick_scalp=1.90,
    standard=2.60,
    high=3.40,
    ultra=4.20,
)

api_key = os.getenv("ASTERDEX_API_KEY")
api_secret = os.getenv("ASTERDEX_API_SECRET")

if not api_key or not api_secret:
    raise ValueError("Missing ASTERDEX_API_KEY or ASTERDEX_API_SECRET in .env")

exchange = AsterDEXExchange(
    api_key=api_key,
    api_secret=api_secret,
    testnet=True   # ← change to False for mainnet
)

ceo = AtlasCEO(config, profit_config, exchange)

ceo.run(cycles=999_999)  # ctrl+c to stop

Comments & Discussion

Scroll to load comments...

Tags

AI
Management Agent
Swarms Management

Share

Chat

Chat
Related Links
Tokenization

This item is not available for tokenization.

Loading recommendations...

Yuki

Your Marketplace Companion

Prompt

Hey, I'm Yuki 👋

Ask me about specific products, customer support, or anything about the Swarms Marketplace.