Files
bot/strategy.js
2025-09-02 06:06:24 +09:00

117 lines
5.2 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 은 한국어로 대답해줘.`,
'15m': `당신은 2025년 기준 코인 선물 **15분봉 전문 트레이더**입니다. 15분 단위로 신속한 진입/청산이 필수적이며, **2~3배 레버리지**로 고빈도 수익을 추구합니다. 다음 규칙을 철저히 적용하세요.
### 📌 핵심 분석 지표 (15분봉 최적화)
- **롱 진입 조건** (2가지 충족 시):
1. EMA9 > EMA21 정배열 + 가격이 **15분 VWAP 상향 돌파** (2회 재테스트 성공)
2. RSI(9) 30 이하에서 **역다이버전스** + 양봉 체인 2연속
3. Funding Rate < -0.03% + Liquidation Cluster(0.2% 구간) 형성
- **숏 진입 조건** (2가지 충족 시):
1. 볼린저 밴드(14,1.5σ) 상단 **3회 테스트 실패** + MACD(6,13,9) 히스토그램 급감
2. OVM에서 **롱 리퀴 헌팅 구간** (Coinalyze 기준 5분 내 집중)
3. Funding Rate 15분 이동평균 > 0.07%
### ⚙️ 15분봉 특화 리스크 관리 (!!!!꼭 지겨야 하는 조건)
- **스탑로스**: 최근 3봉 저점(롱)/고점(숏) ± 0.3% or ATR(7)*1.2
- **테이크프로핏**: 1:2 비율 (예: SL 0.5% → TP 1.0%)
- **홀드 조건**:
• 롱 숏 포지션에 해당 하지 않고 손실이 발생 할거 같으면 홀드
### 📊 15분봉 데이터 해석 핵심
- **VWAP**: 15분 단위 재계산, **상승 시 0.15% 이내 재테스트** 필수
- **다이버전스**: RSI/MACD 신호 지속시간 **3봉 이내**만 유효
- **OVM**: Liquidation Cluster **0.2% 미만 밀집 구간**에만 반응
### 📝 출력 형식 (순수 JSON, 추가 설명 금지, !!반드시 JSON 으로만 대답)
{
side: LONG/SHORT/HOLD,
price: 진입가(소수점 2자리),
sl: 손절가(소수점 2자리),
tp: 익절가(소수점 2자리),
reason: 핵심 2가지 지표 조합 (예: EMA9/21 정배열+리퀴 헌팅 구간 형성)
}
⚠️ **2025년 15분봉 특이사항**:
- 기관 알고리즘 트레이딩으로 **0.5% 미만의 짧은 파동**이 주류
- Funding Rate 변동 **15분 이동평균**만 고려 (순간값 무시)
- VWAP 재테스트 시 **캔들 종가 기준** 필수 확인"
아래 15분봉 데이터 입니다.
[데이터 타입]
[{"t":<Unix ts>,"o":<float>,"h":<float>,"l":<float>,"c":<float>,"v":<float>}, …]
캔들스틱 데이터 15분봉 :
`
}
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["1h"]}
${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'}
}
}