目前来说,对于股票交易,市面上的量化软件还没有真正的接口级别的自动交易,本人目前借助自制的一个中间软件,接收某魔方软件传过来的公式信号,按照某魔方软件传过来的证券代码和价格与及数量(或者买入金额),自动下单到券商的同花顺核新下单终端里,基本实现准确的静默模式的自动交易.
● 将选股公式改写一下,将原来用于预警的买入信号的条件当做触发开关,该条件满足后。中间软件就会接收到这个信号按照指定的代码价格数量进行买卖委托。
●通常软件选股公式只能将符合条件的股票全部选出来,不能对选出的股票再做进一步的横向对比,择优买入。这是个难题,也是一个好问题!尤其是在每天选出股票数量比较多的选股公式上更加明显。有些公式信号质量比较好,入场信号点也很优越,不过就是全市场选出的股票太多,以至于没有实盘可操作性。这个问题大家怎么解决呢,估计大部分人在这里就卡住了,可能就要人工加以二次筛选了,这样就不能真正的实现自动交易嗲。
我是怎么解决的呢?
我是这样,将原始的选股公式选出的股票不分优劣凡是符合信号的都选到一个板块,这个可以利用金魔方的独有函数AddToBlock完成,做一个例子讲解吧。(下面内容涉及的代码只是讲解的例子程序,不能依此作为投资决策)
比如,我的选股公式:
选股公式名:金叉多头
公式代码:
buytj1:=cross(ma(c,5),ma(c,10));
buytj2:=ma(c,10)>ma(c,30);
选股:buytj1 and buytj2;
复制代码运行代码
我将这个选股公式改写一下:
buytj1:=cross(ma(c,5),ma(c,10));
buytj2:=ma(c,10)>ma(c,30);
选股:buytj1 and buytj2;
if 选股 then AddToBlock(STKLABEL,FormulaName);
复制代码运行代码
加上的这句就是将符合条件的股票实时的加入到一个自定义板块,板块名字和选股公式名字相同(便于区别不同选股公式选出的股票),其实很多信号需要收盘的时候才能确定的,如果怕信号闪烁,盘中可能有些股票当天曾经有过信号但是会时有时无信号的,这个我加入下面代码作后续的监控和剔除:
IF INBLOCK (FormulaName) AND 选股=0 THEN begin DELETEFROMBLOCK(STKLABEL,FormulaName);
复制代码运行代码
经过这样的改写后,将这个公式设为金魔方的预警公式,启动预警,每天就会将符合信号的股票在悄悄的选出并加入到和选股公式同名的板块里,打开这个板块,就能看到所有预警所得的股票。
如果需要每天第一次启动这个预警时,先清空板块,在选股公式前面还要加上清理板块的代码,也很简单:
if getglobalvar(FormulaName+'清理')<>CurrentDate and IsLastBar Then
begin
SetGlobalVar(FormulaName+'清理',CurrentDate);
for $i=1 to STKCOUNT(FormulaName) Do
Begin
DELETEFROMBLOCK (STKFROMBLK(FormulaName,1) ,FormulaName);
end;
end;
复制代码运行代码
好了,上面的代码解决了选股到板块的需要。
现在说说,怎么在选出的股票里择优执行交易,也就是当选出很多股票时,怎么用另一个指标对这些股票进行排序,将排在指定位置的股票买入,其他的不做买入(当然,这个排序在盘中也是动态变化的,但是你可以进一步加入代码限制你需要的时点才去排序才去执行买入)
比如,我用当日涨幅对这些个股票进行排序,只买入所有选出的股票涨幅前5位的。新建一个指标公式(注意,是指标公式,不是选股公式):
公式名:今日涨幅
公式代码:
ZF:100*(close-ref(c,1))/ref(c,1);
复制代码运行代码
将这个指标保存后供下面的真正去执行买卖股票的公式调用。
然后,真正触发执行买卖操作的公式如下:
公式名:金叉多头_执行
公式代码:
#Run_By_Serie
#Run_Every_Tick
VARIABLEs:kcbar[200](0),hcbar[200](0);
盘中:=between(currenttime,SESSIONSTARTTIME(1),SESSIONENDTIME(1)) or between(currenttime,SESSIONSTARTTIME(2),SESSIONENDTIME(2));
if IsLastBar then
begin
vark:STKCOUNT(StrLeft(FormulaName,StrLen(FormulaName)-3)),LineThick0;
for $i=1 to min(200,vark) Do
begin
varlh:=RefIndi(STKFROMBLK(StrLeft(FormulaName,StrLen(FormulaName)-3),$i),'今日涨幅.ZF',p_day,0);
kcbar[$i]:=varlh[0];
hkcbar[$i]:=varlh[0];
end;
varsort:=sort(hkcbar,1,1,vark);
varpos:=Sortpos(kcbar,1,1,vark);
strtk:='';
for ik=1 to min(200,vark) Do
begin
hdai:=STKFROMBLK(StrLeft(FormulaName,StrLen(FormulaName)-3),kcbar[ik]);
ingZF:=hkcbar[ ik];
//////// ///////////// 推送信号
if ik<=5{推送涨幅排序前五} and 盘中 and ingZF<5{涨幅不超过5%才推送} and getglobalvar(StrLeft(FormulaName,StrLen(FormulaName)-3)+STKNAMEEX (hdai)+'t')=0 Then
begin
if WeekDayOfDate ( currentdate)<>6 and WeekDayOfDate ( currentdate)<>0 then
begin
存时:=SetGlobalVar(StrLeft(FormulaName,StrLen(FormulaName)-3)+STKNAMEEX (hdai)+'t', if(DataPeriod>=P_Day,Date,date*10000+Hour*100+Minute));
end;
buyy:=SENDYJ('192.168.0.1','717','主的宽恕','■'+'交易信号:'+StrLeft(FormulaName,StrLen(FormulaName)-3),hdai,STKNAMEEX (hdai),'.1'{这个到了中间软件那边就识别为按照即时的卖1价买入},NUMTOSTR (CURRENTTIME (),0)+':1'+'倍'{中间软件识别为按照设置的默认买卖金额(或者账户可用数的百分比)再乘以这个倍数进行委托}); //函数SENDYJ推送指令给中间软件执行买卖的
FILEAPPEND('C:/Documents and Settings/Administrator/桌面/'+StrLeft(FormulaName,StrLen(FormulaName)-3)+'_推送记录.doc', strright(NUMTOSTR (Month+100,0),2)+'-'+NUMTOSTR (Day,0)+' '+strright(NUMTOSTR (InTPart(currenttime/10000)+100,0),2)+':'+strright(NUMTOSTR (InTPart(currenttime/100),0),2)+':'+strright(NUMTOSTR (currenttime,0),2)+' '+hdai+'【'+STKNAMEEX (hdai)+'】'+'.1'+'元 1'+'倍');
end;
/////////////////////////////////////////
strtk:=strtk+'
'+StrRight(' '+NumToStr(ik,0),3)+') '+StrRight(hdai,6)+' '+strleft(STKNAMEEX (hdai)+' ',if(StrLen(STKNAMEEX (hdai))=4,4,8-StrLen(STKNAMEEX (hdai))+1))+' '+NumToStr(hkcbar[kcbar[ik]],2)+'%';
end;
end;
DrawTextEx(islastbar,1,10,10,strtk),Color1;
复制代码运行代码
将上面这个代码保存成指标公式,在任意品种的K线下加载,同时启动上文所讲的条件选股公式的金魔方预警,就能实现选股后再行排序的实盘自动买卖
注:文中提及的中间软件、DLL及其相关函数本贴不做共享,主要是因为纯个人软件,不想大范围共享,只是提供一个思路给有能力DIY的人去实现
上一篇:哥要起涨源码附图 下一篇:再次成功阻击一个月4万不是梦~~~实战主图源码