按照下面的函数跑玉米淀粉,策略报告显示2023年7月25日到2024年7月25日两小时周期有300多笔交易,但是图表远小于这个数字,是有bug吗?
Params
Numeric Length(8); //周期
Numeric Offset(0.6); //标准差倍数
Numeric DMI_N(14); //DMI的N值
Numeric DMI_M(6); //DMI的M值, 本策略中用不到
Numeric ADXLevel(30); //ADX低于此值时被认为行情处于震荡中
Numeric FastLength(5);// 短期指数平均线参数
Numeric SlowLength(10);// 长期指数平均线参数
Vars
Series<Numeric> UpLine; //上轨
Series<Numeric> DownLine; //下轨
Series<Numeric> MidLine; //中间线
Numeric Band;
Numeric fudu;//计算两轨之间差距
//DMI最终输出
Series<Numeric> oDMIPlus;
Series<Numeric> oDMIMinus;
Series<Numeric> oDMI;
Series<Numeric> oADX;
Series<Numeric> oADXR;
Series<Numeric> oVolty;
//DMI过程计算
Series<Numeric> sDMI;
Series<Numeric> sADX;
Series<Numeric> cumm;
Series<Numeric> sVolty;
Numeric PlusDM;
Numeric MinusDM;
Numeric UpperMove;
Numeric LowerMove;
Numeric SumPlusDM(0);
Numeric SumMinusDM(0);
Numeric SumTR(0);
Series<Numeric> AvgPlusDM;
Series<Numeric> AvgMinusDM;
Numeric SF; // smoothing factor
Numeric Divisor;
Numeric i;
Series<Numeric> TRValue;
//--------------------
Numeric money;//开仓资金
Numeric myprice;//委托价格
Numeric lots;//委托数量
Global Numeric lposition;
Global Numeric sposition;
Series<String> entr;//入场位置
Events
OnInit()
{
AddDataFlag(Enum_Data_RolloverBackWard());
AddDataFlag(Enum_Data_RolloverRealPrice());
AddDataFlag(Enum_Data_AutoSwapPosition());
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());
SetBeginBarMaxCount(10); //设置最大起始bar数为10
}
OnReady()
{
SetBackBarMaxCount(1+Max(SlowLength,Length));
}
OnBarOpen(ArrayRef<Integer> indexs)
{
If(MarketPosition == -1 && low[1] > MidLine[1])//空头止盈
{
BuyToCover(sposition,Open);
Commentary(空头止盈);
}
If(MarketPosition ==1 && high[1] < MidLine[1])//多头止盈
{
Sell(lposition,Open);
Commentary(多头止盈);
}
}
OnBar(ArrayRef<Integer> indexs)
{
Numeric a;
Numeric result = 1;
for a = 0 to DataSourceSize-1
{
result = result*data[a].BarExistStatus;
}
If (result <> 1) Return;//检查跨周期数据源是否闪烁
Numeric risk;//账户当前风险程度
risk = Portfolio_UsedMargin / Portfolio_CurrentEquity;//定义risk为保证金占动态权益比例
money = Portfolio_CurrentEquity * 0.4;//按总风险度的40%,每个品种均分投资额
myprice = Open;//这里使用open,更为精确的是使用委托价格
lots = IntPart(money/(myprice*contractunit*BigPointValue*MarginRatio)); //计算开仓手数
Range[0:DataSourceSize() - 1]
{
MidLine = AverageFC(Close[1],Length);
Band = StandardDev(Close[1],Length,2);
UpLine = MidLine + Offset * Band;
DownLine = MidLine - Offset * Band;
fudu = Offset * Band / MidLine;
PlotNumeric(UpLine,UpLine);
PlotNumeric(DownLine,DownLine);
PlotNumeric(MidLine,MidLine);
Commentary(潜在空间:+Text(fudu));
//DMI指标计算, 最终将输出ADX指标
//--------------------------DMI计算开始-----------------------------------//
SF = 1/DMI_N;
TRValue = TrueRange;
If(CurrentBar == DMI_N)
{
for i = 0 To DMI_N - 1
{
PlusDM = 0 ;
MinusDM = 0 ;
UpperMove = High[i] - High[ i + 1 ] ;
LowerMove = Low[ i + 1 ] - Low[i] ;
if (UpperMove > LowerMove And UpperMove > 0 )
{
PlusDM = UpperMove;
}else if (LowerMove > UpperMove And LowerMove > 0)
{
MinusDM = LowerMove ;
}
SumPlusDM = SumPlusDM + PlusDM ;
SumMinusDM = SumMinusDM + MinusDM ;
SumTR = SumTR + TRValue[i] ;
}
AvgPlusDM = SumPlusDM / DMI_N ;
AvgMinusDM = SumMinusDM / DMI_N ;
sVolty = SumTR / DMI_N ;
}
Else if(CurrentBar > DMI_N)
{
PlusDM = 0 ;
MinusDM = 0 ;
UpperMove = High - High[1] ;
LowerMove = Low[1] -Low ;
if (UpperMove > LowerMove And UpperMove > 0 )
{
PlusDM = UpperMove;
}else if (LowerMove > UpperMove And LowerMove > 0 )
{
MinusDM = LowerMove ;
}
AvgPlusDM = AvgPlusDM[1] + SF * ( PlusDM - AvgPlusDM[1] ) ;
AvgMinusDM = AvgMinusDM[1] + SF * ( MinusDM - AvgMinusDM[1] ) ;
sVolty = sVolty[1] + SF * ( TRValue - sVolty[1] ) ;
}Else
{
oDMIPlus = InvalidNumeric;
oDMIMinus = InvalidNumeric;
oDMI = InvalidNumeric;
oADX = InvalidNumeric;
oADXR = InvalidNumeric;
oVolty = InvalidNumeric;
}
if (sVolty > 0)
{
oDMIPlus = 100 * AvgPlusDM / sVolty ;
oDMIMinus = 100 * AvgMinusDM / sVolty ;
}else
{
oDMIPlus = 0 ;
oDMIMinus = 0 ;
}
Divisor = oDMIPlus + oDMIMinus ;
if (Divisor > 0)
{
sDMI = 100 * Abs( oDMIPlus - oDMIMinus ) / Divisor;
}else
{
sDMI = 0 ;
}
cumm=Cum( sDMI );
if(CurrentBar > 0)
{
if (CurrentBar <= DMI_N)
{
sADX = Cumm / CurrentBar ;
oADXR = ( sADX + sADX[ CurrentBar - 1 ] ) * 0.5 ;
}else
{
sADX = sADX[1] + SF * ( sDMI - sADX[1] ) ;
oADXR = ( sADX + sADX[ DMI_M - 1 ] ) * 0.5 ;
}
}
oVolty = sVolty;
oDMI = sDMI;
oADX = sADX;
Commentary(MarketPosition: + Text(MarketPosition()));
Commentary(动态权益: + Text(Portfolio_CurrentEquity));
Commentary(保证金占用: + Text(Portfolio_UsedMargin));
//提示各图层多、空仓信息
Commentary(风险度:+Text(risk));
Commentary(ADX:+text(oADX[1]));
if(oADX[1] <= ADXLevel)
{
Commentary(震荡);
}else
{
Commentary(趋势);
}
If(risk <= 0.4 && MarketPosition <> 1 && oADX[1] > ADXLevel && High >= UpLine)//在震荡市,限制开仓规模
{
Buy(lots,max(high,UpLine));//符合做多环境,做多
lposition = lots;
}
If(risk <= 0.4 && MarketPosition <> -1 && oADX[1] > ADXLevel && low <= downLine) //在震荡市,限制开仓规模
{
SellShort(lots,min(low,DownLine));//符合做空环境,做空
sposition = lots;
}
}
}
//------------------------------------------------------------------------
// 编译版本 2024/06/20 220532
// 版权所有 xingn1991
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
我不知道你是怎么得到你的结论的
按照你的配置加载,测试报告说交易次数只有59次,哪里来300次,看不懂
嗯奇怪了,我图表直接右键打开策略报告,也显示300多次交易,估计卡bug了