# Импортируем нужные классы из библиотек from fastapi import FastAPI from fastapi.responses import HTMLResponse, JSONResponse import subprocess import psutil # Создаём объект приложения app = FastAPI() # Обработчик GET-запросов по адресу / (корневой каталог) @app.get('/', response_class=HTMLResponse) async def index(): return '

MT5 Manager

' # Обработчик POST /start - запуск терминала @app.post('/start') async def start_instance(): result = start_mt5() return JSONResponse(result) # Обработчик POST /stop - остановка терминала @app.post('/stop', response_class=JSONResponse) async def stop_instance(): result = stop_mt5() return JSONResponse(result) # Путь к запускаемому файлу терминала MT5_PATH = 'C:/Program Files/MetaTrader 5/terminal64.exe' # Словарь для хранения информации о запущенном терминале instances = {} # Запуск терминала def start_mt5(): # Запускаем новый процесс process = subprocess.Popen([MT5_PATH]) # Идентификатор запущенного процесса pid = process.pid # Запоминаем идентификатор и статус процесса instances['default'] = {'pid': pid, 'status': 'running'} # Возвращаем результат - успешный запуск return {'instance': 'default', 'pid': pid} # Остановка терминала def stop_mt5(): # Если ранее терминал был запущен if 'default' in instances: # Берём идентификатор его процесса pid = instances['default']['pid'] try: # Получаем объект процесса терминала p = psutil.Process(pid) # Останавливаем процесс p.terminate() # Удаляем информацию о запущенном ранее процессе del instances['default'] # Возвращаем результат - успешная остановка return {'status': 'stopped', 'instance': 'default'} except psutil.NoSuchProcess: # Если процесс не найден, то # удаляем информацию о запущенном ранее процессе del instances['default'] # Возвращаем результат - процесс не найден return {'status': 'not found', 'instance': 'default'}