代码写的手数和策略交易里面的信号手数不一致

如图所示,代码里面已经写明初始开仓手数是1手,后续加仓手数也是1手,但是把策略挂到自动交易时,策略给的初始仓位是3手,请问是什么原因?Params Numeric avgLength(40); // 三价均线参数 Numeric atrLength(40); // 真实波幅参数 Numeric Factor_(1.2); // 轨道系数 Numeric Lots(1); // 交易手数 Vars Series<Numeric> movAvgVal(0); // 三价均线参数 Series<Numeric> upBand(0); // 通道上轨 Series<Numeric> upBand2(0); // 通道上轨 2 Series<Numeric> dnBand(0); // 通道下轨 Series<Numeric> dnBand2(0); // 通道下轨 2 Series<Numeric> liquidPoint(0); // 出场条件 Events //此处实现事件函数 //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作 OnInit() { //plt1.figure(0); //plt1.setOption("oADX_", "color", White); //plt1.setOption("line", "color", Yellow); // //plt2.figure(0); //plt2.setOption("MACD","color",RED); //plt2.setOption("macd","color",Green); Numeric Fund( 1000 ); // 初始资金: 万 Numeric Offset4Jump( 5 ); // 发单委托偏移 x 跳 // 多图层订阅行情 // freq String 订阅频率 'mon':月,'w':周,'d':日,'h':时,'m':分,'s':秒,'tick':tick,字符串前面可以添加数字,如'3d'表示周期是3天; // flag Integer Enum_Data_OnlyNight()表示仅夜盘,Enum_Data_OnlyDay()表示仅日盘,Enum_Data_RolloverBackWard()表示后复权,可做或运算,表示多种情况 // SubscribeBar(Data0.Symbol, "1h", Data0.BeginDateTime); // 按样本数订阅 // SubscribeBarCounts(Data0.Symbol, "1h", 1000); //与数据源有关 Range[ 0: DataCount - 1 ] { //=========数据源相关设置============== AddDataFlag( Enum_Data_RolloverBackWard() ); //设置后复权 AddDataFlag( Enum_Data_RolloverRealPrice() ); //设置映射真实价格 AddDataFlag( Enum_Data_AutoSwapPosition() ); //设置自动换仓 AddDataFlag( Enum_Data_IgnoreSwapSignalCalc() ); /* //设置忽略换仓信号计算 备注: Enum_Data_IgnoreSwapSignalCalc, 对于一个策略来说,换仓的这笔交易并不是策略规则产生的, 所以将换仓前后的这两笔交易合并为一笔能更好的统计策略性能。合并之后,交易盈亏依旧是真实的, 只不过换仓前后的这两笔交易算一笔交易,但是手续费会从测试报告中扣除。 忽略换仓时,换仓后的开仓市值为原始的开仓市值。开仓均价按照原始开仓市值计算得来。 */ //AddDataFlag(Enum_Data_NotGenReport()); //设置数据源不参与生成报告标志 //=========交易相关设置============== SetOrderPriceOffset( Offset4Jump ); //设置委托价为叫买/卖价偏移x跳 SetOrderMap2MainSymbol(); //设置委托映射到主力 SetSwapPosVolType( 2 ); // 换月时头寸:1=等市值,2=等持仓量 } //与数据源无关 //SetBeginBarMaxCount(10); //设置最大起始bar数为10 //SetBackBarMaxCount(10); //设置最大回溯bar数为10 //=========交易相关设置============== SetInitCapital( Fund * 10000 ); //设置初始资金 } OnBar(ArrayRef<Integer> indexs) { // 三价均线 movAvgVal = Average((High + Low + Close)/3,avgLength); // 通道上轨 upBand = movAvgVal + AvgTrueRange(atrLength)*Factor_; upBand2 = movAvgVal + AvgTrueRange(atrLength)*2; // 通道下轨 dnBand = movAvgVal - AvgTrueRange(atrLength)*Factor_; dnBand2 = movAvgVal - AvgTrueRange(atrLength)*2; // 出场条件 liquidPoint = movAvgVal; Numeric MA4D = MA4Day(20); Numeric bse = 3; // 入场控制 Commentary("上下轨差 = " + Text(upBand - dnBand)); // 画线 PlotAuto("movAvgVal",movAvgVal,0,Magenta,-1,-1,Enum_2Pix); //PlotNumeric("upBand",upBand); //PlotNumeric("upBand2",upBand2); //PlotNumeric("dnBand",dnBand); //PlotNumeric("dnBand2",dnBand2); PlotNumeric("MA4D",MA4D); // 三价均线向上,并且价格上破通道上轨,开多单 If(MarketPosition == 0 And movAvgVal[1] > movAvgVal[2] And High >= upBand[1] && Open > MA4D) { Buy(Lots, Max(Open,upBand[1])); } If(MarketPosition == 1 And BarsSinceEntry >= 1 And CurrentEntries == 1 && movAvgVal[1] > movAvgVal[2] And C[1] >= upBand2[1]) { Buy(Lots, Open); } // 持有多单时,价格下破三价均线,平多单 If(MarketPosition == 1 And BarsSinceEntry >= 1 And Low <= liquidPoint[1] && CurrentEntries == 1) { Sell(0,Min(Open,liquidPoint[1])); } If(MarketPosition == 1 And BarsSinceEntry >= bse And Low <= dnBand2[1] && CurrentEntries == 2) { Sell(0,Min(Open,dnBand2[1])); } // 三价均线向下,并且价格下破通道下轨,开空单 If(MarketPosition == 0 And movAvgVal[1] < movAvgVal[2] And Low <= dnBand[1]&& Open < MA4D ) { SellShort(Lots,Min(Open,dnBand[1])); } If(MarketPosition == -1 And BarsSinceEntry >= bse And CurrentEntries == 1 && movAvgVal[1] < movAvgVal[2] And C[1] <= dnBand2[1]) { SellShort(Lots, Open); } // 持有空单时,价格上破三价均线,平空单 If(MarketPosition == -1 And BarsSinceEntry >= 1 And High >= liquidPoint[1] && CurrentEntries == 1) { BuyToCover(0,Max(Open,liquidPoint[1])); } If(MarketPosition == -1 And BarsSinceEntry >= 1 And High >= upBand2[1] && CurrentEntries == 2) { BuyToCover(0,Max(Open,upBand2[1])); } }

你能加仓为什么不能是3

有没有一种可能是因为历史上加了两次仓,连带着第一次开仓所以总共三手?

回复:应该就是这个原因,带入了历史K线的仓位。我正在想办法解决,请问您能给点建议吗?非常感谢。

回复:解决?我不懂,这算是什么问题么?这不是你模型逻辑的正常结果么?

你可以打开辅助K线看看呢 ,在你开策略的时点,可能图表已经加了两次仓了呢

回复:辅助K线我打卡看过,没有问题。