【回测异常】基于双均线策略做多入场点异常,求优化方案

问题现象:

1、在历史回测中,买入点常常在k线收盘价上,导致入场点过高

尝试:

1、变换公式,历史回测买入点仍然在K线收盘价;

求问:

-是否有公式上的处理方式?

-还是实盘模拟汇总,系统会在K线形成前自动计算。

3分钟周期,纯碱品种



//------------------------------------------------------------------------
// 简称: MA2_MACDSystem
// 名称: 优化双条件策略(MACD死叉出场)
// 类别: 策略应用
// 类型: 内建应用
//------------------------------------------------------------------------
Params
    Numeric MAPeriodShort(2);      // 2日短期均线周期
    Numeric MAPeriodLong(60);      // 60日长期均线周期
    Numeric ContractSize(1);       // 买入数量
    Numeric StopLossPoints(5);     // 止损点数
    Numeric MACDShort(12);         // MACD短周期
    Numeric MACDLong(26);          // MACD长周期
    Numeric MACDSignal(9);         // MACD信号周期

Vars
    // 入场信号相关变量
    Series<Numeric> MA2;           // 2日收盘价移动平均
    Series<Numeric> MA60;          // 60日收盘价移动平均
    
    // MACD指标变量
    Series<Numeric> MACD_Diff;     // MACD差值
    Series<Numeric> MACD_Dea;      // MACD信号线
    Series<Numeric> MACD_Hist;     // MACD柱状图
    Bool MACD_DeathCross;           // MACD死叉标志
    
    // 止损相关变量
    Series<Numeric> EntryPrice;    // 入场价格
    Series<Numeric> StopLossLevel;  // 止损水平
    Numeric MinPoint;               // 最小变动价位
    
    // 持仓时间控制
    Series<Integer> EntryBarIndex; // 记录开仓Bar序号
    
    // MACD计算中间变量
    Series<Numeric> ShortEMA;      // 短期EMA
    Series<Numeric> LongEMA;       // 长期EMA
    Series<Numeric> SignalEMA;     // 信号线EMA

Events
    OnBar(ArrayRef<Integer> indexs)
    {
        // 获取最小变动价位
        MinPoint = MinMove * PriceScale;
        
        // ===== 通用指标计算 ===== //
        // 计算2日均线
        MA2 = (Close + Close[1]) / 2;
        
        // 计算60日均线
        MA60 = AverageFC(C, MAPeriodLong);
        
        // ===== 使用XAverage计算MACD ===== //
        // 计算短期EMA
        ShortEMA = XAverage(Close, MACDShort);
        
        // 计算长期EMA
        LongEMA = XAverage(Close, MACDLong);
        
        // 计算DIFF
        MACD_Diff = ShortEMA - LongEMA;
        
        // 计算信号线DEA
        MACD_Dea = XAverage(MACD_Diff, MACDSignal);
        
        // 计算MACD柱状图
        MACD_Hist = MACD_Diff - MACD_Dea;
        
        // 检测MACD死叉(当前DIF下穿DEA,且前一周期在DEA上方)
        MACD_DeathCross = (MACD_Diff <= MACD_Dea) && (MACD_Diff[1] > MACD_Dea[1]);
        
        // ===== 优先级1: 平仓条件处理 ===== //
        // 获取当前持仓状态
        Numeric CurrentPosition = MarketPosition;
        
        // 平仓处理逻辑
        if(CurrentPosition == 1) // 有多头持仓
        {
            // 止损平仓 - 无持仓时间限制
            if(Low <= StopLossLevel)
            {
                // 按止损价或开盘价中的较高者平仓
                Sell(0, Max(StopLossLevel, Open));
            }
            // MACD死叉平仓 - 需持有一根K线以上
            else if(CurrentBar - EntryBarIndex >= 1 && MACD_DeathCross)
            {
                Sell(0, Close); // 平掉全部多头仓位
            }
        }
        
        // ===== 优先级2: 开仓条件处理 ===== //
        // 开仓处理逻辑
        if(MarketPosition == 0) // 无持仓状态
        {
            // 双条件同时满足时以市价买入
            if(MA2 >= MA60) 
            {
                // 记录入场Bar序号
                EntryBarIndex = CurrentBar;
                
                // 记录入场价格
                EntryPrice = Close;
                
                // 计算止损水平(入场价以下5点)
                StopLossLevel = EntryPrice - StopLossPoints * MinPoint;
                
                // 买入1手
                Buy(ContractSize, Close);
            }
        }
    }


双均线参数优化
双均线策略做多做空合并及拆分问题
双均线策略问题
如何在日线级别做双均线买入卖出策略,在tick级别做跟踪止损
双均线策略
求助双均线止盈止损策略
登录异常
双均线策略涨跌停设置不开仓
长时间运行的策略异常
双均线系统问题

Sell(0, Close);

你写了close平,那图表就是标记close,至于实际上平仓哪里,看你编写的准确性

回测不就买在 收盘价 、开盘价 、最高价 、最低价吗?除非有回放功能可买实时价,回测只是一个大概,回测后还要模拟测一段时间才可以。