空头开仓后,在第二个BAR会就出现止损处理,多头不会止损,请老师检查原因,并修改正常的代码

//下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组 OnBarClose(ArrayRef<Integer> indexs) { //多头入场 If(MarketPosition == 0) { If(MA60[1]<=MA20[1] And MA10[1]>MA20[1] And MA10>MA20 And MA20>MA60CDValue > 0.43*ATRVal)// And VolMA > VolumeFactor*VolMA[1]) { myEntryPrice = Open; myStopLossPrice = myEntryPrice - ATRVal*2; Buy(Lots,Open); } } //多头出场 If(MarketPosition == 1 And BarsSinceEntry >= 1) { // 止损 If(Close <= myStopLossPrice) { Sell(0,Open); } // 趋势反转出场 If(Close < MA20 ) { Sell(0,Open); } } //空头入场 If(MarketPosition == 0) { If(MA60[1] >= MA20[1] And MA10[1] < MA20[1] And MA10 < MA20 And MA20 < MA60) { myEntryPrice = Open; myStopLossPrice_S = myEntryPrice + ATRVal*2; SellShort(Lots,Open); } } //空头出场 If(MarketPosition == -1 And BarsSinceEntry >= 1) { // 止损或止盈 If(Close >= myStopLossPrice_S) { BuyToCover(0, Open); } // 趋势反转出场 If(Close > MA205) { BuyToCover(0, Open); } }

谢谢老师,问题已经解决

下面是详细的原代码,请帮我查一下。谢谢

//------------------------------------------------------------------------ // 简称: M85 // 名称: 5081 // 类别: 公式应用 // 类型: 用户应用 // 输出: Void //------------------------------------------------------------------------ Params // MA参数 Numeric FastMA(10); // 快速EMA周期 Numeric MediumMA(20); // 中速EMA周期 Numeric SlowMA(60); // 慢速EMA周期 // MACD参数 Numeric MACDFast(4); // MACD快线周期 Numeric MACDSlow(12); // MACD慢线周期 Numeric MACDSignal(4); // MACD信号周期 // 动态ATR风控 Numeric ATRPeriod(12); Numeric EntryATRFactor(1.3); // 入场ATR倍数 Numeric StopLossATR(2); // 止损ATR倍数 Numeric TakeProfitATR(5); // 止盈ATR倍数 // 成交量过滤 Numeric VolumeLength(5); // 成交量均线周期 Numeric VolumeFactor(1.2); // 成交量放大阈值 // 资金管理 Numeric Lots(1); // 开仓手数 Numeric RiskPercent(1); // 单笔风险百分比 Numeric MaxLots(10); // 最大手数限制 Numeric millsecs(1000); Vars // MA变量 Series<Numeric> MA10; Series<Numeric> MA20; Series<Numeric> MA60; //MACD变量 Series<Numeric> MACDDiff; Series<Numeric> AvgMACD; Series<Numeric> MACDValue; // ATR变量 Series<Numeric> ATRVal; // 成交量均线 Series<Numeric> VolMA; // 开仓价格 Numeric myEntryPrice; Numeric myStopLossPrice; //止损 Numeric myStopLossPrice_S; //空头止损 Numeric myTakeProfitPrice; //止盈 Bool UpTrend(False); //多头 Bool DnTrend(False); //空头 Numeric avg; Global Integer timerId; Events //此处实现事件函数 //在所有的数据源准备完成后调用,应用在数据源的设置等操作 OnReady() { SetBackBarMaxCount(1+Max(Max(FastMA,MediumMA),SlowMA)); } //在新bar的第一次执行之前调用一次,参数为新bar的图层数组 OnBarOpen(ArrayRef<Integer> indexs) { } //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组 OnBar(ArrayRef<Integer> indexs) { Range[0:DataSourceSize() - 1] { //均线计算 MA10 = AverageFC(Close,FastMA); MA20 = AverageFC(Close,MediumMA); MA60 = AverageFC(Close,SlowMA); PlotNumeric("MA10",MA10); PlotNumeric("MA20",MA20); PlotNumeric("MA60",MA60); //MACD计算 MACDDiff = XAverage( Close, MACDFast ) - XAverage( Close, MACDSlow ) ; AvgMACD = XAverage(MACDDiff,MACDSignal); MACDValue = 2 * (MACDDiff - AvgMACD); // 波动性与成交量 ATRVal = AvgTrueRange(ATRPeriod); VolMA = Average(Vol, VolumeLength); } //多头止损 If(MarketPosition == 1 And BarsSinceEntry >= 1) { If(Low <= myEntryPrice - ATRVal*StopLossATR) { Sell(0,Open); } } //空头止损 If(MarketPosition == -1 And BarsSinceEntry >= 1) { If(High >= myEntryPrice + ATRVal*StopLossATR) { BuyToCover(0, Open); } } } //下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组 OnBarClose(ArrayRef<Integer> indexs) { //空头入场 If(MarketPosition == 0) { If(MA60[1] >= MA20[1] And MA10[1] < MA20[1] And MA10 < MA20 And MA20 < MA60 And MACDValue < -0.43*ATRVal) { myEntryPrice = Open; SellShort(Lots,Open); } Else If(MA60[1] <= Close[1] And MA10[1] < MA20[1] And MA10 < MA20 And Close < MA60 And MACDValue < -0.43*ATRVal) { myEntryPrice = Open; SellShort(Lots,Open); } Else If(MA60[1] <= Close[1] And MA10[1] >= MA20[1] And MA10 < MA20 And Close < MA60 And MACDValue < -0.43*ATRVal) { myEntryPrice = Open; SellShort(Lots,Open); } Else If(MA20[1] < MA60[1] And MA10[1] >= MA20[1] And MA10 < MA20 And MA20 < MA60 And MACDValue < -0.43*ATRVal) { myEntryPrice = Open; SellShort(Lots,Open); } } //空头出场 If(MarketPosition == -1 And BarsSinceEntry >= 1) { If(Close > MA20 Or (Close > MA10 And Close[1] > MA10[1])) { BuyToCover(0, Open); } } //多头入场 If(MarketPosition == 0) { If(MA60[1]<=MA20[1] And MA10[1]>MA20[1] And MA10>MA20 And MA20>MA60 And MACDValue > 0.43*ATRVal)// And VolMA > VolumeFactor*VolMA[1]) { myEntryPrice = Open; Buy(Lots,Open); } Else If(MA60[1]>=Close[1] And MA10[1]>MA20[1] And MA10>MA20 And Close>MA60 And MACDValue > 0.43*ATRVal) { myEntryPrice = Open; Buy(Lots,Open); } Else If(MA60[1]>=Close[1] And MA10[1]<=MA20[1] And MA10>MA20 And Close>MA60 And MACDValue > 0.43*ATRVal) { myEntryPrice = Open; Buy(Lots,Open); } Else If(MA20[1]>MA60[1] And MA10[1]<=MA20[1] And MA10>MA20 And MA20>MA60 And MACDValue > 0.43*ATRVal) { myEntryPrice = Open; Buy(Lots,Open); } } //多头出场 If(MarketPosition == 1 And BarsSinceEntry >= 1) { If(Close < MA20 Or (Close < MA10 And Close[1] < MA10[1])) { Sell(0,Open); } } } //------------------------------------------------------------------------ // 编译版本 2025/07/04 194828 // 版权所有 Billszhan9702 // 更改声明 TradeBlazer Software保留对TradeBlazer平台 // 每一版本的TradeBlazer公式修改和重写的权利 //------------------------------------------------------------------------

回复:果然是在你没给的代码里出问题。53行这个变量应该这么定义

回复:他交易几次?弄个全局变量或者全局数组吧

回复:你对全局变量真的有执念啊

回复:序列变量比较适合TBQ机制全局更好使

代码不完整,无法运行,诊断不了。代码诊断和代写问题看置顶帖的收费代写服务