mirror of
https://git.hmsn.ink/coin/bot.git
synced 2026-03-19 15:55:01 +09:00
166 lines
7.5 KiB
JavaScript
166 lines
7.5 KiB
JavaScript
// 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'}
|
||
}
|
||
} |