바이비트 알트코인 알람봇 완전 개편 - 숏/롱 조건 최적화 &
바이비트 알트코인 알람봇을 운영하면서 가장 답답했던 순간은, 차트를 보면 분명 숏/롱 진입 조건이 맞는데 텔레그램 알람이 오지 않을 때였습니다. 오늘은 알람봇에 누적된 버그 3가지를 수정하고, 조건 로직을 전면 개편한 내용을 정리합니다. 이 글을 읽으면 바이비트 알트코인 알람봇의 작동 원리와 최적화 방향을 명확히 이해할 수 있습니다.
알람봇이 알람을 보내지 않았던 진짜 이유
백테스트 결과 신호는 분명히 탐지되고 있었습니다. 그런데 텔레그램에는 아무것도 오지 않았습니다.
로그를 뒤지다 발견한 경고 메시지: no running event loop.
알람봇의 스캔 함수가 별도 스레드에서 실행되는데, 텔레그램 발송 코드가 asyncio.create_task()를 사용해
스레드에서 호출하면 이벤트 루프를 찾지 못해 예외가 발생했던 것입니다.
더 큰 문제는 이 예외가 try/except에 조용히 잡혀서 알람봇이 처음부터 단 한 번도 알람을 보내지 못하고 있었다는 점입니다.
📝 직접 겪은 이야기
처음 no running event loop 에러를 로그에서 발견했을 때, 봇이 돌고 있다는 건 알았는데 알람만 안 오는 이유를 며칠 동안 몰랐다. 텔레그램 토큰이 잘못됐나, 채팅 ID가 틀렸나, 수십 가지를 점검했다. 문제는 전혀 다른 곳에 있었다. 이벤트 루프 없는 스레드에서 코루틴을 호출하는 구조 자체가 문제였다. 로그를 찬찬히 읽는 습관이 없었다면 영원히 몰랐을 버그다.
버그 수정 3가지 — 알람봇 핵심 오류 교정
1. 텔레그램 알람 미발송 버그 (asyncio 이벤트 루프 문제)
알람봇의 스캔 루프는 run_in_executor로 별도 스레드에서 실행됩니다.
이 스레드 내부에서 asyncio.create_task()를 호출하면 메인 이벤트 루프가 없어 RuntimeError가 발생합니다.
수정: asyncio.run_coroutine_threadsafe(coro, loop)를 사용해 메인 루프에 안전하게 코루틴을 예약했습니다.
# 수정 전
asyncio.create_task(_send(msg))
# 수정 후
asyncio.run_coroutine_threadsafe(_send(msg), _loop)
2. StochRSI 파라미터 오설정 — 항상 0을 반환하던 문제
알람봇 설정 파일에서 StochRSI 파라미터 값이 반대로 입력돼 있었습니다.
| 파라미터 | 기존 (잘못됨) | 수정 후 |
|---|---|---|
| RSI 길이 | 1 | 100 |
| Stoch 길이 | 1 | 100 |
| K 스무딩 | 100 | 1 |
| D 스무딩 | 100 | 1 |
Stoch 길이 1이면 rolling(1).min() = rolling(1).max() = 현재값이 되어 항상 0을 반환합니다. 결과적으로 StochRSI 50 아래 조건이 항상 True로 통과되어 실질적 필터링이 불가능했습니다.
📝 실전에서 배운 것
StochRSI 파라미터가 완전히 거꾸로 설정돼 있던 걸 발견했을 때 허탈했다. 조건 로직은 맞는데 항상 True를 반환하고 있으니 사실상 필터가 없는 것과 같았다. 그동안 신호가 너무 잦다고 생각했던 이유가 이거였다. 설정 파일 한 줄 차이가 봇의 본질을 바꿔놓는다는 걸 이 경험으로 배웠다.
3. 스토캐스틱 조건 수정 — 교차 순간 → 상태 유지로
기존 1시간봉 스토캐스틱 조건은 K가 D 아래로 교차하는 단 1캔들만 감지했습니다. 1시간봉에서 교차 순간에 5분봉 MACD까지 동시에 맞는 경우는 거의 없어 신호가 0건이었습니다. 수정: K < D 상태이면 지속적으로 조건 통과하도록 변경했습니다.
알람봇 조건 변경 3가지
4. 5분봉 WAE 조건 제거
41시간 백테스트 결과, WAE 조건이 유효 신호의 27.5%를 추가 필터링하고 있었습니다. 5분봉 타점에서는 EMA + SRSI + MACD 조건으로도 충분히 노이즈 필터링이 가능하다고 판단해 제거했습니다.
5. 1H EMA 조건 — 이벤트 → 상태로 변경
기존: EMA5 데드크로스 EMA10 + 현재가 EMA60 아래 (이벤트성)
수정: EMA5 < EMA10 < EMA60 역배열 상태 유지 시 조건 통과
6. 하이킨아시 윗꼬리 허용 비율 확대
하이킨아시와 WAE를 활용한 실전 타점 찾기에서 다뤘듯, 하이킨아시는 추세 방향을 판단하는 강력한 도구입니다. 윗꼬리 5% 이하 조건이 너무 엄격해 유효한 음봉도 필터링하는 경우가 많았습니다. 허용 비율을 5% → 20%로 확대했습니다.
신규 기능: 롱 알람 & 계단식 필터 구조
롱 알람 추가 — 숏의 완전 반대 조건
기존 알람봇은 숏 방향만 감지했습니다. 이번 업데이트로 롱 타점 알람을 추가했습니다. 자동매매 봇 개발기 V1~V9에서 방향성 필터의 중요성을 강조했듯, 롱/숏 양방향 감지로 시장 상황에 맞는 알람을 받을 수 있습니다.
계단식 필터 구조 — 3개 타임프레임 모두 충족 시에만 발송
기존에는 1H/15M/5M이 각각 독립적으로 알람을 발송했습니다. 수정 후 구조:
- 1H 조건 통과 → 15M 조건 확인
- 15M 조건 통과 → 5M 조건 확인
- 5M MACD 조건 충족 → 🎯 타점 알람 발송
3개 타임프레임이 정렬된 고확률 타점만 알림받을 수 있습니다.
실시간 스캔 & 번들 발송
5분 간격 스케줄 → 60초 간격 연속 스캔으로 전환, 코인별 개별 메시지 → 번들 발송으로 변경했습니다.
최종 숏/롱 알람봇 조건 정리
🔴 숏 타점 조건
| 타임프레임 | 조건 |
|---|---|
| 1H | 하이킨아시 음봉(윗꼬리 20%이하) / EMA5<EMA10<EMA60 역배열 / WAE 주황·빨강 / MACD 0아래 빨강 / 스토캐스틱 K<D / SRSI 50↓ |
| 15M | EMA10<EMA20 역배열 / WAE 주황·빨강 / MACD 0아래 / SRSI 50↓ |
| 5M | EMA10<EMA20 역배열 / SRSI 50↓ / MACD Case A 또는 Case B |
🟢 롱 타점 조건
| 타임프레임 | 조건 |
|---|---|
| 1H | 하이킨아시 양봉(아랫꼬리 20%이하) / EMA5>EMA10>EMA60 정배열 / WAE 녹색 / MACD 0위 파랑 / 스토캐스틱 K>D / SRSI 50↑ |
| 15M | EMA10>EMA20 정배열 / WAE 녹색 / MACD 0위 / SRSI 50↑ |
| 5M | EMA10>EMA20 정배열 / SRSI 50↑ / MACD Case A 또는 Case B |
백테스트 결과 — 조건 최적화 효과 검증
상위 30개 알트코인, 최근 41시간 데이터 기준 백테스트 결과입니다.
| 구분 | 숏 | 롱 | 합계 |
|---|---|---|---|
| 최종 조건 (HA 윗꼬리 20%) | 13건 | 3건 | 16건 |
| HA 윗꼬리 조건 제거 시 | 20건 | 8건 | 28건 (+75%) |
신호 발생 주요 코인: XLMUSDT(롱 3건), WLDUSDT(숏 2건), ZECUSDT(숏 1건), LABUSDT(숏 1건), LINKUSDT(숏 1건). 코인 선물 자동매매 봇 개발기에서 경험했듯, 백테스트 신호 수가 너무 많으면 과최적화 위험이 있고, 너무 적으면 실전 진입 기회를 놓칩니다. 41시간 기준 16건은 적절한 수준으로 판단합니다.
📝 백테스트와 실전 사이
41시간 백테스트에서 16건이 나왔다. 그런데 실제 운영하면 다르다. 백테스트는 과거 완성된 캔들 기준이지만, 실전에서는 캔들이 마감되기 전에 신호가 왔다가 사라지기도 한다. 16건 중 실전에서 유효한 신호는 절반 이하였다. 백테스트 결과를 100% 믿지 않는 이유가 여기 있다. 방향만 보고 맹신하지 않는 게 맞다.
마치며 — 알람봇 개선 다음 단계
이번 업데이트로 바이비트 알트코인 알람봇의 핵심 버그를 수정하고, 3개 타임프레임 계단식 필터로 신호 품질을 높였습니다. 앞으로는 하이킨아시 윗꼬리 비율 추가 조정과 백테스트 기간 확장을 통해 조건을 더 정교하게 다듬을 예정입니다.
알람봇 개발에 관심 있으시다면 아래 글도 함께 읽어보세요:
💬 이 글이 도움이 됐다면 댓글로 알려주세요. 알람봇 조건이나 바이비트 자동매매에 궁금한 점이 있으면 언제든 질문 남겨주시면 답변드리겠습니다.

댓글
댓글 쓰기