Params
//此处添加参数
Numeric lost(1);
Vars
//此处添加变量
Series<Numeric> PVIValue;
Series<Numeric> PVI250;
Series<Numeric> MAPVI;
Series<Bool> upband(False);
Series<Bool> downband(False);
Series<Numeric> MedianPrice;
Series<Numeric> MA1;
Series<Numeric> rang;
Series<Numeric> UpAvg(0);
Series<Numeric> LowAvg(0);
Series<Numeric> Barct(0);
Series<Numeric> A(0);
Series<Numeric> B(0);
Numeric lenth(90); //默认区间周期参数
Numeric STbar(40); //加速的BAR数范围
Numeric Longma(120); // 长周期均线
Events
OnInit()
{
//与数据源有关
Range[0:DataCount-1]
{
//=========数据源相关设置==============
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
}
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
If(CurrentBar == 0)
{
PVIValue = 100;
}Else
{
If(Vol > Vol[1])
{
PVIValue = PVIValue[1]+(Close-Close[1])/Close[1]*PVIValue[1];
}Else
{
PVIValue = PVIValue[1];
}
PVI250 = AverageFC(PVIValue,250);
MAPVI = PVIValue - PVI250;
}
// 指标计算
MA1 = AverageFC(C,Longma);//均线
rang = High - Low;//最新价差
UpAvg = Highest(((High[1]+Close[1])-(2*Close[1]))+OpenD(0), lenth); //取LENTH周期内的日开盘价+波动幅度的最高值
LowAvg = Lowest(((Close[1]+low[1])-(2*Close[1]))+OpenD(0), lenth); //取LENTH周期内的日开盘价+波动幅度的最低值;
MedianPrice = (High + Low)*0.5; //最新中间价
upband = MedianPrice > High[1] and rang > rang[1];//中间价大于 上一个BAR的最高价且最新价差大于上一个BAR的价差
downband = MedianPrice < Low[1] and rang > rang[1];//中间价小于 上一个BAR的最低价且最新价差大于上一个BAR的价差
// 多头入场
If(MarketPosition == 0 and C[1]>MA1[1] && MAPVI[1] > 0) //没有多头持仓的情况下,价格大于均线
{
If(upband[1] and Close[1] > UpAvg[1]) // 上一个BAR线的upband条件满足且价格>区间上沿;
{
Buy(Lost,Open);
A = A + 1;
}
}
// 空头入场
If(MarketPosition == 0 and C[1]<MA1[1] && MAPVI[1] < 0) //没有空头持仓的情况下,价格小于均线
{
If(downband[1] and Close[1] < LowAvg[1]) // 上一个BAR线的downband条件满足且价格<区间下沿;
{
Sellshort(Lost,Open);//开空
B = B + 1;
}
}
Commentary("A = " + Text(A));
Commentary("B = " + Text(B));
}
老师你好,帮我看看这段代码,我计算A跟B的累加是在开仓条件里面的。但是,我发现还没出现开仓信号,A跟B的值也在累加,帮忙看看什么原因
PVI250 = AverageFC(PVIValue,250); 这里使用了250的均值,在bar数量不够的时候,系统应该有不发单的机制。
但是值是会计算的
你可以尝试把你的开仓条件用bool打印,应该可以看到,在没有买卖信号的地方也有已经满足开仓的bar
嗯不错不错