Files
bot/strategy.js
2025-09-04 21:00:40 +09:00

166 lines
7.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// strategy.js
import logger from './logger.js';
import {OpenAI} from "openai";
const prompts = {
"1h": `BTC/USDT 1시간 스윙 트레이딩 엔진입니다.
- 시간대: 1시간 캔들만.
- 일일 거래 빈도 목표: ≥ 3개의 유효 설정.
- 거래당 위험: 계좌 잔액의 1% 이하.
- 동시에 2개 이상의 포지션을 보유하지 마십시오.
- 최종 JSON 외부에 해설을 추가하지 마십시오.
[입력]
최근 1시간 캔들 50개(최근 캔들 순, 형식:
[{"t":<Unix ts>,"o":<float>,"h":<float>,"l":<float>,"c":<float>,"v":<float>}, …]
LONG:
- 9-EMA > 21-EMA (둘 다 상승).
- RSI14가 40~60 사이이고 이전 캔들 대비 상승하는 경우.
- Close ≥ VWAP.
- Close ≤ 스윙 고점 - ATR14×0.5 (작은 하락 구간).
SHORT:
- 9-EMA < 21-EMA (둘 다 하락).
- RSI14가 40~60 사이이고 이전 캔들 대비 하락하는 경우.
- Close ≤ VWAP.
- Close ≥ 스윙 저점 + ATR14×0.5 (작은 하락 구간).
HOLD:
- 매수 또는 매도 조건이 모두 충족되지 않는 경우.
JSON만 반환하며, 콜론 뒤에 공백은 포함하지 않습니다.
{"side":"LONG|SHORT|HOLD","price":<float>,"sl":<float>,"tp":<float>,"reason":"<최대 200단어>"}
진입 가격(한도) = 현재 캔들 종가
*손절(SL) *익절(TP) 는 제공된 캔들의 추세선으로 설정해주세요.(중요)
모든 가격을 가장 가까운 0.1 USDT로 반올림하세요.
reason 은 한국어로 대답해줘.`,
'5m': `당신은 2025년 기준 코인 선물 **5분봉 전문 트레이더**입니다. 5분 단위로 신속한 진입/청산이 필수적이며, **5~10배 레버리지**로 고빈도 수익을 추구합니다. 다음 규칙을 철저히 적용하세요.
📌 1. 환경 필터링: 시장 상황 확인
꼬리잡기는 횡보장 또는 과열된 트렌드장의 끝자락에서 가장 효과적입니다. 다음 조건을 충족해야 합니다:
방향성 안정 (예: 1시간봉이 횡보 또는 완만한 추세)
해당 알트코인의 거래량 증가 (특히 꼬리 발생 시점에 거래량 급증)
지지/저항 구간, 이전 고점/저점 근처
RSI(14)가 30 이하 또는 70 이상 (과매도/과매수 신호)
✅ 예: RSI가 75 이상에서 상승꼬리(윗꼬리) 발생 → 숏 기회
📌 2. 신호 캔들 조건: 꼬리의 신뢰성 판단
✅ 유효한 꼬리 조건:
꼬리 길이가 몸통의 2배 이상 (중요)
시가와 종가가 꼬리 반대편에 위치 (예: 긴 위꼬리 → 종가가 하단 근처)
거래량이 해당 캔들에서 급증
꼬리가 지지/저항 레벨을 테스트 후 반락
🔍 예시: 5분봉에서 위꼬리가 3% 길이로 튀고, 종가는 몸통 아래쪽에 위치 → 과매수 후 되돌림 가능성 높음
📌 3. 진입 전략 (Entry)
✅ 숏 포지션 진입 시나리오:
캔들이 윗꼬리로 마감 (상승 후 급락)
다음 5분봉이 하락 캔들로 시작
진입 지점: 이전 꼬리의 고점 아래 0.3~0.5%
스탑로스: 꼬리 고점 + 0.3% (초과 진입 방지)
테이크프로핏: 이전 지지선 또는 1:2 비율 (예: 스탑로스 0.8% → 목표 1.6%)
🎯 예: 꼬리 고점 1000, 종가 990 → 진입 997, 스탑 1003, 목표 985
✅ 롱 포지션 진입 시나리오:
캔들이 아래꼬리로 마감 (급락 후 반등)
다음 5분봉이 상승 캔들로 시작
진입 지점: 꼬리 저점 위 0.3~0.5%
스탑로스: 꼬리 저점 - 0.3%
테이크프로핏: 이전 저항 또는 1:2 비율
🎯 예: 꼬리 저점 900, 종가 910 → 진입 903, 스탑 897, 목표 920
📌 4. 필터링 추가: 더 높은 승률을 위한 조건
다른 지표 확인:
볼린저 밴드: 꼬리가 밴드 상단/하단을 돌파했다가 돌아올 때
MACD: 꼬리 발생 시 다이버전스 발생 (가격 신고점, MACD 비신고점 → 반전 신호)
📌 5. 리스크 관리 (필수!)
포지션 사이즈: 1~2% 이내 (과도한 레버리지 금지)
레버리지: 5~10배 권장 (20배 이상은 스탑로스 헌팅에 취약)
하루 최대 진입 횟수: 3~5회 (과매매 방지)
손절 원칙: 절대 스탑로스 이동 금지 (초기 설정 고수)
📌 6. 실전 예시 (가상 시나리오)
코인: SOL/USDT
시간: UTC 14:00
상황: 미 연준 발표 후 급등 → 5분봉에서 윗꼬리 발생 (고점 +4%, 종가 +1%)
RSI: 78 → 과매수
오더북: 155.00 근처에 대량 숏 지정가 몰려 있음
전략:
진입: 154.80 (윗꼬리 고점 155.20 아래 0.3%)
스탑로스: 155.60 (+0.3%)
목표: 152.00 (지지선), 1:2.5 비율
결과: 15분 내 목표 도달 → 익절
✅ 요약: 꼬리잡기 최적 시나리오 체크리스트
🕐 시간
5분봉 기준
📈 꼬리
몸통 대비 2배 이상, 거래량 급증
🧭 위치
지지/저항, 과매수/과매도 구간
📊 필터
RSI, 볼린저밴드, MACD 다이버전스
📥 진입
꼬리 반대편 0.3~0.5%
🛑 스탑로스
꼬리 끝 +0.3%
🎯 목표
1:2 이상, 이전 지지/저항
⚖️ 리스크
1~2% 포지션, 5~10배 레버리지
💡 팁: 꼬리잡기의 함정 피하기
트렌드 강할 땐 회피: 강한 상승장에서 윗꼬리도 계속 상승할 수 있음
고점/저점에서만 유효: 중간 구간 꼬리는 노이즈일 확률 높음
매수 꼬리 vs 매도 꼬리: 하락장에서 아래꼬리는 트랩(bear trap)일 수 있음 → 추가 확인 필수
**JSON만 반환하며, 콜론 뒤에 공백은 포함하지 않습니다.**
{"side":"LONG|SHORT|HOLD","price":<float>,"sl":<float>,"tp":<float>,"reason":"<최대 200단어>"}
아래 5분봉 데이터 입니다.
[데이터 타입]
[{"t":<Unix ts>,"o":<float>,"h":<float>,"l":<float>,"c":<float>,"v":<float>}, …]
`
}
const openai = new OpenAI({
baseURL: 'https://openrouter.ai/api/v1',
apiKey: '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',
});
export async function aiSignal(bars) {
if (bars.length < 20) return null;
console.log(Date.now())
const content = `
${prompts["5m"]}
${JSON.stringify(bars)}
`;
const completion = await openai.chat.completions.create({
model: 'qwen/qwen3-coder',
messages: [
{
role: 'user',
content: content,
},
],
});
try {
console.log(Date.now())
const msg = completion.choices[0].message.content
logger.debug(msg);
const sig = JSON.parse(msg)
return sig;
} catch(e) {
return {side : 'HOLD'}
}
}