Administrator
2025-12-25 5a53a21e97311d239f57266d58d2d7b6f55c42a6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.xcong.excoin.modules.okxNewPrice.indicator.strategy;
 
import com.xcong.excoin.modules.okxNewPrice.okxWs.param.TradeRequestParam;
import com.xcong.excoin.modules.okxNewPrice.utils.WsMapBuild;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
 
/**
 * 技术指标策略抽象基类,提供通用功能
 */
@Slf4j
@Getter
@Setter
public abstract class AbstractTechnicalIndicatorStrategy implements TechnicalIndicatorStrategy {
 
    protected static final int MAX_PRICE_HISTORY = 100; // 最大价格历史记录数量
    protected List<BigDecimal> priceHistory = new ArrayList<>();
    protected boolean initialized = false;
    protected String strategyName = ""; // 策略名称
 
    @Override
    public void initialize() {
        priceHistory.clear();
        initialized = true;
        log.info("策略初始化完成: {}", strategyName);
    }
 
    @Override
    public void updatePrices(List<BigDecimal> prices) {
        if (!initialized) {
            initialize();
        }
        
        if (prices == null || prices.isEmpty()) {
            return;
        }
        
        // 更新价格历史记录
        priceHistory.addAll(prices);
        
        // 限制价格历史记录数量
        if (priceHistory.size() > MAX_PRICE_HISTORY) {
            priceHistory = priceHistory.subList(priceHistory.size() - MAX_PRICE_HISTORY, priceHistory.size());
        }
        
        log.debug("价格历史记录更新完成,当前数量: {}", priceHistory.size());
    }
 
    @Override
    public boolean isValid() {
        return initialized;
    }
 
    /**
     * 创建交易请求参数
     * @param accountName 账户名称
     * @param markPx 当前标记价格
     * @param posSide 仓位方向
     * @param signal 交易信号
     * @return 交易请求参数
     */
    protected TradeRequestParam createTradeRequestParam(String accountName, String markPx, String posSide, TradeSignal signal) {
        TradeRequestParam param = new TradeRequestParam();
        param.setAccountName(accountName);
        param.setMarkPx(markPx);
        param.setPosSide(posSide);
        
        log.info("账户: {}, 价格: {}, 仓位方向: {}, 信号: {}", 
                accountName, markPx, posSide, signal.getName());
        
        return param;
    }
 
    /**
     * 日志记录交易信号
     * @param accountName 账户名称
     * @param markPx 当前标记价格
     * @param signal 交易信号
     */
    protected void logSignal(String accountName, String markPx, TradeSignal signal) {
        log.info("策略: {}, 账户: {}, 价格: {}, 信号: {}", 
                strategyName, accountName, markPx, signal.getName());
    }
}