ответвлён от antekov/mt5-manager
		
	
		
			
				
	
	
		
			71 строка
		
	
	
	
		
			2,7 КиБ
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			71 строка
		
	
	
	
		
			2,7 КиБ
		
	
	
	
		
			Python
		
	
	
	
	
	
# Импортируем нужные классы из библиотек
 | 
						|
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 '<h1>MT5 Manager</h1>'
 | 
						|
 | 
						|
# Обработчик 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'}    
 |