mirror of
https://git.hmsn.ink/coin/bot.git
synced 2026-03-20 00:02:16 +09:00
67 lines
3.1 KiB
JavaScript
67 lines
3.1 KiB
JavaScript
// strategy.js
|
|
import logger from './logger.js';
|
|
import {OpenAI} from "openai";
|
|
|
|
|
|
|
|
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;
|
|
// const time = '15분'
|
|
const time = '1시간'
|
|
console.log(Date.now())
|
|
const completion = await openai.chat.completions.create({
|
|
model: 'qwen/qwen3-235b-a22b-2507',
|
|
messages: [
|
|
{
|
|
role: 'user',
|
|
content: `
|
|
당신은 2025년 기준 코인 선물 스윙 트레이딩 전문가입니다.
|
|
1시간봉 기준으로 **3~5배 레버리지**로 안정적 수익을 추구하며, 다음 규칙을 엄수합니다.
|
|
|
|
### 📌 핵심 분석 지표 (2025년 검증)
|
|
**롱 진입 조건**
|
|
(3가지 중 2개 충족 시):
|
|
1. EMA20 > EMA50 상향 정배열 + 가격이 VWAP 지지
|
|
2. RSI(14) 40 이하에서 반등 + 양봉 수신
|
|
3. Funding Rate < -0.05% (과도한 숏 포지션)
|
|
|
|
**숏 진입 조건** (3가지 중 2개 충족 시):
|
|
1. 가격이 볼린저 밴드 상단 돌파 후 재수렴 + MACD 히스토그램 감소
|
|
2. Liquidation Heatmap에서 롱 리퀴 전방 클러스터 발생
|
|
3. Funding Rate > 0.1% (과도한 롱 포지션)
|
|
|
|
### ⚙️ 리스크 관리
|
|
**스탑로스**: 최근 6봉 저점(롱)/고점(숏) ± 0.5% or ATR(14)*1.5
|
|
**테이크프로핏**: 1:2 비율 (예: SL 1% → TP 2%)
|
|
**홀드 조건**: 지표 간 신호 충돌 또는 뉴스 이벤트 1시간 전
|
|
### 📊 데이터 해석 규칙
|
|
**VWAP**: 가격이 상승 시 지지/저항 역할
|
|
**다이버전스**: RSI/MACD와 가격 움직임 불일치 시 강력 신호
|
|
**OVM**: Liquidation Cluster 밀집 구간 확인 (Coinalyze 기준)
|
|
|
|
### 📝 출력 형식 (반드시 JSON 으로만 대답 )
|
|
{ side : LONG/SHORT/HOLD, price : 진입가(소수점 1자리), sl : "손절가(소수점 1자리), tp : 익절가(소수점 1자리),reason : 지표 조합 요약 (예: EMA 정배열+VWAP 지지+Funding Rate 저수준)}
|
|
|
|
⚠️ **2025년 특이사항**: 기관 매집 구간(EMA20)과 리퀴데이션 헌팅 구간 필수 확인, 과매매 신호(RSI 30/70)는 보조 필터로만 사용
|
|
|
|
아래 1시간봉 200개 데이터 입니다.
|
|
[데이터 타입]
|
|
[{"t":<Unix ts>,"o":<float>,"h":<float>,"l":<float>,"c":<float>,"v":<float>}, …]
|
|
|
|
${JSON.stringify(bars)}
|
|
`,
|
|
},
|
|
],
|
|
});
|
|
console.log(Date.now())
|
|
const msg = completion.choices[0].message.content
|
|
logger.info(msg);
|
|
const sig = JSON.parse(msg)
|
|
|
|
return sig;
|
|
} |