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>
65 lines
2.9 KiB
Bash
Executable File
65 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# RSI DCA 정액 매수 live 전환/복귀 — 사용자가 직접 실행하는 스위치.
|
|
# bash scripts/3_go_live_rsi_dca.sh # live 전환: .env RSI_DCA_MODE=live + cron 줄 활성화 + crontab 적용
|
|
# bash scripts/3_go_live_rsi_dca.sh --paper # paper 복귀 (cron 유지, 주문 없음)
|
|
# bash scripts/3_go_live_rsi_dca.sh --dry-run # 변경 없이 수행 내용만 출력
|
|
set -euo pipefail
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
ENV="${ROOT}/.env"
|
|
EXAMPLE="${ROOT}/scripts/crontab.bithumb.example"
|
|
RSI_LINE_RE='3_run_rsi_dca_cron\.sh'
|
|
|
|
MODE="live"
|
|
DRY=0
|
|
for a in "$@"; do
|
|
case "$a" in
|
|
--paper) MODE="paper" ;;
|
|
--live) MODE="live" ;;
|
|
--dry-run) DRY=1 ;;
|
|
-h|--help) sed -n 2,5p "$0"; exit 0 ;;
|
|
*) echo "unknown arg: $a" >&2; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
[ -f "$ENV" ] || { echo ".env 없음: $ENV" >&2; exit 1; }
|
|
cur="$(grep -E '^RSI_DCA_MODE=' "$ENV" | tail -1 | cut -d= -f2 | tr -d '[:space:]' || true)"
|
|
echo "현재 RSI_DCA_MODE=${cur:-<미설정>} → 목표 ${MODE}"
|
|
echo "대상: $(grep -E '^RSI_DCA_SYMBOLS=' "$ENV" | cut -d= -f2) | 규칙: $(grep -E '^RSI_DCA_LEVELS=' "$ENV" | cut -d= -f2) | 일 상한: $(grep -E '^RSI_DCA_DAILY_MAX_KRW=' "$ENV" | cut -d= -f2)원"
|
|
if [ "$MODE" = "live" ] && [ -f "${ROOT}/data/spot/operations/rsi.kill" ]; then
|
|
echo "주의: 킬스위치 파일(data/spot/operations/rsi.kill)이 있어 매수가 차단됩니다. 해제: rm data/spot/operations/rsi.kill"
|
|
fi
|
|
|
|
if [ "$DRY" = "1" ]; then
|
|
echo "[dry-run] 1) .env RSI_DCA_MODE=${MODE} 로 변경"
|
|
echo "[dry-run] 2) ${EXAMPLE} 의 RSI cron 줄 주석 해제"
|
|
echo "[dry-run] 3) bash scripts/install_crontab.sh --apply"
|
|
exit 0
|
|
fi
|
|
|
|
# 1) .env 모드
|
|
if grep -qE '^RSI_DCA_MODE=' "$ENV"; then
|
|
sed -i '' -E "s/^RSI_DCA_MODE=.*/RSI_DCA_MODE=${MODE}/" "$ENV"
|
|
else
|
|
printf '\nRSI_DCA_MODE=%s\n' "$MODE" >> "$ENV"
|
|
fi
|
|
echo "1) .env: $(grep -E '^RSI_DCA_MODE=' "$ENV")"
|
|
|
|
# 2) cron 예시에서 RSI 줄 활성화 (이미 활성화면 그대로)
|
|
if grep -qE "^# \* \* \* \* \* .*${RSI_LINE_RE}" "$EXAMPLE"; then
|
|
sed -i '' -E "s|^# (\* \* \* \* \* .*${RSI_LINE_RE}.*)$|\1|" "$EXAMPLE"
|
|
fi
|
|
echo "2) cron 예시: $(grep -E "${RSI_LINE_RE}" "$EXAMPLE" | grep -vE '^#' | head -1 | cut -c1-70)…"
|
|
|
|
# 3) crontab 적용 (BITHUMB 블록 갱신 — 캔들 수집·모니터·RSI tick)
|
|
bash "${ROOT}/scripts/install_crontab.sh" --apply
|
|
echo "3) crontab RSI 줄:"; crontab -l | grep -E "${RSI_LINE_RE}" || echo " (없음)"
|
|
|
|
echo
|
|
if [ "$MODE" = "live" ]; then
|
|
echo "완료: 다음 1분 tick부터 실거래 매수. 첫 tick은 미초기화 종목 커서 설정만 하고, 이후 봉부터 매수합니다."
|
|
echo "긴급 차단: touch ${ROOT}/data/spot/operations/rsi.kill | paper 복귀: bash scripts/3_go_live_rsi_dca.sh --paper"
|
|
echo "확인: python scripts/3_run_rsi_dca.py --status / tail -f data/spot/operations/rsi_dca_cron.log"
|
|
else
|
|
echo "완료: paper 모드. cron은 유지되며 주문은 나가지 않습니다."
|
|
fi
|