如图所示,
代码里面已经写明初始开仓手数是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线我打卡看过,没有问题。