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

问题现象: 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); } } }

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

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