Skip to content

Token Trading Bot System

1. System Overview

The token trading bot system is an automated trading system implemented in Solidity that supports multiple trading strategies and risk management mechanisms. The system implements flexible strategy configuration and comprehensive security controls.

1.1 Main Features

  • Multi-strategy support: Supports various trading strategies
  • Risk control: Comprehensive risk management
  • Automatic execution: Automated trade execution
  • Real-time monitoring: Market state monitoring
  • Emergency control: Emergency handling mechanisms

2. Contract Implementation

solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

/**
 * @title TradingBot
 * @dev Automated trading bot contract
 */
contract TradingBot is Ownable, ReentrancyGuard {
    using SafeMath for uint256;

    // Trading strategy
    struct Strategy {
        bool isActive;              // Whether active
        uint256 minAmount;          // Minimum trading amount
        uint256 maxAmount;          // Maximum trading amount
        uint256 priceThreshold;     // Price threshold
        uint256 interval;           // Trading interval
        uint256 lastTradeTime;      // Last trade time
        TradeType tradeType;        // Trade type
        RiskLevel riskLevel;        // Risk level
    }

    // Trade record
    struct TradeRecord {
        uint256 amount;            // Trading amount
        uint256 price;             // Trading price
        uint256 timestamp;         // Trading time
        TradeType tradeType;       // Trade type
        bool isSuccess;            // Whether successful
    }

    // Trade type
    enum TradeType {
        BUY,      // Buy
        SELL,     // Sell
        SWAP      // Swap
    }

    // Risk level
    enum RiskLevel {
        LOW,      // Low risk
        MEDIUM,   // Medium risk
        HIGH      // High risk
    }

    // State variables
    mapping(uint256 => Strategy) public strategies;              // Strategy information
    mapping(uint256 => TradeRecord[]) public tradeRecords;      // Trade records
    mapping(address => bool) public whitelistedTokens;          // Whitelisted tokens
    uint256 public strategyCount;                               // Strategy count
    uint256 public maxStrategies;                               // Maximum strategies
    bool public paused;                                         // Pause status

    // Constants
    uint256 public constant PRECISION = 1e18;                   // Precision
    uint256 public constant MIN_INTERVAL = 5 minutes;           // Minimum interval
    uint256 public constant MAX_SLIPPAGE = 100;                // Maximum slippage (1%)

    // Events
    event StrategyCreated(uint256 indexed strategyId, TradeType tradeType, RiskLevel riskLevel);
    event StrategyUpdated(uint256 indexed strategyId);
    event TradeExecuted(uint256 indexed strategyId, uint256 amount, uint256 price);
    event TokenWhitelisted(address indexed token, bool status);
    event EmergencyStop(address indexed caller);

    /**
     * @dev Constructor
     */
    constructor(uint256 _maxStrategies) {
        maxStrategies = _maxStrategies;
    }

    /**
     * @dev Create trading strategy
     */
    function createStrategy(
        uint256 _minAmount,
        uint256 _maxAmount,
        uint256 _priceThreshold,
        uint256 _interval,
        TradeType _tradeType,
        RiskLevel _riskLevel
    ) external onlyOwner {
        require(strategyCount < maxStrategies, "Max strategies reached");
        require(_interval >= MIN_INTERVAL, "Interval too short");
        require(_maxAmount > _minAmount, "Invalid amounts");

        strategies[strategyCount] = Strategy({
            isActive: true,
            minAmount: _minAmount,
            maxAmount: _maxAmount,
            priceThreshold: _priceThreshold,
            interval: _interval,
            lastTradeTime: 0,
            tradeType: _tradeType,
            riskLevel: _riskLevel
        });

        emit StrategyCreated(strategyCount, _tradeType, _riskLevel);
        strategyCount = strategyCount.add(1);
    }

    /**
     * @dev Update trading strategy
     */
    function updateStrategy(
        uint256 strategyId,
        uint256 _minAmount,
        uint256 _maxAmount,
        uint256 _priceThreshold,
        uint256 _interval
    ) external onlyOwner {
        require(strategyId < strategyCount, "Invalid strategy ID");
        require(_interval >= MIN_INTERVAL, "Interval too short");
        require(_maxAmount > _minAmount, "Invalid amounts");

        Strategy storage strategy = strategies[strategyId];
        strategy.minAmount = _minAmount;
        strategy.maxAmount = _maxAmount;
        strategy.priceThreshold = _priceThreshold;
        strategy.interval = _interval;

        emit StrategyUpdated(strategyId);
    }

    /**
     * @dev Execute trade
     */
    function executeTrade(
        uint256 strategyId,
        address tokenIn,
        address tokenOut,
        uint256 amount,
        uint256 price
    ) external nonReentrant {
        require(!paused, "Trading paused");
        require(strategyId < strategyCount, "Invalid strategy ID");
        require(whitelistedTokens[tokenIn] && whitelistedTokens[tokenOut], "Token not whitelisted");

        Strategy storage strategy = strategies[strategyId];
        require(strategy.isActive, "Strategy not active");
        require(
            block.timestamp >= strategy.lastTradeTime.add(strategy.interval),
            "Too frequent"
        );
        require(amount >= strategy.minAmount && amount <= strategy.maxAmount, "Invalid amount");

        // Check price conditions
        require(checkPriceCondition(strategy, price), "Price condition not met");

        // Execute trade
        bool success = performTrade(strategy.tradeType, tokenIn, tokenOut, amount, price);
        require(success, "Trade failed");

        // Record trade
        tradeRecords[strategyId].push(TradeRecord({
            amount: amount,
            price: price,
            timestamp: block.timestamp,
            tradeType: strategy.tradeType,
            isSuccess: true
        }));

        strategy.lastTradeTime = block.timestamp;
        emit TradeExecuted(strategyId, amount, price);
    }

    /**
     * @dev Check price conditions
     */
    function checkPriceCondition(Strategy memory strategy, uint256 price) internal pure returns (bool) {
        if (strategy.tradeType == TradeType.BUY) {
            return price <= strategy.priceThreshold;
        } else if (strategy.tradeType == TradeType.SELL) {
            return price >= strategy.priceThreshold;
        }
        return true; // For SWAP type
    }

    /**
     * @dev Perform specific trade
     */
    function performTrade(
        TradeType tradeType,
        address tokenIn,
        address tokenOut,
        uint256 amount,
        uint256 price
    ) internal returns (bool) {
        if (tradeType == TradeType.BUY) {
            return executeBuy(tokenIn, tokenOut, amount, price);
        } else if (tradeType == TradeType.SELL) {
            return executeSell(tokenIn, tokenOut, amount, price);
        } else {
            return executeSwap(tokenIn, tokenOut, amount);
        }
    }

    /**
     * @dev Execute buy
     */
    function executeBuy(
        address tokenIn,
        address tokenOut,
        uint256 amount,
        uint256 price
    ) internal returns (bool) {
        // Implement buy logic
        return true;
    }

    /**
     * @dev Execute sell
     */
    function executeSell(
        address tokenIn,
        address tokenOut,
        uint256 amount,
        uint256 price
    ) internal returns (bool) {
        // Implement sell logic
        return true;
    }

    /**
     * @dev Execute swap
     */
    function executeSwap(
        address tokenIn,
        address tokenOut,
        uint256 amount
    ) internal returns (bool) {
        // Implement swap logic
        return true;
    }

    /**
     * @dev Set whitelisted tokens
     */
    function setTokenWhitelist(address token, bool status) external onlyOwner {
        whitelistedTokens[token] = status;
        emit TokenWhitelisted(token, status);
    }

    /**
     * @dev Pause/resume trading
     */
    function setPaused(bool _paused) external onlyOwner {
        paused = _paused;
        if (_paused) {
            emit EmergencyStop(msg.sender);
        }
    }

    /**
     * @dev Activate/deactivate strategy
     */
    function setStrategyActive(uint256 strategyId, bool active) external onlyOwner {
        require(strategyId < strategyCount, "Invalid strategy ID");
        strategies[strategyId].isActive = active;
    }

    /**
     * @dev Get strategy information
     */
    function getStrategy(uint256 strategyId) external view returns (
        bool isActive,
        uint256 minAmount,
        uint256 maxAmount,
        uint256 priceThreshold,
        uint256 interval,
        uint256 lastTradeTime,
        TradeType tradeType,
        RiskLevel riskLevel
    ) {
        require(strategyId < strategyCount, "Invalid strategy ID");
        Strategy storage strategy = strategies[strategyId];
        return (
            strategy.isActive,
            strategy.minAmount,
            strategy.maxAmount,
            strategy.priceThreshold,
            strategy.interval,
            strategy.lastTradeTime,
            strategy.tradeType,
            strategy.riskLevel
        );
    }

    /**
     * @dev Get trade record count
     */
    function getTradeRecordCount(uint256 strategyId) external view returns (uint256) {
        return tradeRecords[strategyId].length;
    }

    /**
     * @dev Get trade record
     */
    function getTradeRecord(uint256 strategyId, uint256 index) external view returns (
        uint256 amount,
        uint256 price,
        uint256 timestamp,
        TradeType tradeType,
        bool isSuccess
    ) {
        require(strategyId < strategyCount, "Invalid strategy ID");
        require(index < tradeRecords[strategyId].length, "Invalid index");
        
        TradeRecord storage record = tradeRecords[strategyId][index];
        return (
            record.amount,
            record.price,
            record.timestamp,
            record.tradeType,
            record.isSuccess
        );
    }

    /**
     * @dev Get trade records in batches
     */
    function getTradeRecords(
        uint256 strategyId,
        uint256 offset,
        uint256 limit
    ) external view returns (
        uint256[] memory amounts,
        uint256[] memory prices,
        uint256[] memory timestamps,
        TradeType[] memory tradeTypes,
        bool[] memory successes
    ) {
        require(strategyId < strategyCount, "Invalid strategy ID");
        require(offset < tradeRecords[strategyId].length, "Invalid offset");

        uint256 end = offset.add(limit);
        if (end > tradeRecords[strategyId].length) {
            end = tradeRecords[strategyId].length;
        }
        uint256 size = end.sub(offset);

        amounts = new uint256[](size);
        prices = new uint256[](size);
        timestamps = new uint256[](size);
        tradeTypes = new TradeType[](size);
        successes = new bool[](size);

        for (uint256 i = 0; i < size; i++) {
            TradeRecord storage record = tradeRecords[strategyId][offset.add(i)];
            amounts[i] = record.amount;
            prices[i] = record.price;
            timestamps[i] = record.timestamp;
            tradeTypes[i] = record.tradeType;
            successes[i] = record.isSuccess;
        }

        return (amounts, prices, timestamps, tradeTypes, successes);
    }
}

3. Function Description

3.1 Strategy Management

  • Create strategy
  • Update strategy
  • Activate/deactivate strategy

3.2 Trade Execution

  • Automated trading
  • Price check
  • Trade records

3.3 Risk Control

  • Whitelist management
  • Trade restrictions
  • Emergency pause

4. Security Mechanisms

4.1 Trade Control

  • Minimum trading interval
  • Trade amount restrictions
  • Slippage protection

4.2 Access Control

  • Permission management
  • Reentrancy protection
  • Parameter validation

4.3 Risk Management

  • Strategy risk level
  • Trade monitoring
  • Emergency handling

5. Usage Examples

5.1 Create Strategy

javascript
const minAmount = ethers.utils.parseEther("1");
const maxAmount = ethers.utils.parseEther("10");
const priceThreshold = ethers.utils.parseEther("100");
const interval = 3600; // 1 hour
await tradingBot.createStrategy(minAmount, maxAmount, priceThreshold, interval, 0, 0);

5.2 Execute Trade

javascript
const amount = ethers.utils.parseEther("5");
const price = ethers.utils.parseEther("98");
await tradingBot.executeTrade(0, tokenA.address, tokenB.address, amount, price);

5.3 Query Records

javascript
const records = await tradingBot.getTradeRecords(0, 0, 10);
console.log("Trade records:", records);

6. Summary

The token trading bot system implements a complete automated trading function, including:

  • Multi-strategy management
  • Automated trade execution
  • Risk control mechanisms
  • Trade record management
  • Emergency handling function

The system ensures the security and reliability of the trading process through carefully designed strategy management and risk control mechanisms.

Frequently Asked Questions (FAQ)

1. Basic Concepts

Q: What is a trading bot? A: A trading bot is an automated trading system with the following characteristics:

  • Automated execution of trading strategies
  • Real-time market monitoring
  • Quick response to price changes
  • Risk control management
  • 24/7 operation without interruption

Q: What are the advantages of a trading bot? A: The main advantages include:

  • Eliminating emotional trading
  • High execution speed
  • 24/7 operation
  • Strict risk control
  • Consistent execution of strategies

Q: How to create a trading strategy? A: The steps are as follows:

solidity
// 1. Set strategy parameters
const minAmount = ethers.utils.parseEther("1");
const maxAmount = ethers.utils.parseEther("10");
const priceThreshold = ethers.utils.parseEther("100");
const interval = 3600; // 1 hour

// 2. Create strategy
await tradingBot.createStrategy(
    minAmount,
    maxAmount,
    priceThreshold,
    interval,
    TradeType.BUY,
    RiskLevel.MEDIUM
);

Q: How to monitor trade execution? A: Monitoring methods include:

  • Event listening
  • Status query
  • Trade record tracking
  • Performance indicator monitoring
  • Risk indicator tracking

Q: What are the risks of a trading bot? A: The main risks include:

  • Market risk
  • Technical risk
  • Strategy risk
  • Liquidity risk
  • Operational risk

Q: How to protect trading security? A: Security measures include:

  • Whitelist mechanism
  • Trade limits
  • Frequency control
  • Emergency pause
  • Multi-factor verification

Q: How to optimize trading performance? A: Optimization strategies:

  • Batch processing
  • Gas optimization
  • Routing optimization
  • Slippage control
  • Timing selection

Q: How to improve trading success rate? A: Improvement solutions:

  • Market analysis
  • Price prediction
  • Risk assessment
  • Strategy optimization
  • Execution optimization

5. Implementation details

Q: How to handle trade failures? A: Failure handling mechanism:

solidity
function handleFailedTrade(uint256 strategyId, string memory reason) internal {
    // 1. Record failure
    // 2. Notify monitoring
    // 3. Adjust strategy
    // 4. Retry mechanism
    // 5. Risk control
}

Q: How to implement risk control? A: Control mechanisms:

  • Stop loss setting
  • Position control
  • Risk rating
  • Warning mechanism
  • Emergency handling

6. Best practices

Q: What are the suggestions for strategy development? A: Development suggestions:

  • Thorough testing
  • Risk assessment
  • Step-by-step implementation
  • Continuous monitoring
  • Regular optimization

Q: How to improve strategy effectiveness? A: Optimization directions:

  • Data analysis
  • Strategy backtesting
  • Parameter optimization
  • Risk management
  • Performance tuning

7. Error handling

Q: Common errors and solutions? A: Error types:

  • "Price condition not met": Check price threshold
  • "Invalid amount": Verify trading amount
  • "Too frequent": Wait for the interval time
  • "Strategy not active": Check strategy status
  • "Token not whitelisted": Confirm whitelisted tokens

Q: How to handle abnormal situations? A: Handling mechanisms:

  • Automatic pause
  • Fund protection
  • Status recovery
  • Log recording
  • Alarm notification

8. Upgrade and maintenance

Q: How to upgrade the trading system? A: Upgrade solutions:

  • Version management
  • Compatibility testing
  • Smooth upgrade
  • Data migration
  • Rollback mechanism

Q: How to monitor system status? A: Monitoring solutions:

  • Performance monitoring
  • Trade tracking
  • Risk indicators
  • Fund status
  • System logs

9. Integration with other systems

Q: How to integrate with DeFi protocols? A: Integration solutions:

  • Interface adaptation
  • Liquidity management
  • Price oracle
  • Risk sharing
  • Revenue optimization

Q: How to implement cross-chain trading? A: Implementation strategies:

  • Cross-chain bridging
  • Asset mapping
  • State synchronization
  • Risk control
  • Performance optimization

Released under the MIT License by Vogeb.