DEV Community

Fazil Hasanov
Fazil Hasanov

Posted on

Building Autonomous AI Agents for Real-Time Crypto Trading Using Python

Introduction

The cryptocurrency market operates 24/7, presenting both opportunities and challenges for traders. Manual trading is inefficient, emotionally driven, and prone to human error. Autonomous AI agents—self-executing trading bots—can analyze market data in real-time, execute trades at optimal moments, and adapt to changing conditions without fatigue.

In this guide, we’ll build a real-time crypto trading AI agent using Python. We’ll cover:

  • Market data streaming (WebSocket APIs)
  • Technical indicators (Moving Averages, RSI)
  • Decision-making logic (rule-based & ML-enhanced)
  • Order execution (via exchange APIs)
  • Backtesting & risk management

By the end, you’ll have a functional trading bot that can autonomously execute trades on exchanges like Binance or Coinbase.


1. Setting Up the Environment

Prerequisites

  • Python 3.8+
  • ccxt (for exchange APIs)
  • websockets (for real-time data)
  • pandas & numpy (for data analysis)
  • ta (for technical indicators)
  • python-dotenv (for API keys)

Install dependencies:

pip install ccxt websockets pandas numpy ta python-dotenv
Enter fullscreen mode Exit fullscreen mode

Exchange API Setup

Most exchanges (Binance, Coinbase, Kraken) require API keys for trading. Store them securely in a .env file:

BINANCE_API_KEY=your_api_key_here
BINANCE_API_SECRET=your_api_secret_here
Enter fullscreen mode Exit fullscreen mode

Load them in Python:

from dotenv import load_dotenv
import os

load_dotenv()
API_KEY = os.getenv("BINANCE_API_KEY")
API_SECRET = os.getenv("BINANCE_API_SECRET")
Enter fullscreen mode Exit fullscreen mode

2. Real-Time Market Data Streaming

Using WebSocket for Live Price Feeds

Exchanges like Binance provide WebSocket streams for real-time data. We’ll use websockets to subscribe to price updates.

import asyncio
import websockets
import json

async def binance_websocket(symbol="btcusdt"):
    uri = f"wss://stream.binance.com:9443/ws/{symbol}@trade"
    async with websockets.connect(uri) as websocket:
        while True:
            data = await websocket.recv()
            trade = json.loads(data)
            price = float(trade['p'])
            print(f"Price: {price}")  # Process price in real-time

# Run the WebSocket listener
asyncio.get_event_loop().run_until_complete(binance_websocket())
Enter fullscreen mode Exit fullscreen mode

Storing Data for Analysis

We’ll use pandas to store and analyze price data:

import pandas as pd

class PriceStreamer:
    def __init__(self):
        self.df = pd.DataFrame(columns=['timestamp', 'price'])

    def update(self, price):
        self.df.loc[len(self.df)] = [pd.Timestamp.now(), price]
        if len(self.df) > 100:  # Keep last 100 data points
            self.df = self.df.iloc[1:]
Enter fullscreen mode Exit fullscreen mode

3. Implementing Trading Strategies

Technical Indicators (Moving Averages & RSI)

We’ll use the ta library to compute indicators:

from ta.trend import SMAIndicator
from ta.momentum import RSIIndicator

def compute_indicators(df):
    df['sma_10'] = SMAIndicator(df['price'], window=10).sma_indicator()
    df['sma_50'] = SMAIndicator(df['price'], window=50).sma_indicator()
    df['rsi'] = RSIIndicator(df['price'], window=14).rsi()
    return df
Enter fullscreen mode Exit fullscreen mode

Rule-Based Trading Logic

A simple SMA crossover strategy:

  • Buy when sma_10 > sma_50 (uptrend)
  • Sell when sma_10 < sma_50 (downtrend)
def generate_signal(df):
    if df['sma_10'].iloc[-1] > df['sma_50'].iloc[-1] and df['sma_10'].iloc[-2] <= df['sma_50'].iloc[-2]:
        return "BUY"
    elif df['sma_10'].iloc[-1] < df['sma_50'].iloc[-1] and df['sma_10'].iloc[-2] >= df['sma_50'].iloc[-2]:
        return "SELL"
    return "HOLD"
Enter fullscreen mode Exit fullscreen mode

4. Executing Trades via Exchange API

Using CCXT for Order Execution

ccxt is a unified API for multiple exchanges. We’ll use Binance for this example.

import ccxt

class TradingBot:
    def __init__(self):
        self.exchange = ccxt.binance({
            'apiKey': API_KEY,
            'secret': API_SECRET,
            'enableRateLimit': True,
        })

    def execute_trade(self, symbol, side, amount):
        try:
            if side == "BUY":
                order = self.exchange.create_market_buy_order(symbol, amount)
            elif side == "SELL":
                order = self.exchange.create_market_sell_order(symbol, amount)
            print(f"Executed {side} order: {order}")
        except Exception as e:
            print(f"Trade failed: {e}")
Enter fullscreen mode Exit fullscreen mode

Risk Management (Stop-Loss & Take-Profit)

def set_stop_loss(self, symbol, price, stop_loss_pct=0.02):
    stop_price = price * (1 - stop_loss_pct)
    self.exchange.create_order(
        symbol,
        'stop_loss',
        'sell',
        amount=0.01,  # Adjust based on position size
        price=stop_price,
        params={'stopPrice': stop_price}
    )
Enter fullscreen mode Exit fullscreen mode

5. Backtesting the Strategy

Historical Data Fetching

def fetch_historical_data(symbol, timeframe='1h', limit=1000):
    ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
    df = pd.DataFrame(ohlcv, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
    df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
    return df
Enter fullscreen mode Exit fullscreen mode

Simulating Trades

def backtest(df, initial_balance=1000):
    balance = initial_balance
    position = 0
    for i in range(1, len(df)):
        signal = generate_signal(df.iloc[:i])
        if signal == "BUY" and position == 0:
            position = balance / df['close'].iloc[i]
            balance = 0
        elif signal == "SELL" and position > 0:
            balance = position * df['close'].iloc[i]
            position = 0
    return balance
Enter fullscreen mode Exit fullscreen mode

6. Deploying the AI Agent

Running the Bot 24/7

Use asyncio to run the WebSocket and trading logic concurrently:

async def main():
    streamer = PriceStreamer()
    bot = TradingBot()
    async for price in binance_websocket():
        streamer.update(price)
        df = compute_indicators(streamer.df)
        signal = generate_signal(df)
        if signal != "HOLD":
            bot.execute_trade("BTC/USDT", signal, 0.01)  # Trade 0.01 BTC

asyncio.run(main())
Enter fullscreen mode Exit fullscreen mode

Dockerizing for Cloud Deployment

Create a Dockerfile:

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "trading_bot.py"]
Enter fullscreen mode Exit fullscreen mode

Deploy on AWS/GCP for 24/7 operation.


7. Enhancing with Machine Learning (Optional)

Using LSTM for Price Prediction

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

def train_lstm(df):
    X, y = prepare_data(df)  # Normalize & reshape data
    model = Sequential([
        LSTM(50, return_sequences=True, input_shape=(X.shape[1], 1)),
        LSTM(50),
        Dense(1)
    ])
    model.compile(optimizer='adam', loss='mse')
    model.fit(X, y, epochs=20, batch_size=32)
    return model
Enter fullscreen mode Exit fullscreen mode

Integrating ML Predictions


python
def predict_next_price(model, df):
    last_data = df['price'].values[-100:].reshape(
Enter fullscreen mode Exit fullscreen mode

Top comments (0)