# MetaTrader 5 Trading Skill for QwenClaw ## Overview This skill enables QwenClaw to interact with MetaTrader 5 (MT5) for placing and managing trades on demo or live accounts. **Integration:** Python MetaTrader5 package + MQL5 --- ## Prerequisites ### 1. Install MetaTrader 5 Python Package ```bash pip install MetaTrader5 ``` ### 2. Ensure MT5 Terminal is Running The MT5 terminal must be logged in and running before executing trades. ### 3. Configure Account - Demo account recommended for testing - Ensure auto-trading is enabled (Alt+A) --- ## Usage ### Place a Buy Order ``` Place a BUY order for EURUSD: - Lot size: 0.1 - Stop Loss: 1.0800 - Take Profit: 1.0900 ``` ### Place a Sell Order ``` Place a SELL order for GBPUSD: - Lot size: 0.05 - Stop Loss: 1.2700 - Take Profit: 1.2500 ``` ### Close All Positions ``` Close all open positions ``` ### Get Account Info ``` Show my MT5 account balance and equity ``` ### Get Open Positions ``` Show all open positions ``` --- ## Python Implementation ```python import MetaTrader5 as mt5 from datetime import datetime class MT5Trader: def __init__(self): if not mt5.initialize(): raise Exception("Failed to initialize MT5 connection") def get_account_info(self): account_info = mt5.account_info() return { "balance": account_info.balance, "equity": account_info.equity, "margin": account_info.margin, "profit": account_info.profit, "currency": account_info.currency, } def get_positions(self): positions = mt5.positions_get() if positions is None: return [] return [ { "symbol": pos.symbol, "type": "BUY" if pos.type == mt5.ORDER_TYPE_BUY else "SELL", "volume": pos.volume, "price_open": pos.price_open, "price_current": pos.price_current, "sl": pos.sl, "tp": pos.tp, "profit": pos.profit, } for pos in positions ] def place_order( self, symbol: str, order_type: str, volume: float, sl: float = None, tp: float = None, comment: str = "QwenClaw Trade" ): # Get symbol info symbol_info = mt5.symbol_info(symbol) if symbol_info is None: return {"success": False, "error": f"Symbol {symbol} not found"} # Check if symbol is visible if not symbol_info.visible: if not mt5.symbol_select(symbol, True): return {"success": False, "error": f"Failed to select symbol {symbol}"} # Get current price tick = mt5.symbol_info_tick(symbol) if tick is None: return {"success": False, "error": "Failed to get current price"} # Determine order type and price if order_type.upper() == "BUY": trade_type = mt5.ORDER_TYPE_BUY price = tick.ask else: trade_type = mt5.ORDER_TYPE_SELL price = tick.bid # Prepare order request request = { "action": mt5.TRADE_ACTION_DEAL, "symbol": symbol, "volume": volume, "type": trade_type, "price": price, "sl": sl if sl else 0, "tp": tp if tp else 0, "deviation": 20, "magic": 234000, "comment": comment, "type_time": mt5.ORDER_TIME_GTC, "type_filling": mt5.ORDER_FILLING_IOC, } # Send order result = mt5.order_send(request) if result.retcode != mt5.TRADE_RETCODE_DONE: return { "success": False, "error": f"Order failed: {result.comment}", "retcode": result.retcode, } return { "success": True, "order": result.order, "deal": result.deal, "volume": result.volume, "price": result.price, "comment": result.comment, } def close_position(self, ticket: int): position = mt5.positions_get(ticket=ticket) if not position: return {"success": False, "error": f"Position {ticket} not found"} pos = position[0] # Prepare close request if pos.type == mt5.ORDER_TYPE_BUY: trade_type = mt5.ORDER_TYPE_SELL price = mt5.symbol_info_tick(pos.symbol).bid else: trade_type = mt5.ORDER_TYPE_BUY price = mt5.symbol_info_tick(pos.symbol).ask request = { "action": mt5.TRADE_ACTION_DEAL, "symbol": pos.symbol, "volume": pos.volume, "type": trade_type, "position": ticket, "price": price, "deviation": 20, "magic": 234000, "comment": "Close position", "type_time": mt5.ORDER_TIME_GTC, "type_filling": mt5.ORDER_FILLING_IOC, } result = mt5.order_send(request) if result.retcode != mt5.TRADE_RETCODE_DONE: return { "success": False, "error": f"Close failed: {result.comment}", } return { "success": True, "deal": result.deal, "profit": result.profit, } def close_all_positions(self): positions = mt5.positions_get() if positions is None: return {"success": True, "closed": 0} closed = 0 for pos in positions: result = self.close_position(pos.ticket) if result["success"]: closed += 1 return {"success": True, "closed": closed} def disconnect(self): mt5.shutdown() # Example usage if __name__ == "__main__": trader = MT5Trader() # Get account info info = trader.get_account_info() print(f"Balance: {info['balance']} {info['currency']}") print(f"Equity: {info['equity']}") # Place a demo trade result = trader.place_order( symbol="EURUSD", order_type="BUY", volume=0.1, sl=1.0800, tp=1.0900 ) if result["success"]: print(f"Order placed: {result['order']} at {result['price']}") else: print(f"Order failed: {result['error']}") trader.disconnect() ``` --- ## QwenClaw Integration ### Rig Agent Setup ```typescript import { RigClient } from "./rig"; const rig = new RigClient({ host: "127.0.0.1", port: 8080 }); // Create trading agent const traderAgentId = await rig.createAgent({ name: "mt5-trader", preamble: `You are a MetaTrader 5 trading assistant. When placing trades: 1. Always confirm symbol, direction, lot size 2. Set appropriate stop loss and take profit 3. Use demo account for testing 4. Report trade results clearly`, provider: "qwen", model: "qwen-plus", }); // Place trade const result = await rig.executePrompt(traderAgentId, ` Place a BUY order for EURUSD with: - Lot size: 0.1 - Stop Loss: 50 pips - Take Profit: 100 pips `); ``` --- ## Trade Examples ### Example 1: Simple Buy Order **Request:** ``` Buy 0.1 lot EURUSD at market ``` **Expected Result:** ```json { "success": true, "order": 123456789, "deal": 987654321, "volume": 0.1, "price": 1.0850, "symbol": "EURUSD", "type": "BUY" } ``` ### Example 2: Sell Order with SL/TP **Request:** ``` Sell 0.05 lot GBPUSD Stop Loss: 1.2700 Take Profit: 1.2500 ``` **Expected Result:** ```json { "success": true, "order": 123456790, "volume": 0.05, "price": 1.2600, "sl": 1.2700, "tp": 1.2500, "symbol": "GBPUSD", "type": "SELL" } ``` ### Example 3: Close All Positions **Request:** ``` Close all open positions ``` **Expected Result:** ```json { "success": true, "closed": 3 } ``` --- ## Risk Management ### Position Sizing | Account Balance | Recommended Max Lot | |-----------------|---------------------| | $1,000 | 0.01 - 0.05 | | $5,000 | 0.05 - 0.10 | | $10,000 | 0.10 - 0.25 | | $50,000+ | 0.25 - 0.50 | ### Stop Loss Guidelines - **EURUSD/GBPUSD:** 20-50 pips typical - **Gold (XAUUSD):** 50-100 pips typical - **Indices:** 100-200 points typical ### Risk Per Trade - **Conservative:** 1-2% of account per trade - **Moderate:** 2-3% of account per trade - **Aggressive:** 3-5% of account per trade (not recommended) --- ## Error Codes | Retcode | Description | |---------|-------------| | 10006 | No connection | | 10013 | Invalid request | | 10014 | Invalid volume | | 10015 | Invalid price | | 10016 | Invalid stops | | 10019 | Insufficient funds | | 10023 | Request rejected | | 10032 | Market closed | --- ## Safety Features ### Demo Mode (Default) - Always use demo account first - Verify account type before trading ### Confirmation Required - Always confirm trade details before execution - Show symbol, direction, volume, SL, TP ### Logging - Log all trade requests - Log all trade results - Keep audit trail --- ## Resources - **MetaTrader 5 Python Docs:** https://www.mql5.com/en/docs/python - **MetaTrader 5 Download:** https://www.metatrader5.com/en/download - **MQL5 Community:** https://www.mql5.com/ --- ## Skill Metadata ```yaml name: metatrader5-trading version: 1.0.0 category: trading description: MetaTrader 5 trading integration for placing and managing forex/CFD trades author: QwenClaw Team license: MIT tags: - trading - metatrader - mt5 - forex - cfd - demo ``` --- **Skill ready for QwenClaw integration!** 📊💹