Files
Bithumb/scripts/install_crontab.sh
dsyoon 48dcdd0ae8 feat(rsi_dca): 7종 RSI 정액 매수 라이브 전략·모니터 고도화·수집 안정화
RSI DCA 전략 (신규)
- rsi_dca_engine/runner/control: 1분봉 RSI(14) 종목별 기준선 상향 돌파 시 정액 매수,
  일 상한, 신호 45분 유효, 킬스위치, 인터벌 변경 시 커서 재초기화, 체결가 거래소 보정
- scripts: 3_run_rsi_dca(.py/_cron.sh), 백테스트·인터벌 비교, go-live 스위치
- 설정: RSI_DCA_* (모드·종목·기준선·종목별 오버라이드·일 상한 등)

모니터 (vol_live_monitor / vol_monitor_chart)
- 분봉 탭(/api/candles), RSI(14) 패널·종목별 기준선, 3패널 시간축 정렬, KST 표기
- 자동매수 ON/OFF 패널(/api/rsi/status·toggle), 빌드 해시 기반 자동 새로고침, 지연 경고
- 요약표: 거래소 평균매입가 기준 보유원금·수익률, 총평가 손익, 수익률순 동적 정렬
- 잔고 스냅샷을 계좌 전체 조회 1회로 통합, 실시간 시세 반영

데이터·수집
- candle_store/loader: SQL 범위·LIMIT 조회로 대형 테이블 전량 스캔 제거
- 절전·재부팅 후 공백 자동 백필(gap_backfill, 00_backfill_gaps) 및 cron 연동
- 수집 cron 분할(매분 핵심 분봉·5분 전체), 프로젝트 한정 lock 패턴, exec 제거로 lock 정리 복구
- 모니터 종목(VOL_MONITOR_SYMBOLS)·수집 종목 7종 분리, 한글 코인명 추가

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-24 18:30:31 +09:00

145 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Bithumb cron 등록 — 기존 crontab에 BITHUMB 블록 병합/갱신/비활성화
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
MARKER_BEGIN="# BITHUMB vol_breakout cron (begin)"
MARKER_END="# BITHUMB vol_breakout cron (end)"
MARKER_BEGIN_ALT="# BITHUMB (begin)"
MARKER_END_ALT="# BITHUMB (end)"
EXAMPLE="${ROOT}/scripts/crontab.bithumb.example"
BITHUMB_CRON_RE='bithumb/scripts/(00_run_download_cron|3_run_vol_breakout_cron|3_run_rsi_dca_cron|3_run_vol_monitor_cron|3_ensure_vol_monitor_serve|3_run_watch_cron)\.sh'
usage() {
cat <<EOF
Usage: $(basename "$0") [--show|--apply|--disable|--enable|--remove]
--show 등록될 cron 블록만 출력 (기본)
--apply crontab에 BITHUMB 블록 병합 후 설치 (example 주석=비활성)
--disable crontab BITHUMB 블록 내 실행 줄을 # 주석 처리
--enable crontab BITHUMB 블록 내 cron 줄 주석 해제
--remove crontab에서 BITHUMB 블록 제거
환경 변수:
BITHUMB_PYTHON cron에서 사용할 python3 (예: ~/opt/anaconda3/envs/coin/bin/python3)
로그:
data/common/download_cron.log
data/spot/operations/vol_breakout_cron.log
data/spot/operations/rsi_dca_cron.log
data/spot/operations/vol_monitor_cron.log
data/spot/operations/vol_monitor_serve.log
EOF
}
render_block() {
{
echo "$MARKER_BEGIN"
sed "s|/Users/dsyoon/workspace/bithumb|${ROOT}|g" "$EXAMPLE" \
| grep -v '^[[:space:]]*$'
echo "$MARKER_END"
}
}
strip_block() {
awk -v re="${BITHUMB_CRON_RE}" '
$0 == "# BITHUMB vol_breakout cron (begin)" { skip=1; next }
$0 == "# BITHUMB vol_breakout cron (end)" { skip=0; next }
$0 == "# BITHUMB (begin)" { skip=1; next }
$0 == "# BITHUMB (end)" { skip=0; next }
skip { next }
$0 ~ re { next }
{ print }
'
}
toggle_block() {
local mode="$1"
awk -v mode="$mode" -v re="${BITHUMB_CRON_RE}" '
$0 == "# BITHUMB vol_breakout cron (begin)" || $0 == "# BITHUMB (begin)" {
in_b=1
print
next
}
$0 == "# BITHUMB vol_breakout cron (end)" || $0 == "# BITHUMB (end)" {
in_b=0
print
next
}
in_b && mode == "disable" && $0 !~ /^#/ && $0 ~ re {
print "# " $0
next
}
in_b && mode == "enable" && $0 ~ /^# / && $0 ~ re {
sub(/^# /, "")
print
next
}
{ print }
'
}
ensure_dirs() {
mkdir -p \
"${ROOT}/data/common" \
"${ROOT}/data/spot/operations" \
"${ROOT}/docs/spot/3_operations"
}
ACTION="${1:---show}"
case "$ACTION" in
--show)
ensure_dirs
render_block
;;
--apply)
ensure_dirs
chmod +x "${ROOT}/scripts/"*.sh 2>/dev/null || true
tmp="$(mktemp)"
crontab -l 2>/dev/null | strip_block > "$tmp" || true
render_block >> "$tmp"
crontab "$tmp"
rm -f "$tmp"
echo "crontab installed. 확인: crontab -l"
;;
--disable)
tmp="$(mktemp)"
if crontab -l 2>/dev/null | toggle_block disable > "$tmp"; then
crontab "$tmp"
echo "BITHUMB cron 비활성화(주석 처리) 완료."
else
echo "crontab empty or not found." >&2
exit 1
fi
rm -f "$tmp"
;;
--enable)
tmp="$(mktemp)"
if crontab -l 2>/dev/null | toggle_block enable > "$tmp"; then
crontab "$tmp"
echo "BITHUMB cron 활성화(주석 해제) 완료."
else
echo "crontab empty or not found." >&2
exit 1
fi
rm -f "$tmp"
;;
--remove)
tmp="$(mktemp)"
if crontab -l 2>/dev/null | strip_block > "$tmp"; then
crontab "$tmp"
echo "BITHUMB cron block removed."
else
echo "crontab empty or not found."
fi
rm -f "$tmp"
;;
-h|--help)
usage
;;
*)
usage >&2
exit 1
;;
esac