以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://222.73.7.161/bbs/index.asp) -- 公式模型编写问题提交 (http://222.73.7.161/bbs/list.asp?boardid=4) ---- 如何编写?谢谢 (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=184417) |
-- 作者:苏西坡 -- 发布时间:2021/2/27 22:18:48 -- 如何编写?谢谢 qqw INPUT:SS(1,1,10000,1),X(5,1,100,1),NMIN(10,1,100,1); //中间变量 n1:=barslast(DATE<>REF(DATE,1))+1; JJX:ROUNDS(IF(sum(vol,n1)=0,C,bb1,COLORYELLOW; red:if(JJX>=bb1,JJX,drawnull),colorred; ZS:CALLSTOCK(STKLABEL,VTCLOSE,6,-1);// GD:=bb2,1);//X是参数,自行调整 DD:=bb3,1);//5k低点 T1:=TIME>OPENTIME(1) AND TIME<CLOSETIME(0)-NMIN*100; T2:=TIME>=CLOSETIME(0)-NMIN*100; 手数:=SS; //交易条件 KD:=aa1 AND CLOSE>ZS AND ss1 AND JJX>ZS AND T1 and ww and holding<=0; //开多条件 PD:=CLOSE<JJX ; //平多条件 KK:=CLOSE<DD AND CLOSE<ZS AND ee1)AND JJX<ZS AND T1 and WW AND holding>=0 ; //开空条件 PK:=CLOSE>JJX ;//平空条件 平空:SELLSHORT(PK,1,THISCLOSE); //平空信号 开多:BUY(KD AND HOLDING=0,1,THISCLOSE); //开多信号 平多:SELL(PD,1,THISCLOSE); //平多信号 开空:BUYSHORT(KK AND HOLDING=0,1,THISCLOSE); //开空信号 收盘平多:SELL(T2 AND HOLDING>0,0,MARKET) ; 收盘平空:SELLSHORT(T2 AND HOLDING<0,0,MARKET) ; 持仓:holding,linethick0; 资产:asset,noaxis; 可用现金:cash(0),linethick0; 以上编写完成后,如何加入,一天只操作两次,(开仓两次,平仓两次),然后不再开平仓,并且, 如果当天早上下午2点前只开平仓一次,超两点后,条件满足也不再开仓 谢谢 |
-- 作者:FireScript -- 发布时间:2021/3/1 9:33:04 -- 用全局变量做这种控制次数的操作。然后给所有开仓额外加一个时间条件即可。 VARIABLE:ct1:=0,ct2:=0;//2个全局变量一个控制开仓次数,一个控制平仓次数。
if TODAYBAR=1 then //每日第一个K重置全局变量。 begin ct1:=0; ct2:=0; end timecd:time<=180000;//时间限制的判断。大于2点不再开仓。 input:n(9,1,100,10),p1(3,2,40,4),p2(3,2,40,4);//参数设置 RSV:=(CLOSE-LLV(LOW,N))/(HHV(HIGH,N)-LLV(LOW,N))*100; K:=SMA(RSV,P1,1); D:=SMA(K,P2,1); J:=3*K-2*D,NODRAW; //开平条件1 kdjjc:cross(k,d),NODRAW;//kdj金叉 kdjsc:cross(d,k),NODRAW; input:p(26,20,100,8),s(12,5,40,4),m(9,2,60,6); DIFF :=EMA(CLOSE,S) - EMA(CLOSE,P); DEA :=EMA(DIFF,M); MACD1 :=2*(DIFF-DEA), COLORSTICK; //开平条件2 macdjc:cross(diff,dea),NODRAW;//macd金叉 macdsc:cross(dea,diff),NODRAW; if kdjjc and ct1<=1 and timecd and holding=0 then //开多 begin buy(holding=0,1,market); ct1:=ct1+1; end if kdjsc and ct2<=1 and holding>0 then //平多 begin sell(holding>0,holding,market); ct2:=ct2+1; end if macdsc and ct1<=1 and timecd and holding=0 then //开空 begin buyshort(holding=0,1,market); ct1:=ct1+1; end if macdjc and ct2<=1 and holding<0 then //平空 begin sellshort(holding<0,holding,market); ct2:=ct2+1; end 这部分代码为例。核心思路都实现在上面代码里了。 |
-- 作者:苏西坡 -- 发布时间:2021/3/1 11:49:40 -- 是否正确? ct1:=0; ct2:=0; 表示开平仓次数为0? 下面用到的ct1:=ct1+1; / ct2:=ct2+1; 表示,开平仓次数为2,如果把次数变为开平仓3次,那么就是ct1:=ct1+2; / ct2:=ct2+2、、、、是否正确? 谢谢 |
-- 作者:FireScript -- 发布时间:2021/3/1 11:57:20 -- 1. "ct1:=0; ct2:=0; 表示开平仓次数为0?"是这意思。 2. “if kdjjc and ct1<=1 and timecd and holding=0 then //开多” 你要改变次数 改这里的判断就行了。而不是修改统计的方式。
|
-- 作者:苏西坡 -- 发布时间:2021/3/1 12:16:19 -- 我改完后,还是没变化,哪里错了 dm:=4-INTPART(LOG(C)); timecd:time<=142000;//时间限制的判断。大于2点不再开仓。 //中间变量
JJX:xxxxxxxxxx;//日内均价线 ZS:/xxxxxxxx;//昨收 EMA11:xxxxx; 大通xx:xxxxx;//X是参数,自行调整
KD:=xxxxxxx and holding<=0; //开多条件 if kd and ct1<=1 and timecd and holding=0 then //开多 if PD and ct2<=1 and holding>0 then //平多 if kk and ct1<=1 and timecd and holding=0 then //开空 if pk and ct2<=1 and holding<0 then //平空
持仓:holding,linethick0; |
-- 作者:FireScript -- 发布时间:2021/3/1 12:25:01 -- 你贴一个能编译通过的代码吧。 你上面这样的 我没办法本地测试的。 |
-- 作者:苏西坡 -- 发布时间:2021/3/1 17:07:02 -- 以下是引用FireScript在2021/3/1 12:25:01的发言:
你贴一个能编译通过的代码吧。 你上面这样的 我没办法本地测试的。 INPUT:SS(1,1,10000,1),X(1,1,100,1),NMIN(10,1,100,1); VARIABLE:ct1:=0,ct2:=0;//2个全局变量一个控制开仓次数,一个控制平仓次数。
timecd:time<=180000;//时间限制的判断。大于2点不再开仓。 //收盘前平仓 input:n(9,1,100,10),p1(3,2,40,4),p2(3,2,40,4);//参数设置 input:p(26,20,100,8),s(12,5,40,4),m(9,2,60,6);
if kdjsc and ct2<=1 and holding>0 then //平多
if macdjc and ct2<=1 and holding<0 then //平空 平空:SELLSHORT(kdjsc,1,THISCLOSE); //平空信号 持仓:holding,linethick0; |
-- 作者:FireScript -- 发布时间:2021/3/2 9:45:31 -- 这几句删除掉。 平空:SELLSHORT(kdjsc,1,THISCLOSE); //平空信号 开多:BUY(kdjjc AND HOLDING=0,1,THISCLOSE) and TOTALDAYTRADE<2; //开多信号 平多:SELL(macdsc,1,THISCLOSE); //平多信号 开空:BUYSHORT(macdsc AND HOLDING=0,1,THISCLOSE)and TOTALDAYTRADE<2 ; //开空信号 因为前面的那部分代码 就是包含这部分的开仓思路了。并且在if里面设置了控制的逻辑。你这几句写上去就等于是不在控制逻辑范围内了。 我本地大致效果: |