问题现象:
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,至于实际上平仓哪里,看你编写的准确性
回测不就买在 收盘价 、开盘价 、最高价 、最低价吗?除非有回放功能可买实时价,回测只是一个大概,回测后还要模拟测一段时间才可以。