从你贴的代码来看,因为变量具体是啥不知道,看不出太多问题。信号价用Close肯定不好,实盘时信号价格会变化。想要更快地找出问题,可以贴出完整代码,把策略核心移除,能复现问题即可。
回复://---------多周期策略 部分内容与参数有改动 现在主要问题 回测多个品种(空头)持仓超过90分钟亏损超过50个点仍未平仓止损- 连续5道止损先后命中无一平仓 直到下一个金叉才平仓 烦请老师点评错漏之处与需要改进的地方 万分感激------- ---------// 基础周期: 1分钟// 大周期: 日线、120分钟、30分钟、5分钟//----------------- ---------Params Numeric Lots(1); // 交易手数 Numeric Length1(5); // 短均线周期(MA5) Numeric Length2(10); // 中均线周期(MA10) Numeric Length3(20); // 长均线周期(MA20) Numeric Length4(80); // 长均线周期(MA80) Numeric Lengthmax(100); // 回溯长周期(100) Numeric BollingerPeriod0(4); // 布林带周期 Numeric BollingerPeriod(20); // 布林带周期 Numeric BollingerStdDev(2); // 布林带标准差倍数 Numeric BollingerStdDevS(2); Numeric BollingerPeriodS(100); // 布林带周期 Numeric MACDFast(12); // MACD快线周期 Numeric MACDSlow(26); // MACD慢线周期 Numeric MACDSignal(9); // MACD信号线周期 Numeric MACDFastS(48); // MACD快线周期 Numeric MACDSlowS(104); // MACD慢线周期 Numeric MACDSignalS(36); // MACD信号线周期 String BigTimeFrame1("5m"); // 大周期1: 5分钟 String BigTimeFrame2("30m"); // 大周期2: 30分钟 String BigTimeFrame3("120m"); // 大周期3: 120分钟 String BigTimeFrame4("1d"); // 大周期4: 日线 Vars Global Integer bigLayer1; Global Integer bigLayer2; Global Integer bigLayer3; Global Integer bigLayer4; Numeric dailyClose; Numeric dailyOpen; Numeric dailyHigh; Numeric dailyLow; Numeric Close_30; Numeric Open_30; Numeric High_30; Numeric Low_30; Series<Numeric> MiddleBand; Series<Numeric> UpperBand; Series<Numeric> LowerBand; Series<Numeric> MiddleBandS; Series<Numeric> UpperBandS; Series<Numeric> LowerBandS; // ----- 以下变量在Range块中为每个大周期独立拥有 ----- // 均线 Series<Numeric> ma5(0, 20); Series<Numeric> ma10(0, 20); Series<Numeric> ma20(0, 20); Series<Numeric> ma80(0, 20); // 布林带 Series<Numeric> bollUpper(0, 20); Series<Numeric> bollMid(0, 20); Series<Numeric> bollLower(0, 20); Series<Numeric>BollWidth; Series<Numeric>BollWidthbS; // MACD Series<Numeric> macdDiff(0, 12); Series<Numeric> macdDea(0, 26); Series<Numeric> macdHist(0, 9); Series<Numeric> macdDiffS(0, 48); Series<Numeric> macdDeaS(0, 104); Series<Numeric> macdHistS(0, 36); Numeric MinPoint; // 一个最小变动单位,也就是一跳 Series<Numeric> MaxProfitl; Series<Numeric> MaxProfits; Series<Numeric> my_lentry_price; Series<Numeric> my_sentry_price; Series<Numeric> my_lexist_price; Series<Numeric> my_sexist_price; // 成交量 Series<Numeric> volData(0, 1); // 数据有效性标志 Series<Bool> barsOk(False, 2); // ----- 基础周期(1分钟)专用指标变量 ----- Series<Numeric> ma5_1m(0, 20); Series<Numeric> ma10_1m(0, 20); Series<Numeric> ma20_1m(0, 20); Series<Numeric> ma80_1m(0, 20); Series<Numeric> UpperBand_1m(0, 20); Series<Numeric> MiddleBand_1m(0, 20); Series<Numeric> LowerBand_1m(0, 20); Series<Bool> barsOk_1m(False, 2); Series<Numeric> UpperBand_5m(0,501); Series<Numeric> LowerBand_5m(0,501); Series<Numeric> UpperBand_5m_pre(0,501); Series<Numeric> LowerBand_5m_pre(0,501); Series<Numeric> MaxProfit_Ticks; Series<Numeric> my_lexitprice; Series<Numeric> my_sexitprice; Events OnInit() { // 订阅四个大周期数据源 bigLayer1 = SubscribeBar(Data0.Symbol, BigTimeFrame1, Data0.BeginDateTime, 0, Data0.DataFlag); bigLayer2 = SubscribeBar(Data0.Symbol, BigTimeFrame2, Data0.BeginDateTime, 0, Data0.DataFlag); bigLayer3 = SubscribeBar(Data0.Symbol, BigTimeFrame3, Data0.BeginDateTime, 0, Data0.DataFlag); bigLayer4 = SubscribeBar(Data0.Symbol, BigTimeFrame4, Data0.BeginDateTime, 0, Data0.DataFlag); // 设置大周期数据源的基础周期为1分钟 Data[bigLayer1].SetBasePeriod(Data0.Frequency); Data[bigLayer2].SetBasePeriod(Data0.Frequency); Data[bigLayer3].SetBasePeriod(Data0.Frequency); Data[bigLayer4].SetBasePeriod(Data0.Frequency); //设置最大连续建仓次数 SetConsecEntries(2); } OnBar(ArrayRef<Integer> indexs) { // ========== 1. 为2个小周期计算指标 ========== Range[0:bigLayer1] // 1分钟、5分钟分别执行 { Commentary("Close:" + Text(Close)); // 均线 ma5 = AverageFC(Close, Length1); ma10 = AverageFC(Close, Length2); ma20 = AverageFC(Close, Length3); ma80 = AverageFC(Close, Length4); PlotNumeric("MA5", ma5); PlotNumeric("MA10", ma10); PlotNumeric("MA20", ma20); PlotNumeric("MA80", ma80); Commentary("MA5:" + Text(ma5)); Commentary("MA10:" + Text(ma10)); Commentary("MA20:" + Text(ma20)); Commentary("MA80:" + Text(ma80)); // 本级布林带 (以ma20为中轨) MiddleBand = Average(Close, BollingerPeriod); UpperBand = MiddleBand + BollingerStdDev * StandardDev(Close, BollingerPeriod,2); LowerBand = MiddleBand - BollingerStdDev * StandardDev(Close, BollingerPeriod,2); PlotNumeric("MiddleBand", MiddleBand); PlotNumeric("UpperBand", UpperBand); PlotNumeric("LowerBand", LowerBand); Commentary("MiddleBand:" + Text(MiddleBand)); Commentary("UpperBand:" + Text(UpperBand)); Commentary("LowerBand:" + Text(LowerBand)); // 计算大周期布林轨(简单移动平均) MiddleBandS = Average(Close, BollingerPeriodS); // 计算标准差 //BollingerStdDevS = StandardDev(Close, BollingerPeriodS); // 计算布林上下轨 UpperBandS = MiddleBandS + BollingerStdDev * StandardDev(Close, BollingerPeriodS); LowerBandS = MiddleBandS - BollingerStdDev * StandardDev(Close, BollingerPeriodS); PlotNumeric("MiddleBandS", MiddleBandS); PlotNumeric("UpperBandS", UpperBandS); PlotNumeric("LowerBandS", LowerBandS); Commentary("MiddleBandS:" + Text(MiddleBandS)); Commentary("UpperBandS:" + Text(UpperBandS)); Commentary("LowerBandS:" + Text(LowerBandS)); // 本级MACD macdDiff = XAverage(Close, MACDFast) - XAverage(Close, MACDSlow); macdDea = XAverage(macdDiff, MACDSignal); macdHist = 2 * (macdDiff - macdDea); //PlotNumeric("macdDiff", macdDiff); //PlotNumeric("macdDea", macdDea); //PlotNumeric("macdHist", macdHist); Commentary("macdDiff:" + Text(macdDiff)); Commentary("macdDea:" + Text(macdDea)); Commentary("macdHist:" + Text(macdHist)); //大周期MACD macdDiffS = XAverage(Close, MACDFastS) - XAverage(Close, MACDSlowS); macdDeaS = XAverage(macdDiffS, MACDSignalS); macdHistS = 2 * (macdDiffS - macdDeaS); Commentary("macdDiffS:" + Text(macdDiffS)); Commentary("macdDeaS:" + Text(macdDeaS)); Commentary("macdHistS:" + Text(macdHistS)); } // ========== 1. 为四个大周期计算指标 ========== Range[bigLayer2:bigLayer4] // 对日线、120分钟、30分钟分钟分别执行 { Commentary("Open:" + Text(Open)); Commentary("Close:" + Text(Close)); Commentary("High:" + Text(High)); Commentary("Low:" + Text(Low)); // 均线 ma5 = AverageFC(Close, Length1); ma20 = AverageFC(Close, Length3); PlotNumeric("MA5", ma5); PlotNumeric("MA20", ma20); Commentary("MA5:" + Text(ma5)); Commentary("MA20:" + Text(ma20)); // 当前布林带 (以ma20为中轨) MiddleBand = AverageFC(Close, Length3); UpperBand = MiddleBand + BollingerStdDev * StandardDev(Close, BollingerPeriod); LowerBand = MiddleBand - BollingerStdDev * StandardDev(Close, BollingerPeriod); PlotNumeric("MiddleBand", MiddleBand); PlotNumeric("UpperBand", UpperBand); PlotNumeric("LowerBand", LowerBand); Commentary("MiddleBand:" + Text(MiddleBand)); Commentary("UpperBand:" + Text(UpperBand)); Commentary("LowerBand:" + Text(LowerBand)); } // ========== 2. 计算基础周期(1分钟)的指标 ========== ma5_1m = AverageFC(Close, Length1); ma10_1m = AverageFC(Close, Length2); ma20_1m = AverageFC(Close, Length3); ma120_1m = AverageFC(Close, Length4); MiddleBand_1m = AverageFC(Close, BollingerPeriod); UpperBand_1m = MiddleBand_1m + BollingerStdDev * StandardDev(Close, BollingerPeriod,2); LowerBand_1m = MiddleBand_1m - BollingerStdDev * StandardDev(Close, BollingerPeriod,2); Commentary("MiddleBand_1m:" + Text(MiddleBand_1m)); Commentary("MiddleBand_1m:" + Text(MiddleBand_1m)); macdDiff_1m = XAverage(Close, MACDFast) - XAverage(Close, MACDSlow); macdDea_1m = XAverage(macdDiff_1m, MACDSignal); macdHist_1m = 2 * (macdDiff_1m - macdDea_1m); Bool goldencross = crossover(macdDiff_1m, macdDea_1m); Bool deathcross = crossunder(macdDiff_1m, macdDea_1m); // ----- 获取5分钟布林带(bigLayer1)----- Numeric MiddleBand_5m = Data[bigLayer1].MiddleBand; Numeric MiddleBand_5m_pre = Data[bigLayer1].MiddleBand[1]; Numeric MiddleBand_5m_pre2 = Data[bigLayer1].MiddleBand[2]; Numeric MiddleBand_5mS = Data[bigLayer1].MiddleBandS; Numeric MiddleBandS_5m_pre = Data[bigLayer1].MiddleBandS[1]; Numeric MiddleBandS_5m_pre2 = Data[bigLayer1].MiddleBandS[2]; Numeric UpperBand_5m = Data[bigLayer1].UpperBand; Numeric UpperBand_5m_pre = Data[bigLayer1].UpperBand[1]; Numeric UpperBand_5m_pre2 = Data[bigLayer1].UpperBand[2]; Numeric LowerBand_5m = Data[bigLayer1].LowerBand; Numeric LowerBand_5m_pre = Data[bigLayer1].LowerBand[1]; Numeric LowerBand_5m_pre2 = Data[bigLayer1].LowerBand[2]; Commentary("MiddleBand_5m:" + Text(MiddleBand_5m)); Commentary("UpperBand_5m:" + Text(UpperBand_5m)); Commentary("LowerBand_5m:" + Text(LowerBand_5m)); // ----- 获取5分钟MACD(bigLayer1)----- Numeric macdDiff_5m = Data[bigLayer1].macdDiff; Numeric macdDea_5m = Data[bigLayer1].macdDea; Numeric macdDiff_5m_pre = Data[bigLayer1].macdDiff[1]; Numeric macdDea_5m_pre = Data[bigLayer1].macdDea[1]; Numeric macdDiff_5mS = Data[bigLayer1].macdDiffS; Numeric macdDea_5mS = Data[bigLayer1].macdDeaS; Commentary("macdDiff_5m:" + Text(macdDiff_5m)); Commentary("macdDea_5m:" + Text(macdDea_5m)); // ----- 获取30分钟布林带数据(bigLayer3)----- Numeric MiddleBand30m = Data[bigLayer2].MiddleBand; Numeric MiddleBand30m_pre = Data[bigLayer2].MiddleBand[1]; Numeric MiddleBand30m_pre2 = Data[bigLayer2].MiddleBand[2]; Numeric UpperBand30mS = Data[bigLayer2].UpperBandS; Numeric UpperBand30m_preS = Data[bigLayer2].UpperBandS[1]; Numeric UpperBand30m_preS2 = Data[bigLayer2].UpperBandS[2]; Numeric LowerBand30mS = Data[bigLayer2].LowerBandS; Numeric LowerBand30m_preS = Data[bigLayer2].LowerBandS[1]; Numeric LowerBand30m_preS2 = Data[bigLayer2].LowerBandS[2]; // ----- 获取30分钟MACD(bigLayer3)----- Numeric macdDiff_30m = Data[bigLayer2].macdDiff; Numeric macdDea_30m = Data[bigLayer2].macdDea; Numeric macdDiff_30m_1 = Data[bigLayer2].macdDiff[1]; Numeric macdDea_30m_1 = Data[bigLayer2].macdDea[1]; Numeric macdDiff_30m_2 = Data[bigLayer2].macdDiff[2]; Numeric macdDea_30m_2 = Data[bigLayer2].macdDea[2]; MinPoint = MinMove * PriceScale; Bool jxdtpl = MA5_5m_pre > MA5 _5m_pre2; Bool jxktpl = MA 5_5m_pre < MA5 _5m_pre2; Bool zggzz = MA5 _5m_pre > MA5 _5m_pre2 and MA10_5m_pre > MA 10_5m_pre2; Bool zggzd = MA5_5m_pre < MA5_5m_pre2 and MA10_5m_pre < MA10_5m_pre2; Bool spzg1 = L[1]< MA5_1m[1] and H[1]> MA5_1m[1]; //价格上穿 Bool xpzg1 = H[1]> MA5_1m[1] and L[1]< MA5_1m[1]; //价格下穿 Bool spsg1 = crossover(C[1], UpperBand_1m[1]); //价格上穿上轨1 Bool xpxg1 = crossunder(C[1], LowerBand_1m[1]); //价格下穿下轨1 Commentary("========== 多开条件调试开始 =========="); Commentary("========== 多开条件调试开始 =========="); // ========== 4. 交易执行(仅在基础周期1分钟上开平仓) ========== // ----- 平多仓 -----当布林带1宽度比大于0.6倍的平均比时 死叉平空 金叉平多 当布林带1宽度比大于0.6倍的平均比时 破下轨平空 破上个平多 ----- If(MarketPosition == 1 and deathcross) { Sell(0, Open); my_lexist_price = Open; Commentary("死叉平多"); Commentary("my_lexist_price:" + Text(my_lexist_price)); } // ----- 平空仓 ----- If(MarketPosition == -1 and goldencross and bld30wkk)// And bld1zkg { my_sexist_price = Open; BuyToCover(0, Open); Commentary("金叉平空"); Commentary("my_sexist_price:" + Text(my_sexist_price)); } // ----- 开多仓& 开空仓----- If(MarketPosition != 1 and (zgdtpl or zggzz) and spzg1 and Bollwidthb_1m>0.6) { Buy(Lots, Open); my_lentry_price = Open; MaxProfit_Ticks = 0; Commentary("my_lentry_price:" + Text(my_lentry_price)); } Else If(MarketPosition != -1 and (zgktpl or zggzd) and xpzg1 and Bollwidthb_1m>0.6) { SellShort(Lots, Open); my_sentry_price = Open; MaxProfit_Ticks = 0; Commentary("my_sentry_price:" + Text(my_sentry_price)); } If(MarketPosition != 0) // 只在有空仓时输出 { Commentary("--- 条件: 持仓状态下 BarsSinceEntry ---"); Commentary("MarketPosition != 0 = " + IIfString(MarketPosition != 0, "True", "False")); Commentary(" MarketPosition=" + Text(MarketPosition)); Commentary("BarsSinceEntry = " + Text(BarsSinceEntry)); } // ----- ----------多仓止盈止损 --------------- Bool zglx = ma5_1m[2] < ma5_1m[3] && ma5_1m[1] < ma5_1m[2]; Bool dtwlr = PositionProfit < 5 * MinPoint; Bool wlxlsg = dtwlr && bld5sk; Commentary("ma5_1m[3]:" + Text(ma5_1m[3])); Commentary("ma5_1m[2]:" + Text(ma5_1m[2])); Commentary("ma_1m[1]:" + Text(ma5_1m[1])); Commentary("macdDiff_5m_pre:" + Text(macdDiff_5m_pre)); Commentary("macdDea_5m_pre:" + Text(macdDea_5m_pre)); If(MarketPosition == 1 && BarsSinceEntry >= 1) // 有多仓的情况 { // ---------- 1. 正确更新最大浮盈(序列变量) ---------- // 使用最高价计算理论最大浮盈(更准确) Numeric CurrentProfit_Ticks = (Close - my_lentry_price) / MinPoint; Numeric HighProfit_Ticks = (High - my_lentry_price) / MinPoint; // 记录历史最大浮盈(用最高价) If(HighProfit_Ticks > MaxProfit_Ticks[1]) { MaxProfit_Ticks = HighProfit_Ticks; } Else { MaxProfit_Ticks = MaxProfit_Ticks[1]; } // ---------- 2. 止损逻辑 ---------- If(my_lentry_price-Low>5) { Sell(0, Close); Commentary("1档亏损5点多仓止损"); MaxProfit_Ticks = 0; } Else If(my_lentry_price-Low>20) // 2档止损 { Sell(0, Close); Commentary("2档亏损10点多仓止损"); MaxProfit_Ticks = 0; } } // ---------- 2. 多仓止损逻辑 ---------- Else If((ma5_1m[2] < ma5_1m[3] && ma5_1m[1] < ma5_1m[2]) or macdDiff_5m_pre<macdDea_5m_pre) { my_lexist_price = Close; Sell(0, Open); Commentary("多仓逆MA5/MACD5止损"); Commentary("my_lexist_price:" + Text(my_lexist_price)); MaxProfit_Ticks = 0; // 平仓后重置 } // ----- ----------空仓止盈止损 --------------- Bool tkdk = Open < LowerBand30mS - 5 * Minmove * Pricescale and C[1] > L[1]; Bool zgls = ma5_1m[2] > ma5_1m[3] and ma5_1m[1] > ma5_1m[2]; Bool ktwlr = PositionProfit < 5 * MinPoint; Bool wlslxg = ktwlr && bld5sk; Bool macdjc = macdDiff_5m_pre>macdDea_5m_pre; If(MarketPosition == -1 && BarsSinceEntry >= 1) // 有空仓且至少持有一根完整K线 { // 使用最低价计算理论最大浮盈(更准确) Numeric CurrentProfit_Ticks = (my_sentry_price - Close) / MinPoint; // 空头浮盈 = 开仓价 - 当前价 Numeric LowProfit_Ticks = (my_sentry_price - Low) / MinPoint; // 空头最大浮盈用最低价计算 // 记录历史最大浮盈(用最低价) If(LowProfit_Ticks > MaxProfit_Ticks[1]) { MaxProfit_Ticks = LowProfit_Ticks; } Else { MaxProfit_Ticks = MaxProfit_Ticks[1]; } // ---------- 2. 止损逻辑 ---------- If((ma5_1m[2] > ma5_1m[3] and ma5_1m[1] > ma5_1m[2]) or macdDiff_5m_pre>macdDea_5m_pre) { BuyToCover(0, Open); Commentary("空仓逆MA5/MACD止损"); MaxProfit_Ticks = 0; } Else If(H-my_sentry_price>=10) //&& difxs { BuyToCover(0, Open); Commentary("空头1档止损:最大浮亏" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } Else If(H-my_sentry_price>=20) { BuyToCover(0, Open); Commentary("空头2档止损:最大浮亏" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } } // ----- 开多仓& 开空仓----- If(MarketPosition != 1 and (zgdtpl or zggzz) and spzg1 and Bollwidthb_1m>0.6) { Buy(Lots, Open); my_lentry_price = Open; MaxProfit_Ticks = 0; Commentary("my_lentry_price:" + Text(my_lentry_price)); } Else If(MarketPosition != -1 and (zgktpl or zggzd) and xpzg1 and Bollwidthb_1m>0.6) { SellShort(Lots, Open); my_sentry_price = Open; MaxProfit_Ticks = 0; Commentary("my_sentry_price:" + Text(my_sentry_price)); } If(MarketPosition != 0) { Commentary("--- 条件: 持仓状态下 BarsSinceEntry ---"); Commentary("MarketPosition != 0 = " + IIfString(MarketPosition != 0, "True", "False")); Commentary(" MarketPosition=" + Text(MarketPosition)); Commentary("BarsSinceEntry = " + Text(BarsSinceEntry)); } } }
回复:代码不少啊,我先看看哈
回复:编译还会报错,简单的我就自己补
回复:
回复:感谢马老师 您幸苦 其他好像都没什么大问题 主要是用commentary函数输出明明是需要止损的 但是策略却连续忽略5道止损 直接拿到大亏 我是百思不得其解 也不知道怎么调了
回复:或者马老师您稍等 我等一下发个更完善的过来
回复:马老师请看看这个版本:一样的还是很多止损无法触发执行 Params Numeric Lots(1); // 交易手数 Numeric Length1(5); // 短均线周期(MA5) Numeric Length2(10); // 中均线周期(MA10) Numeric Length3(20); // 长均线周期(MA20) Numeric Length4(80); // 长均线周期(MA80) Numeric Lengthmax(100); // 长均线周期(MA100) Numeric BollingerPeriod0(4); // 布林带周期 Numeric BollingerPeriod(20); // 布林带周期 Numeric BollingerStdDev(2); // 布林带标准差倍数 Numeric BollingerStdDevS(2); Numeric BollingerPeriodS(80); // 布林带周期 Numeric MACDFast(12); // MACD快线周期 Numeric MACDSlow(26); // MACD慢线周期 Numeric MACDSignal(9); // MACD信号线周期 Numeric MACDFastS(48); // MACD快线周期 Numeric MACDSlowS(104); // MACD慢线周期 Numeric MACDSignalS(36); // MACD信号线周期 Numeric ATRPeriod(14); // ATR周期 String BigTimeFrame1("5m"); // 大周期1: 5分钟 String BigTimeFrame2("30m"); // 大周期2: 30分钟 String BigTimeFrame3("120m"); // 大周期3: 120分钟 String BigTimeFrame4("1d"); // 大周期4: 日线Vars Global Integer bigLayer1; Global Integer bigLayer2; Global Integer bigLayer3; Global Integer bigLayer4; Global Bool isStopping(false); // 防止重复执行 Numeric dailyClose; Numeric dailyOpen; Numeric dailyHigh; Numeric dailyLow; Numeric Close_30; Numeric Open_30; Numeric High_30; Numeric Low_30; Series<Numeric> MiddleBand; Series<Numeric> UpperBand; Series<Numeric> LowerBand; Series<Numeric> MiddleBandS; Series<Numeric> UpperBandS; Series<Numeric> LowerBandS; // ----- 以下变量在Range块中为每个大周期独立拥有 ----- // 均线 Series<Numeric> ma4_1m(0, 100); Series<Numeric> ma5(0, 100); Series<Numeric> ma10(0, 100); Series<Numeric> ma20(0, 100); Series<Numeric> ma80(0, 100); // 布林带 Series<Numeric> bollUpper(0, 20); Series<Numeric> bollMid(0, 20); Series<Numeric> bollLower(0, 20); // MACD Series<Numeric> macdDiff(0, 12); Series<Numeric> macdDea(0, 26); Series<Numeric> macdHist(0, 9); Series<Numeric> macdDiffS(0, 48); Series<Numeric> macdDeaS(0, 104); Series<Numeric> macdHistS(0, 36); Numeric MinPoint; // 一个最小变动单位,也就是一跳 Series<Numeric> MaxProfitl; Series<Numeric> MaxProfits; Series<Numeric> my_lentry_price; Series<Numeric> my_sentry_price; Series<Numeric> my_lexist_price; Series<Numeric> my_sexist_price; // 成交量 Series<Numeric> volData(0, 1); // 数据有效性标志 Series<Bool> barsOk(False, 2); // ----- 基础周期(1分钟)专用指标变量 ----- Series<Numeric> ma5_1m(0, 100); Series<Numeric> ma10_1m(0, 100); Series<Numeric> ma20_1m(0, 100); Series<Numeric> ma80_1m(0, 100); Series<Numeric> UpperBand_1m(0, 20); Series<Numeric> MiddleBand_1m(0, 20); Series<Numeric> LowerBand_1m(0, 20); Series<Numeric> dcUpper5_1m(0, 5); Series<Numeric> dcLower5_1m(0, 5); Series<Numeric> dcUpper20_1m(0, 20); Series<Numeric> dcLower20_1m(0, 20); Series<Numeric> macdDiff_1m(0, 12); Series<Numeric> macdDea_1m(0, 26); Series<Numeric> macdHist_1m(0, 9); Series<Numeric> atr_1m(0, 14); Series<Numeric> volData_1m(0, 1); Series<Bool> barsOk_1m(False, 2); Series<Numeric> UpperBand_5m(0,101); Series<Numeric> LowerBand_5m(0,101); Series<Numeric> UpperBand_5m_pre(0,101); Series<Numeric> LowerBand_5m_pre(0,101); Series<Numeric> ma5_5m; Series<Numeric> ma10_5m; Series<Numeric> ma5_5m_pre; Series<Numeric> ma5_5m_pre2; Series<Numeric> ma10_5m_pre; Series<Numeric> ma10_5m_pre2; Series<Numeric> bollWidth_5m_pre(0,2); Series<Numeric> bollWidth_5m_pre2(0,2); Series<Numeric> bollwidthb_5m_pre(0,2); Series<Numeric> bollwidthb_5m_pre2(0,2); Series<Numeric> averageWidth_5m_cur(0,2); Series<Numeric> averageWidth_5m_pre(0,2); Series<Numeric> MaxProfit_Ticks; Series<Numeric> my_lexitprice; Series<Numeric> my_sexitprice; Events OnInit() { // 订阅四个大周期数据源 bigLayer1 = SubscribeBar(Data0.Symbol, BigTimeFrame1, Data0.BeginDateTime, 0, Data0.DataFlag); bigLayer2 = SubscribeBar(Data0.Symbol, BigTimeFrame2, Data0.BeginDateTime, 0, Data0.DataFlag); bigLayer3 = SubscribeBar(Data0.Symbol, BigTimeFrame3, Data0.BeginDateTime, 0, Data0.DataFlag); bigLayer4 = SubscribeBar(Data0.Symbol, BigTimeFrame4, Data0.BeginDateTime, 0, Data0.DataFlag); // 设置大周期数据源的基础周期为1分钟,使其随小周期逐根更新 Data[bigLayer1].SetBasePeriod(Data0.Frequency); Data[bigLayer2].SetBasePeriod(Data0.Frequency); Data[bigLayer3].SetBasePeriod(Data0.Frequency); Data[bigLayer4].SetBasePeriod(Data0.Frequency); //设置最大连续建仓次数 SetConsecEntries(2); Print("OnInit"); } OnBar(ArrayRef<Integer> indexs){ // ========== 1. 为2个小周期计算指标 ========== Range[0:bigLayer1] // 对日线、120分钟、1分钟、5分钟分别执行 { Commentary("Close:" + Text(Close)); // 均线 ma5 = AverageFC(Close, Length1); ma10 = AverageFC(Close, Length2); ma20 = AverageFC(Close, Length3); ma80 = AverageFC(Close, Length4); PlotNumeric("MA5", ma5); PlotNumeric("MA10", ma10); PlotNumeric("MA20", ma20); PlotNumeric("MA80", ma80); Commentary("MA5:" + Text(ma5)); Commentary("MA10:" + Text(ma10)); Commentary("MA20:" + Text(ma20)); Commentary("MA80:" + Text(ma80)); // 本级布林带 (以ma20为中轨) MiddleBand = Average(Close, BollingerPeriod); UpperBand = MiddleBand + BollingerStdDev * StandardDev(Close, BollingerPeriod,2); LowerBand = MiddleBand - BollingerStdDev * StandardDev(Close, BollingerPeriod,2); //PlotNumeric("MiddleBand", MiddleBand); //PlotNumeric("UpperBand", UpperBand); //PlotNumeric("LowerBand", LowerBand); Commentary("MiddleBand:" + Text(MiddleBand)); Commentary("UpperBand:" + Text(UpperBand)); Commentary("LowerBand:" + Text(LowerBand)); // 本级MACD macdDiff = XAverage(Close, MACDFast) - XAverage(Close, MACDSlow); macdDea = XAverage(macdDiff, MACDSignal); macdHist = 2 * (macdDiff - macdDea); //PlotNumeric("macdDiff", macdDiff); //PlotNumeric("macdDea", macdDea); //PlotNumeric("macdHist", macdHist); Commentary("macdDiff:" + Text(macdDiff)); Commentary("macdDea:" + Text(macdDea)); Commentary("macdHist:" + Text(macdHist)); // 上级MACD macdDiffS = XAverage(Close, MACDFastS) - XAverage(Close, MACDSlowS); macdDeaS = XAverage(macdDiffS, MACDSignalS); macdHistS = 2 * (macdDiffS - macdDeaS); //PlotNumeric("macdDiffS", macdDiffS); //PlotNumeric("macdDeaS", macdDeaS); //PlotNumeric("macdHist", macdHist); Commentary("macdDiffS:" + Text(macdDiffS)); Commentary("macdDeaS:" + Text(macdDeaS)); Commentary("macdHistS:" + Text(macdHistS)); } // ========== 1. 为四个大周期计算指标 ========== Range[bigLayer2:bigLayer4] // 对日线、120分钟、30分钟分钟分别执行 { Commentary("Open:" + Text(Open)); Commentary("Close:" + Text(Close)); Commentary("High:" + Text(High)); Commentary("Low:" + Text(Low)); // 均线 ma5 = AverageFC(Close, Length1); ma20 = AverageFC(Close, Length3); PlotNumeric("MA5", ma5); PlotNumeric("MA20", ma20); Commentary("MA5:" + Text(ma5)); Commentary("MA20:" + Text(ma20)); // 本级布林带 (以ma20为中轨) MiddleBand = AverageFC(Close, Length3); UpperBand = MiddleBand + BollingerStdDev * StandardDev(Close, BollingerPeriod); LowerBand = MiddleBand - BollingerStdDev * StandardDev(Close, BollingerPeriod); } // ========== 2. 计算基础周期(1分钟)的指标 ========== ma5_1m = AverageFC(Close, Length1); ma10_1m = AverageFC(Close, Length2); ma20_1m = AverageFC(Close, Length3); ma80_1m = AverageFC(Close, Length4); Commentary("ma5_1m:" + Text(ma5_1m)); MiddleBand_1m = AverageFC(Close, BollingerPeriod); UpperBand_1m = MiddleBand_1m + BollingerStdDev * StandardDev(Close, BollingerPeriod,2); LowerBand_1m = MiddleBand_1m - BollingerStdDev * StandardDev(Close, BollingerPeriod,2); Commentary("MiddleBand_1m:" + Text(MiddleBand_1m)); Commentary("UpperBand_1m:" + Text(UpperBand_1m)); Commentary("LowerBand_1m:" + Text(LowerBand_1m)); macdDiff_1m = XAverage(Close, MACDFast) - XAverage(Close, MACDSlow); macdDea_1m = XAverage(macdDiff_1m, MACDSignal); macdHist_1m = 2 * (macdDiff_1m - macdDea_1m); Bool goldencross = crossover(macdDiff_1m, macdDea_1m); Bool deathcross = crossunder(macdDiff_1m, macdDea_1m); // ----- 获取5分钟布林带(bigLayer1)----- Numeric MiddleBand_5m = Data[bigLayer1].MiddleBand; Numeric MiddleBand_5m_pre = Data[bigLayer1].MiddleBand[1]; Numeric MiddleBand_5m_pre2 = Data[bigLayer1].MiddleBand[2]; Numeric MiddleBand_5mS = Data[bigLayer1].MiddleBandS; Numeric MiddleBandS_5m_pre = Data[bigLayer1].MiddleBandS[1]; Numeric MiddleBandS_5m_pre2 = Data[bigLayer1].MiddleBandS[2]; Numeric UpperBand_5m = Data[bigLayer1].UpperBand; Numeric UpperBand_5m_pre = Data[bigLayer1].UpperBand[1]; Numeric UpperBand_5m_pre2 = Data[bigLayer1].UpperBand[2]; Numeric LowerBand_5m = Data[bigLayer1].LowerBand; Numeric LowerBand_5m_pre = Data[bigLayer1].LowerBand[1]; Numeric LowerBand_5m_pre2 = Data[bigLayer1].LowerBand[2]; Commentary("MiddleBand_5m:" + Text(MiddleBand_5m)); Commentary("UpperBand_5m:" + Text(UpperBand_5m)); Commentary("LowerBand_5m:" + Text(LowerBand_5m)); // ----- 获取5分钟MACD(bigLayer1)----- Numeric ma5_5m = Data[bigLayer1].ma5; Numeric ma10_5m = Data[bigLayer1].ma10; Numeric ma5_5m_pre = Data[bigLayer1].ma5[1]; Numeric ma10_5m_pre = Data[bigLayer1].ma10[1]; Numeric ma5_5m_pre2 = Data[bigLayer1].ma5[2]; Numeric ma10_5m_pre2 = Data[bigLayer1].ma10[2]; Numeric macdDiff_5m = Data[bigLayer1].macdDiff; Numeric macdDea_5m = Data[bigLayer1].macdDea; Numeric macdDiff_5m_pre = Data[bigLayer1].macdDiff[1]; Numeric macdDea_5m_pre = Data[bigLayer1].macdDea[1]; Numeric macdDiff_5mS = Data[bigLayer1].macdDiffS; Numeric macdDea_5mS = Data[bigLayer1].macdDeaS; Commentary("macdDiff_5m:" + Text(macdDiff_5m)); Commentary("macdDea_5m:" + Text(macdDea_5m)); // ----- 获取30分钟布林带数据(bigLayer2)----- Numeric MiddleBand30m = Data[bigLayer2].MiddleBand; Numeric MiddleBand30m_pre = Data[bigLayer2].MiddleBand[1]; Numeric MiddleBand30m_pre2 = Data[bigLayer2].MiddleBand[2]; Numeric UpperBand30mS = Data[bigLayer2].UpperBandS; Numeric UpperBand30m_preS = Data[bigLayer2].UpperBandS[1]; Numeric UpperBand30m_preS2 = Data[bigLayer2].UpperBandS[2]; Numeric LowerBand30mS = Data[bigLayer2].LowerBandS; Numeric LowerBand30m_preS = Data[bigLayer2].LowerBandS[1]; Numeric LowerBand30m_preS2 = Data[bigLayer2].LowerBandS[2]; // ----- 获取30分钟MACD(bigLayer2)----- Numeric macdDiff_30m = Data[bigLayer2].macdDiff; Numeric macdDea_30m = Data[bigLayer2].macdDea; Numeric macdDiff_30m_1 = Data[bigLayer2].macdDiff[1]; Numeric macdDea_30m_1 = Data[bigLayer2].macdDea[1]; Numeric macdDiff_30m_2 = Data[bigLayer2].macdDiff[2]; Numeric macdDea_30m_2 = Data[bigLayer2].macdDea[2]; MinPoint = MinMove * PriceScale; Bool jxdtpl = ma5_5m_pre > ma5_5m_pre2 and ma10_5m_pre > ma10_5m_pre2; Bool jxktpl = ma5_5m_pre < ma5_5m_pre2 and ma10_5m_pre < ma10_5m_pre2; Bool spma5 = L[1]< ma5_1m[1] and H[1]> ma5_1m[1]; //价格上穿ma5 Bool xpma5 = H[1]> ma5_1m[1] and L[1]< ma5_1m[1]; //价格下穿ma5 Bool spsg1 = crossover(C[1], UpperBand_1m[1]); //价格上穿上轨1 Bool xpxg1 = crossunder(C[1], LowerBand_1m[1]); //价格下穿下轨1 // ========== 4. 交易执行(仅在基础周期1分钟上开平仓) ========== // ----- 开多仓& 开空仓----- If(MarketPosition != 1 and jxdtpl) { Buy(Lots, Open); my_lentry_price = Open; MaxProfit_Ticks = 0; Commentary("my_lentry_price:" + Text(my_lentry_price)); } Else If(MarketPosition != -1 and jxktpl) { SellShort(Lots, Open); my_sentry_price = Open; MaxProfit_Ticks = 0; Commentary("my_sentry_price:" + Text(my_sentry_price)); } If(MarketPosition != 0) // 只在有空仓时输出 { Commentary("--- 条件: 持仓状态下 BarsSinceEntry ---"); Commentary("MarketPosition != 0 = " + IIfString(MarketPosition != 0, "True", "False")); Commentary(" MarketPosition=" + Text(MarketPosition)); Commentary("BarsSinceEntry = " + Text(BarsSinceEntry)); } // ----- 平多仓 ----- If(MarketPosition == 1 and deathcross)// And bld1zkg { Sell(0, Open); my_lexist_price = Open; Commentary("死叉平多"); Commentary("my_lexist_price:" + Text(my_lexist_price)); } // ----- 平空仓 ----- If(MarketPosition == -1 and goldencross)// And bld1zkg { my_sexist_price = Open; BuyToCover(0, Open); Commentary("金叉平空"); Commentary("my_sexist_price:" + Text(my_sexist_price)); } If(MarketPosition != 0) // 只在有空仓时输出 { Commentary("--- 条件: 持仓状态下 BarsSinceEntry ---"); Commentary("MarketPosition != 0 = " + IIfString(MarketPosition != 0, "True", "False")); Commentary(" MarketPosition=" + Text(MarketPosition)); Commentary("BarsSinceEntry = " + Text(BarsSinceEntry)); } // ----- ----------多仓止盈止损 --------------- Bool zglx = ma5_1m[2] < ma5_1m[3] && ma5_1m[1] < ma5_1m[2];// && Open[1] < ma20_1m[1]; Bool dtwlr = PositionProfit < 5 * MinPoint; Commentary("ma20_1m[3]:" + Text(ma20_1m[3])); Commentary("ma20_1m[2]:" + Text(ma20_1m[2])); Commentary("ma20_1m[1]:" + Text(ma20_1m[1])); Commentary("macdDiff_5m_pre:" + Text(macdDiff_5m_pre)); Commentary("macdDea_5m_pre:" + Text(macdDea_5m_pre)); If(MarketPosition == 1 && BarsSinceEntry >= 1) // 有多仓的情况 { // ---------- 1. 正确更新最大浮盈(序列变量) ---------- // 使用最高价计算理论最大浮盈(更准确) Numeric CurrentProfit_Ticks = (Close - my_lentry_price) / MinPoint; Numeric HighProfit_Ticks = (High - my_lentry_price) / MinPoint; // 记录历史最大浮盈(用最高价) If(HighProfit_Ticks > MaxProfit_Ticks[1]) { MaxProfit_Ticks = HighProfit_Ticks; } Else { MaxProfit_Ticks = MaxProfit_Ticks[1]; } // ---------- 2. 止损逻辑 ---------- If(my_lentry_price-Low>5) { Sell(0, Close); Commentary("1档亏损5点多仓止损"); MaxProfit_Ticks = 0; } Else If(my_lentry_price-Low>20) // 2档止损 { Sell(0, Close); Commentary("2档亏损10点多仓止损"); MaxProfit_Ticks = 0; } // 无法上涨出场: Else If(BarsSinceEntry >= 5 && BarsSinceEntry <= 9 && C[1]-my_lentry_price <= 2) { Sell(0, Close); Commentary("5分不涨平仓:最大" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; }Else If(BarsSinceEntry >= 9 && BarsSinceEntry <= 13 && C[1]-my_lentry_price <= 5) //此条需要细化 { Sell(0, Close); Commentary("9分不涨平仓:最大" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } Else If(MaxProfit_Ticks >= 10 and CurrentProfit_Ticks <= MaxProfit_Ticks * 0.5) { my_lexitprice = C; Sell(0, my_lexitprice); Commentary("移动止盈:最大" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } Else If(MaxProfit_Ticks >= 30 and CurrentProfit_Ticks <= MaxProfit_Ticks * 0.8) // 浮盈超过20点后回撤75% { my_lexitprice = C; Sell(0, my_lexitprice); Commentary("移动止盈:最大" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } // ---------- 2. 多仓止损逻辑 ---------- Else If((ma20_1m[2] < ma20_1m[3] && ma20_1m[1] < ma20_1m[2]) or macdDiff_5m_pre<macdDea_5m_pre)//回测部分可以触发 { my_lexist_price = Close; Sell(0, Open); Commentary("多仓逆中轨1/MACD5止损"); Commentary("my_lexist_price:" + Text(my_lexist_price)); MaxProfit_Ticks = 0; // 平仓后重置 } // ----- ----------空仓止盈止损 --------------- Bool tkdk = Open < LowerBand30mS - 5 * Minmove * Pricescale and C[1] > L[1]; Bool zgls = ma20_1m[2] > ma20_1m[3] and ma20_1m[1] > ma20_1m[2];// && Open[1] > ma20_1m[1]; Bool ktwlr = PositionProfit < 5 * MinPoint; Bool macdjc = macdDiff_5m_pre>macdDea_5m_pre; If(MarketPosition == -1 && BarsSinceEntry >= 1) // 有空仓且至少持有一根完整K线 { // 使用最低价计算理论最大浮盈(更准确) Numeric CurrentProfit_Ticks = (my_sentry_price - Close) / MinPoint; // 空头浮盈 = 开仓价 - 当前价 Numeric LowProfit_Ticks = (my_sentry_price - Low) / MinPoint; // 空头最大浮盈用最低价计算 // 记录历史最大浮盈(用最低价) If(LowProfit_Ticks > MaxProfit_Ticks[1]) { MaxProfit_Ticks = LowProfit_Ticks; } Else { MaxProfit_Ticks = MaxProfit_Ticks[1]; } // ---------- 2. 止损逻辑 ---------- If((ma20_1m[2] > ma20_1m[3] and ma20_1m[1] > ma20_1m[2]) or macdDiff_5m_pre>macdDea_5m_pre) { BuyToCover(0, Open); Commentary("中轨转上空仓止盈"); MaxProfit_Ticks = 0; } Else If(H-my_sentry_price>=10) //&& difxs { BuyToCover(0, Open); Commentary("空头1档止损:最大浮亏" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } Else If(H-my_sentry_price>=20) { BuyToCover(0, Open); Commentary("空头2档止损:最大浮亏" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } Else If(BarsSinceEntry >= 5 && BarsSinceEntry <= 9 && my_sentry_price-C[1]<2)//MaxProfit_Ticks <= 5)// { BuyToCover(0, Open); Commentary("5分不跌空头出场:最大浮盈" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } Else If(BarsSinceEntry >= 9 && my_sentry_price-C[1]<=5)//MaxProfit_Ticks <= 5)/ { BuyToCover(0, Open); Commentary("9分不跌空头出场:最大浮盈" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } Else If(MaxProfit_Ticks >= 20 AND CurrentProfit_Ticks <= MaxProfit_Ticks * 0.7) { BuyToCover(0, Open); Commentary("空头移动止盈:最大" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } Else If(MaxProfit_Ticks >= 30 AND CurrentProfit_Ticks <= MaxProfit_Ticks * 0.8) { BuyToCover(0, Open); Commentary("空头移动止盈:最大" + Text(MaxProfit_Ticks) + "跳,回撤至" + Text(CurrentProfit_Ticks) + "跳"); MaxProfit_Ticks = 0; } } } }
回复:马老师好 若有结果反馈 代码部分请发送到qq邮箱:578040916@qq.com 谢谢马老师
回复:麻烦您直接加我企业微信吧,我已经发到你邮箱了。