一般实现逻辑:
第一步:指定初始样本,将盘前可提取到的指标及条件放到循环前计算,提高盘中循环效率
第二步:循环样本,计算条件指标值,并进行判断过滤
盘中实时行情,推荐rd取数(优点:即时性强,缺点:不能用于历史指定时间,只能用于盘中)
第三步:存放过滤后的数据结果,根据需求组织展示结构
示例:在盘中实现每10秒运行一下,实时选出符合条件的个股列表
注:仅适合在当日开盘后运行
//第一步:指定初始样本,将盘前可提取到的指标及条件放到循环前计算,提高盘中循环效率
stocks:=getbk("A股");
//--在循环监控前获取与盘中无关的指标---提交监控时的运行效率
setsysparam(pn_cycle(),cy_day());
setsysparam(pn_date(),now());
//注:由于开盘前未开始交易时,当前时间会显示为上个交易日
NowDay:=spec(sp_time(),"SH000001");
if NowDay<today() then return "今日还未开盘,请稍后再试~";//此时未开盘,防止运行获取到错位数据
//--如:获取代码名称、昨收、提前过滤掉当日不交易的证券等
Arr:=select thisrow as '代码',stockname(thisrow) as '名称',
spec(SectionPrevClose(),thisrow) as "昨收",
spec(ref(EMA(close(),5),1),thisrow) as "5日均价",//用的移动平均
spec(open(),thisrow) as "开盘价"
from stocks
where spec(istradeday(today()),thisrow)
end;
Arr:=select *,100*(["开盘价"]/["昨收"]-1) as "开盘涨幅(%)" from Arr end;
//--开盘时条件筛选:只跟踪开盘涨幅为正的样本
Arr_:=select * from Arr where ["开盘涨幅(%)"]>0 end;
//盘中循环监控
T0:=StrToTime('15:01:00');
repeat //使用repeat循环使选股过程至少能执行一次
//第二步:循环样本,计算条件指标值,并进行判断过滤
r:=array(); k:=0;
for i:=0 to length(Arr_)-1 do
begin
setsysparam(pn_stock(),Arr_[i,"代码"]);
c:=rd(6);//当前最新价
if c<Arr_[i,"5日均价"] then continue;//去掉小于5日均价的
zf:=100*(c/Arr_[i,"昨收"]-1);//盘中实时涨幅
if zf<6 then continue;//去掉涨幅小于6%的
amt:=rd(7);//当前成交金额
if amt<5*100000000 then continue;//去掉成交额小于5亿的
//第三步:存放过滤后的数据结果,根据需求组织展示结构
r[k]:=Arr_[i];
r[k,"价格"]:=c;
r[k,"当前涨幅(%)"]:=zf;
r[k,"成交额"]:=amt;
k++;
end;
r::=ifnumber(mcell)?roundto(mcell,-2):mcell;//保留2位小数
r:=select * from r order by ["当前涨幅(%)"] end;//排序
sendrunningdata(r,"盘中实时选股"); //在数据窗口中返回筛选结果
sleep(10*1000); //10秒刷一次
until TimeOf(Now())> T0;//超过指定时间则结束循环
return "已收盘";
运行结果展示:
