mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-07-09 22:10:57 +08:00
添加震荡交易策略 + 买卖压力分析
**核心功能**: - 新增买卖压力数据解析(TakerBuyVolume, BuySellRatio) - 重写系统提示词为震荡交易策略 - 添加连续放量检测功能(2-3根K线) **技术细节**: - market/data.go: 解析币安 K线 item[9] 为主动买入量 - decision/engine.go: 震荡区间识别 + 区间边界入场逻辑 - IntradayData: 新增 Volumes 和 BuySellRatios 数组
This commit is contained in:
@@ -258,13 +258,18 @@ func buildSystemPrompt(accountEquity float64, btcEthLeverage, altcoinLeverage in
|
||||
accountEquity*0.8, accountEquity*1.5, altcoinLeverage, accountEquity*5, accountEquity*10, btcEthLeverage))
|
||||
sb.WriteString("4. **保证金**: 总使用率 ≤ 90%\n\n")
|
||||
|
||||
// === 做空激励 ===
|
||||
sb.WriteString("# 📉 做多做空平衡\n\n")
|
||||
sb.WriteString("**重要**: 下跌趋势做空的利润 = 上涨趋势做多的利润\n\n")
|
||||
sb.WriteString("- 上涨趋势 → 做多\n")
|
||||
sb.WriteString("- 下跌趋势 → 做空\n")
|
||||
sb.WriteString("- 震荡市场 → 观望\n\n")
|
||||
sb.WriteString("**不要有做多偏见!做空是你的核心工具之一**\n\n")
|
||||
// === 震荡交易策略 ===
|
||||
sb.WriteString("# 📦 震荡交易策略(核心)\n\n")
|
||||
sb.WriteString("**策略定位**: 专门做 BTC 震荡行情,快进快出,高胜率低盈亏比\n\n")
|
||||
sb.WriteString("**震荡区间识别**:\n")
|
||||
sb.WriteString("- 价格在15分钟/1小时 EMA20上下波动(±2-4%)\n")
|
||||
sb.WriteString("- MACD 在零轴附近(-200到+200之间)\n")
|
||||
sb.WriteString("- 多个时间框架方向不一致(如15m上涨但1h下跌)\n")
|
||||
sb.WriteString("- RSI 在30-70区间反复震荡\n\n")
|
||||
sb.WriteString("**交易逻辑**:\n")
|
||||
sb.WriteString("- **区间下沿**(RSI<35 或接近支撑) → 做多\n")
|
||||
sb.WriteString("- **区间上沿**(RSI>65 或接近压力) → 做空\n")
|
||||
sb.WriteString("- **趋势行情**(多时间框架共振,放量突破) → 立即止损\n\n")
|
||||
|
||||
// === 交易频率认知 ===
|
||||
sb.WriteString("# ⏱️ 交易频率认知\n\n")
|
||||
@@ -279,36 +284,45 @@ func buildSystemPrompt(accountEquity float64, btcEthLeverage, altcoinLeverage in
|
||||
// === 开仓信号强度 ===
|
||||
sb.WriteString("# 🎯 开仓标准(严格)\n\n")
|
||||
sb.WriteString("只在**强信号**时开仓,不确定就观望。\n\n")
|
||||
sb.WriteString("**你拥有的完整数据(多时间框架分析)**:\n\n")
|
||||
sb.WriteString("**你拥有的完整数据(专为震荡交易优化)**:\n\n")
|
||||
sb.WriteString("**📊 四个时间框架序列**(每个包含最近10个数据点):\n")
|
||||
sb.WriteString("1. **3分钟序列**:用于获取实时价格(当前价格 = 最后一根K线的收盘价)\n")
|
||||
sb.WriteString("1. **3分钟序列**:实时价格 + 放量分析(当前价格 = 最后一根K线的收盘价)\n")
|
||||
sb.WriteString(" - Mid prices, EMA20, MACD, RSI7, RSI14\n")
|
||||
sb.WriteString("2. **15分钟序列**:短期趋势过滤(覆盖最近2.5小时)\n")
|
||||
sb.WriteString(" - **Volumes**: 成交量序列(用于检测放量)\n")
|
||||
sb.WriteString(" - **BuySellRatios**: 买卖压力比(>0.6多方强,<0.4空方强)\n")
|
||||
sb.WriteString("2. **15分钟序列**:短期震荡区间识别(覆盖最近2.5小时)\n")
|
||||
sb.WriteString(" - Mid prices, EMA20, MACD, RSI7, RSI14\n")
|
||||
sb.WriteString("3. **1小时序列**:中期趋势确认(覆盖最近10小时)\n")
|
||||
sb.WriteString("3. **1小时序列**:中期支撑压力确认(覆盖最近10小时)\n")
|
||||
sb.WriteString(" - Mid prices, EMA20, MACD, RSI7, RSI14\n")
|
||||
sb.WriteString("4. **4小时序列**:长期趋势方向(覆盖最近40小时)\n")
|
||||
sb.WriteString("4. **4小时序列**:大趋势预警(覆盖最近40小时)\n")
|
||||
sb.WriteString(" - EMA20 vs EMA50, ATR, Volume, MACD, RSI14\n\n")
|
||||
sb.WriteString("**💰 资金数据**:\n")
|
||||
sb.WriteString("- 持仓量(OI)变化、资金费率、成交量对比\n\n")
|
||||
sb.WriteString("**🎯 多时间框架分析建议**:\n")
|
||||
sb.WriteString("- **趋势共振**:当15m/1h/4h三个时间框架方向一致时 → 高信心度信号\n")
|
||||
sb.WriteString("- **趋势过滤**:用1h和4h确认主趋势,避免在震荡中交易\n")
|
||||
sb.WriteString("- **入场时机**:用15m寻找入场点,确保不在短期逆势位置开仓\n")
|
||||
sb.WriteString("- **背离识别**:价格创新高但MACD未创新高(多时间框架对比)\n")
|
||||
sb.WriteString("- **假突破过滤**:15m突破但1h/4h未确认 → 可能是假突破\n\n")
|
||||
sb.WriteString("**分析方法**(完全由你自主决定):\n")
|
||||
sb.WriteString("- 自由运用多时间框架序列,做趋势分析、形态识别、支撑阻力、背离判断\n")
|
||||
sb.WriteString("- 多维度交叉验证(多时间框架 + 量价 + OI + 资金费率)\n")
|
||||
sb.WriteString("- 用你认为最有效的方法发现高确定性机会\n")
|
||||
sb.WriteString("**🎯 震荡交易分析方法**:\n\n")
|
||||
sb.WriteString("**1. 震荡区间识别**:\n")
|
||||
sb.WriteString("- 价格在15m/1h EMA20 上下±2-4%波动\n")
|
||||
sb.WriteString("- RSI 在30-70区间反复,未出现持续超买/超卖\n")
|
||||
sb.WriteString("- MACD 在零轴附近震荡,未出现明确金叉/死叉\n")
|
||||
sb.WriteString("- 1h和4h时间框架方向不一致(矛盾 = 震荡)\n\n")
|
||||
sb.WriteString("**2. 买卖压力分析**(3分钟放量检测):\n")
|
||||
sb.WriteString("- **连续放量** = 最近2-3根3分钟K线成交量 > 平均成交量1.5倍\n")
|
||||
sb.WriteString("- **买方力量**:BuySellRatio > 0.6(主动买入占比 > 60%)\n")
|
||||
sb.WriteString("- **卖方力量**:BuySellRatio < 0.4(主动卖出占比 > 60%)\n")
|
||||
sb.WriteString("- **放量+买压** → 可能向上突破,做多或止损空单\n")
|
||||
sb.WriteString("- **放量+卖压** → 可能向下突破,做空或止损多单\n\n")
|
||||
sb.WriteString("**3. 入场信号**(高胜率位置):\n")
|
||||
sb.WriteString("- **区间下沿做多**:RSI < 35 + 买卖压力比 > 0.5 + 价格接近15m EMA20下方\n")
|
||||
sb.WriteString("- **区间上沿做空**:RSI > 65 + 买卖压力比 < 0.5 + 价格接近15m EMA20上方\n")
|
||||
sb.WriteString("- **综合信心度 ≥ 75 才开仓**\n\n")
|
||||
sb.WriteString("**4. 止损信号**(趋势突破,立即离场):\n")
|
||||
sb.WriteString("- 多时间框架共振(15m/1h/4h方向一致)\n")
|
||||
sb.WriteString("- 连续2根以上3分钟K线放量突破区间\n")
|
||||
sb.WriteString("- MACD 突破零轴并加速\n\n")
|
||||
sb.WriteString("**避免低质量信号**:\n")
|
||||
sb.WriteString("- 单一时间框架分析(必须多时间框架共振)\n")
|
||||
sb.WriteString("- 时间框架矛盾(15m上涨但1h/4h下跌)\n")
|
||||
sb.WriteString("- 单一维度(只看一个指标)\n")
|
||||
sb.WriteString("- 相互矛盾(涨但量萎缩)\n")
|
||||
sb.WriteString("- 横盘震荡(多个时间框架都无明确趋势)\n")
|
||||
sb.WriteString("- 刚平仓不久(<15分钟)\n\n")
|
||||
sb.WriteString("- 区间中部交易(等待区间边界)\n")
|
||||
sb.WriteString("- 刚平仓不久(<10分钟)\n")
|
||||
sb.WriteString("- 无买卖压力确认的入场\n\n")
|
||||
|
||||
// === 夏普比率自我进化 ===
|
||||
sb.WriteString("# 🧬 夏普比率自我进化\n\n")
|
||||
|
||||
@@ -33,13 +33,15 @@ type OIData struct {
|
||||
Average float64
|
||||
}
|
||||
|
||||
// IntradayData 日内数据(3分钟间隔) - 主要用于获取实时价格
|
||||
// IntradayData 日内数据(3分钟间隔) - 主要用于获取实时价格和放量分析
|
||||
type IntradayData struct {
|
||||
MidPrices []float64
|
||||
EMA20Values []float64
|
||||
MACDValues []float64
|
||||
RSI7Values []float64
|
||||
RSI14Values []float64
|
||||
MidPrices []float64
|
||||
EMA20Values []float64
|
||||
MACDValues []float64
|
||||
RSI7Values []float64
|
||||
RSI14Values []float64
|
||||
Volumes []float64 // 成交量序列(用于放量检测)
|
||||
BuySellRatios []float64 // 买卖压力比序列(>0.6多方强,<0.4空方强)
|
||||
}
|
||||
|
||||
// MidTermData15m 15分钟时间框架数据 - 短期趋势过滤
|
||||
@@ -74,13 +76,15 @@ type LongerTermData struct {
|
||||
|
||||
// Kline K线数据
|
||||
type Kline struct {
|
||||
OpenTime int64
|
||||
Open float64
|
||||
High float64
|
||||
Low float64
|
||||
Close float64
|
||||
Volume float64
|
||||
CloseTime int64
|
||||
OpenTime int64
|
||||
Open float64
|
||||
High float64
|
||||
Low float64
|
||||
Close float64
|
||||
Volume float64
|
||||
CloseTime int64
|
||||
TakerBuyVolume float64 // 主动买入量(多方力量)
|
||||
BuySellRatio float64 // 买卖压力比 = TakerBuyVolume / Volume
|
||||
}
|
||||
|
||||
// Get 获取指定代币的市场数据
|
||||
@@ -206,15 +210,24 @@ func getKlines(symbol, interval string, limit int) ([]Kline, error) {
|
||||
close, _ := parseFloat(item[4])
|
||||
volume, _ := parseFloat(item[5])
|
||||
closeTime := int64(item[6].(float64))
|
||||
takerBuyVolume, _ := parseFloat(item[9]) // 主动买入量
|
||||
|
||||
// 计算买卖压力比
|
||||
buySellRatio := 0.0
|
||||
if volume > 0 {
|
||||
buySellRatio = takerBuyVolume / volume
|
||||
}
|
||||
|
||||
klines[i] = Kline{
|
||||
OpenTime: openTime,
|
||||
Open: open,
|
||||
High: high,
|
||||
Low: low,
|
||||
Close: close,
|
||||
Volume: volume,
|
||||
CloseTime: closeTime,
|
||||
OpenTime: openTime,
|
||||
Open: open,
|
||||
High: high,
|
||||
Low: low,
|
||||
Close: close,
|
||||
Volume: volume,
|
||||
CloseTime: closeTime,
|
||||
TakerBuyVolume: takerBuyVolume,
|
||||
BuySellRatio: buySellRatio,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -338,11 +351,13 @@ func calculateATR(klines []Kline, period int) float64 {
|
||||
// calculateIntradaySeries 计算日内系列数据
|
||||
func calculateIntradaySeries(klines []Kline) *IntradayData {
|
||||
data := &IntradayData{
|
||||
MidPrices: make([]float64, 0, 10),
|
||||
EMA20Values: make([]float64, 0, 10),
|
||||
MACDValues: make([]float64, 0, 10),
|
||||
RSI7Values: make([]float64, 0, 10),
|
||||
RSI14Values: make([]float64, 0, 10),
|
||||
MidPrices: make([]float64, 0, 10),
|
||||
EMA20Values: make([]float64, 0, 10),
|
||||
MACDValues: make([]float64, 0, 10),
|
||||
RSI7Values: make([]float64, 0, 10),
|
||||
RSI14Values: make([]float64, 0, 10),
|
||||
Volumes: make([]float64, 0, 10),
|
||||
BuySellRatios: make([]float64, 0, 10),
|
||||
}
|
||||
|
||||
// 获取最近10个数据点
|
||||
@@ -353,6 +368,8 @@ func calculateIntradaySeries(klines []Kline) *IntradayData {
|
||||
|
||||
for i := start; i < len(klines); i++ {
|
||||
data.MidPrices = append(data.MidPrices, klines[i].Close)
|
||||
data.Volumes = append(data.Volumes, klines[i].Volume) // 成交量
|
||||
data.BuySellRatios = append(data.BuySellRatios, klines[i].BuySellRatio) // 买卖压力比
|
||||
|
||||
// 计算每个点的EMA20
|
||||
if i >= 19 {
|
||||
|
||||
Reference in New Issue
Block a user