텔레그램 봇을 활용한 실시간 트레이딩 텔레메트리: 체결 알림, PnL 대시보드, 원격 비상 정지(!stop)

아키텍처 요약 및 실전 엔지니어링 개요

24시간 자율 가동되는 무인 자동매매 봇이라 할지라도, 시스템 운영자는 외부 이동 중이나 취침 중에도 계좌의 체결 상태, 일일 누적 평가 손익(PnL), 호가 수신 지연율을 한눈에 파악할 수 있어야 합니다. 또한 비정상적인 시장 급변 시 즉각 스마트폰 터치 한 번으로 시스템을 정지시킬 수 있는 원격 제어 채널이 필수적입니다. 본 리포트에서는 텔레그램 Bot API와 웹훅(Webhook) 기반 비동기 텔레메트리 파이프라인 및 원격 비상 정지(!stop) 킬스위치 아키텍처를 전격 공개합니다.

1. 텔레그램 텔레메트리 아키텍처와 비차단(Non-blocking) 알림 큐

트레이딩 봇의 핵심 엔진 스레드가 텔레그램 메시지 전송(HTTP POST)을 동기식으로 호출하는 것은 대단히 위험합니다. 텔레그램 해외 서버와의 통신 지연(통상 200~800ms) 동안 메인 매매 루프가 블로킹되어 실시간 틱 수신을 놓치기 때문입니다.

[Main Trading Engine] ──(Zero-Wait Queue Put)──> [Async Telemetry Dispatcher]
│
(Background HTTP POST, Non-blocking)
▼
[Administrator Smartphone] <───(Instant Push Notification)─── [Telegram Cloud API]

따라서 모든 텔레메트리 메시지는 비동기 큐에 집어넣고 메인 스레드는 0마이크로초 만에 즉시 다음 매매 연산으로 복귀해야 하며, 백그라운드 워커 스레드가 텔레그램 API 호출을 전담하도록 설계해야 합니다.

알림 전송 방식 메인 트레이딩 루프 블로킹 지연 초당 매매 틱 유실 가능성 메시지 전송 신뢰성
동기식 HTTP POST (`requests.post`) 250 ~ 650 ms (치명적 병목) 매우 높음 (소켓 버퍼 폭주) 인터넷 지연 시 봇 전체 프리징
백그라운드 스레드 + Queue 0.02 ms (즉각 복귀) 0.00% (유실 제로) 안정적 비동기 전송
비동기 Aiohttp 텔레메트리 (본 방식) 0.005 ms (완전 비차단) 0.00% (완전 면역) 실시간 웹훅 및 양방향 제어

2. 텔레그램 봇 양방향 비상 제어기 파이썬 구현

단순한 일방향 알림을 넘어, 관리자의 인가된 텔레그램 계정(Chat ID)으로부터만 명령어를 수신하여 봇의 동작 모드를 원격 변경하는 양방향 커맨드 디스패처를 구현합니다.

# 실전 텔레그램 양방향 텔레메트리 및 킬스위치 엔진 (보안 마스킹 규격 준수)
import os
import asyncio
import aiohttp

class TelegramTradingTelemetry:
    def __init__(self, main_bot_controller):
        # 환경 변수로부터 안전하게 토큰 바인딩 (보안 규격 준수)
        self.bot_token = os.environ.get("TELEGRAM_BOT_TOKEN", "MASKED_BOT_TOKEN")
        self.admin_chat_id = os.environ.get("TELEGRAM_ADMIN_CHAT_ID", "MASKED_CHAT_ID")
        self.controller = main_bot_controller
        self.api_url = f"https://api.telegram.org/bot{self.bot_token}"

    async def send_alert_async(self, message_text):
        url = f"{self.api_url}/sendMessage"
        payload = {
            "chat_id": self.admin_chat_id,
            "text": message_text,
            "parse_mode": "HTML"
        }
        async with aiohttp.ClientSession() as session:
            try:
                await session.post(url, json=payload, timeout=5)
            except Exception as e:
                print(f"[TELEGRAM ERROR] Failed to send alert: {e}")

    async def poll_admin_commands(self):
        offset = 0
        while True:
            url = f"{self.api_url}/getUpdates?offset={offset}&timeout=20"
            async with aiohttp.ClientSession() as session:
                try:
                    async with session.get(url, timeout=25) as resp:
                        data = await resp.json()
                        for update in data.get("result", []):
                            offset = update["update_id"] + 1
                            msg = update.get("message", {})
                            from_id = str(msg.get("chat", {}).get("id"))
                            text = msg.get("text", "").strip()

                            # 철저한 관리자 ID 인가 검증
                            if from_id == self.admin_chat_id:
                                await self.handle_command(text)
                except Exception:
                    await asyncio.sleep(5)

    async def handle_command(self, cmd):
        if cmd == "!stop":
            await self.send_alert_async("🚨 [EMERGENCY] 봇 긴급 정지 명령 수신. 모든 주문 취소 및 안전 종료.")
            self.controller.execute_emergency_halt()
        elif cmd == "!pnl":
            report = self.controller.generate_pnl_summary()
            await self.send_alert_async(f"📊 [실시간 PnL 리포트]
{report}")

3. 텔레메트리 대시보드 리포팅 규격과 스팸 방지 레이트 리밋

초단타 스캘핑 봇은 하루에도 수백 번의 매매를 체결하므로, 모든 체결을 일일이 텔레그램으로 쏘면 알림 스팸으로 인해 스마트폰 배터리가 방전되고 텔레그램 서버로부터 메시지 전송 한도(초당 30건) 제한을 받게 됩니다. 체결 알림은 요약 버퍼에 누적했다가 1분 단위 또는 익절/손절 완료 시점에만 번들로 전송하는 집계 파이프라인(Aggregation Pipeline)을 적용해야 합니다.

알림 카테고리 발송 트리거 조건 메시지 우선순위 발송 주기 제한
비상 에러 / 락다운 소켓 단절, 손실 한도 도달, 프로세스 프리징 CRITICAL (최우선 즉시 발송) 즉시 발송 (무제한)
포지션 청산 리포트 트레일링 스탑 또는 익절 완료 시 HIGH (실현 손익 보고) 체결 즉시 (초당 1건 제한)
정기 상태 브리핑 장중 매 정각 (10:00, 11:00…) NORMAL (시스템 지표 요약) 1시간 1회 정기 발송

4. 결론: 인간과 AI의 완벽한 상호 운용성 확보

자율주행 자동차에도 운전자가 언제든 개입할 수 있는 스티어링 휠과 비상 브레이크가 필수적이듯, 퀀트 자동매매 에이전트 역시 텔레그램 텔레메트리라는 투명한 창문과 원격 킬스위치라는 안전장치가 결합될 때 비로소 진정한 실전 프로덕션 레벨의 신뢰성을 획득할 수 있습니다.

실무 엔지니어링 팁: 2단계 인가 코드(Two-Factor Pin) 적용

스마트폰 분실이나 실수로 인한 오작동을 막기 위해, 포지션을 전량 시장가로 내던지는 `!panic_sell`과 같은 고위험 파괴적 명령어는 `!panic_sell 7732`와 같이 사전에 지정된 4자리 일회용 PIN 번호를 함께 입력해야만 실행되도록 2단계 검증(Two-Factor Authentication) 로직을 결합해야 합니다.

댓글 남기기