在1秒周期下大于日线开盘价10个点就做多小于就做空,bar数量一多开平信号就会出错
上面是代码,可以复现,就是简单的在1秒周期下,大于日开盘价+3个点做多,小于开盘价3个点做空。尾盘清仓。图表信号经常会出错,例如黄金,2023年7月11日 图表信号显示出错,多重启机次TBQ又能恢复正常。经过客服远程帮助,客服说是:bar数不同导致了正常和不正常, 5万bar 调到2万bar 同一时间的历史信号就改变了。本来开仓5-6次,会开仓几百上千次。
因为你用了opend函数
这个函数是用单元图层目前的数据去推算日线数据
你如果是秒线,一分钟60根,一小时3600根,黄金一天算9个小时,32400根bar。
如果你设置五万根,那么当前的交易数据是全的,可以正确的得到opend结果
如果你设置两万根,那么小于黄金一天的数据,那么交易数据就不全,就得不到正确的opend结果,导致你信号全部错乱。
opend这个函数是开源的,你用之前应该先明确好这个函数的算法。
//------------------------------------------------------------------------
// 简称: gpc_20230705
// 名称: gpc_20230705
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
Params
Numeric lots(1);
Numeric stopzs(3);//大于小于开盘价多少点位开仓
Numeric stopzy(0.8); //盈利开盘价的百分比止盈
numeric zy(48); //止盈跳数
Vars
Numeric MinPoint;
Events
OnInit()
{
array<Numeric> timepoint;
timepoint[0] = 0.145700;
SetTriggerBarClose(timepoint);
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
MinPoint = MinMove * PriceScale;
If(MarketPosition <> 1 && close[1] >= (OpenD(0) + stopzs*MinPoint) )
{
buy(lots,Open);
Commentary(\"开多单\");
}
If(MarketPosition <> -1 && close[1] <= (OpenD(0) - stopzs*MinPoint) )
{
SellShort(lots,Open);
Commentary(\"开空单\");
}
}
//下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组
OnBarClose(ArrayRef<Integer> indexs)
{
if(time == 0.145700)
{
sell(0,close);
BuyToCover(0,close);
switchnum = 0;
Commentary(\"收盘平仓\");
}
}
听起来没什么头绪,要实际勘察