以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (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=181238) |
-- 作者:OscarDeng -- 发布时间:2020/7/16 14:26:28 -- 后台程序化交易的调用 后台程序化的函数一般解决算法交易, 就是开空开多等要如何避免滑点, 一般我是在图表程序化设计测试好, 然后加上后台程序化函数来交易。但是我的后台开空开多平空平多的程序都是一样的, 因为每个程序有很多开空开多点, 能把后台程序化写成一个函数, 我要开空的时候直接调用该函数吗? 而且我两个程序调用下面的后台程序化函数返回值会返回自己的数值吗? 我的后台程序化源代码: 持仓限制:=min(持仓手数, max(1,intpart(openint*持仓比例/100))); EMA_VolDay:=STKINDI(\'\',\'VOL.MA1(5,10,20)\',0,6,-1)*成交量比例/1000;//找昨天的成交量5日均线量, 再乘以成交量比例 多头保证金:C*TACCOUNT(41);// 是多头保证金率; 空头保证金:C*TACCOUNT(42);// 是空头保证金率; 多头开仓资金数:intpart(1000000/(C*TACCOUNT(41)*multiplier)*资金占比/100);//是资金占比, 例如10, 就是占用资金100W占比10%, 动用了保证金10W 多头开仓数:MIN(min(多头开仓资金数,min(EMA_VolDay, 持仓限制)),限仓*0.1); 空头开仓资金数:intpart(1000000/(C*TACCOUNT(42)*multiplier)*资金占比/100); 空头开仓数:MIN(min(空头开仓资金数,min(EMA_VolDay, 持仓限制)),限仓*0.1); //如果要开空, 就执行下面开空语句 //注意holding是策略的理论持仓,他不管实际仓位例如我想开单是10的, 那就用10, 100万的, 就用100. 最高就是100W。 //持仓比例和成交量的比例, 所以这两者一般不会去动, 除非是一些非主力合约 ///1.如果之前的开空持仓剩余数并且比现在空头开仓数还要多, 那就用之前的开空持仓剩余数,不需要开空。 IF TSELLHOLDINGEX(\'\',\'\',1)>=空头开仓数 THEN 空头开仓数:=TSELLHOLDINGEX(\'\',\'\',1); //2.如果有平空挂单,之前的开空持仓剩余数比现在空头开仓数少, 总空头持仓比现在开仓数要多,那就用把要撤的单取消掉。 IF TSELLHOLDINGEX(\'\',\'\',2)>=空头开仓数 AND TSELLHOLDINGEX(\'\',\'\',1)<空头开仓数 THEN BEGIN TCANCEL(TSELLHOLDINGEX(\'\',\'\',3)>0,4); 空头开仓数:=TSELLHOLDINGEX(\'\',\'\',2); END //3.总空头持仓比现在开仓数要少 IF TSELLHOLDINGEX(\'\',\'\',2)<=空头开仓数 THEN BEGIN
TCANCEL(TSELLHOLDINGEX(\'\',\'\',3)>0,4);
空头开仓数:=INTPART(空头开仓数-TSELLHOLDINGEX(\'\',\'\',1)); //3.1 达到开空条件, 先检测程序化是否平衡先, 如果是平衡状态, 开始空 IF(INTPART(空头开仓数)<1 ,1,INTPART(空头开仓数));//空头开仓数不能为0 //a.看成交量 //b.看卖一和买一的中间加个 DYNAINFO(34)卖一价;DYNAINFO(28)买一价; DYNAINFO(208)最小变动单位; //成交量比例是自己设置的, 取5日的平均数。 千分之5那么多, 建议分两次下而且用加仓的方式来操作。 //a1 IF 空头开仓数>=80 or 成交量比例>=4 THEN BEGIN //a1b1
IF DYNAINFO(34)-DYNAINFO(28)>3*DYNAINFO(208) THEN
BEGIN
TBUYSHORT(1,空头开仓数/8,LMT,DYNAINFO(34)+DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,空头开仓数/8,LMT,DYNAINFO(34)),NOATTACK;
TBUYSHORT(1,空头开仓数/8,LMT,DYNAINFO(34)-DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,空头开仓数/8,LMT,DYNAINFO(34)-2*DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,空头开仓数/8,LMT,DYNAINFO(34)-3*DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,空头开仓数/8,LMT,DYNAINFO(28)+3*DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,空头开仓数/8,LMT,DYNAINFO(28)+2*DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,空头开仓数/8,LMT,DYNAINFO(28)+DYNAINFO(208)),NOATTACK; END //a1b2 IF DYNAINFO(34)-DYNAINFO(28)>DYNAINFO(208) AND DYNAINFO(34)-DYNAINFO(28)<=3*DYNAINFO(208) THEN
BEGIN
TBUYSHORT(1,空头开仓数/4,LMT,DYNAINFO(34)+DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,空头开仓数/4,LMT,DYNAINFO(34)),NOATTACK; TBUYSHORT(1,空头开仓数/4,LMT,DYNAINFO(34)-DYNAINFO(208)),NOATTACK; TBUYSHORT(1,空头开仓数/4,LMT,DYNAINFO(28)+DYNAINFO(208)),NOATTACK; END //a1b3 IF DYNAINFO(34)-DYNAINFO(28)=DYNAINFO(208) THEN BEGIN
IF DYNAINFO(25)>DYNAINFO(31) THEN
BEGIN //DYNAINFO(31) 是卖一量, DYNAINFO(25) 是买一量,DYNAINFO(34)卖一价;DYNAINFO(28)买一价;
TBUYSHORT(1,空头开仓数/3,LMT,DYNAINFO(34)+DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,2*空头开仓数/3,LMT,DYNAINFO(34)),NOATTACK;
END IF DYNAINFO(25)<DYNAINFO(31) THEN BEGIN
TBUYSHORT(1,空头开仓数/2,LMT,DYNAINFO(34)),NOATTACK;
TBUYSHORT(1,空头开仓数/2,LMT,DYNAINFO(28)),NOATTACK;
END END END //a2 IF 空头开仓数<80 AND 空头开仓数>=12 AND 成交量比例<4 OR 成交量比例>=2 AND 成交量比例<4 THEN BEGIN //a2b1 IF DYNAINFO(34)-DYNAINFO(28)>3*DYNAINFO(208) THEN
BEGIN
TBUYSHORT(1,空头开仓数/3,LMT,DYNAINFO(28)+3*DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,空头开仓数/3,LMT,DYNAINFO(28)+2*DYNAINFO(208)),NOATTACK;
TBUYSHORT(1,空头开仓数/3,LMT,DYNAINFO(28)+DYNAINFO(208)),NOATTACK; END //a2b2 IF DYNAINFO(34)-DYNAINFO(28)>DYNAINFO(208) AND DYNAINFO(34)-DYNAINFO(28)<=3*DYNAINFO(208) THEN
BEGIN
TBUYSHORT(1,空头开仓数/3,LMT,DYNAINFO(34)),NOATTACK; TBUYSHORT(1,空头开仓数/3,LMT,DYNAINFO(34)-DYNAINFO(208)),NOATTACK; TBUYSHORT(1,空头开仓数/3,LMT,DYNAINFO(28)+DYNAINFO(208)),NOATTACK; END //a2b3 IF DYNAINFO(34)-DYNAINFO(28)=DYNAINFO(208)THEN BEGIN//DYNAINFO(31) 是卖一量, DYNAINFO(25) 是买一量,DYNAINFO(34)卖一价;DYNAINFO(28)买一价; DYNAINFO(208)最小变动单位;
IF DYNAINFO(25)>DYNAINFO(31) THEN
BEGIN
TBUYSHORT(1,空头开仓数*2/3,LMT,DYNAINFO(34)),NOATTACK;
TBUYSHORT(1,空头开仓数/3,LMT,DYNAINFO(28)),NOATTACK;
END
IF DYNAINFO(25)<DYNAINFO(31) THEN
BEGIN
TBUYSHORT(1,空头开仓数/3,LMT,DYNAINFO(34)),NOATTACK;
TBUYSHORT(1,空头开仓数*2/3,LMT,DYNAINFO(28)),NOATTACK;
END // IF DYNAINFO(25)>DYNAINFO(31) THEN TBUYSHORT(1,空头开仓数,LMT,DYNAINFO(34)),NOATTACK;
//
IF DYNAINFO(25)<DYNAINFO(31) THEN TBUYSHORT(1,空头开仓数,LMT,DYNAINFO(28)),NOATTACK;
END END //a3 IF 空头开仓数<12 AND 空头开仓数>3 AND 成交量比例<=2 THEN //注意holding是策略的理论持仓,他不管实际仓位 BEGIN //a3b1 IF DYNAINFO(34)-DYNAINFO(28)>=2*DYNAINFO(208) THEN
BEGIN TBUYSHORT(1,空头开仓数/2,LMT,DYNAINFO(34)-DYNAINFO(208)),NOATTACK; TBUYSHORT(1,空头开仓数/2,LMT,DYNAINFO(28)+DYNAINFO(208)),NOATTACK; END //a3b2 IF DYNAINFO(34)-DYNAINFO(28)=DYNAINFO(208) THEN BEGIN //DYNAINFO(31) 是卖一量, DYNAINFO(25) 是买一量,DYNAINFO(34)卖一价;DYNAINFO(28)买一价; IF DYNAINFO(25)>DYNAINFO(31) THEN TBUYSHORT(1,空头开仓数,LMT,DYNAINFO(34)),NOATTACK;
IF DYNAINFO(25)<DYNAINFO(31) THEN TBUYSHORT(1,空头开仓数,LMT,DYNAINFO(28)),NOATTACK; END END //a4 IF 空头开仓数<=3 AND 成交量比例<=1 THEN BEGIN //DYNAINFO(31) 是卖一量, DYNAINFO(25) 是买一量,DYNAINFO(34)卖一价;DYNAINFO(28)买一价; //IF DYNAINFO(25)>DYNAINFO(31) THEN TBUYSHORT(1,空头开仓数,LMT,DYNAINFO(34));
//IF DYNAINFO(25)<DYNAINFO(31) THEN TBUYSHORT(1,空头开仓数,LMT,DYNAINFO(28)); //a4b1 IF DYNAINFO(34)-DYNAINFO(28)>=2*DYNAINFO(208) THEN
BEGIN IF DYNAINFO(25)>DYNAINFO(31) THEN TBUYSHORT(1,多头开仓数,LMT,DYNAINFO(34)-DYNAINFO(208));
IF DYNAINFO(25)<DYNAINFO(31) THEN TBUYSHORT(1,多头开仓数,LMT,DYNAINFO(28)+DYNAINFO(208)); END //a4b2
IF DYNAINFO(34)-DYNAINFO(28)=DYNAINFO(208) THEN
BEGIN
IF DYNAINFO(25)>DYNAINFO(31) THEN TBUYSHORT(1,多头开仓数,LMT,DYNAINFO(34));
IF DYNAINFO(25)<DYNAINFO(31) THEN TBUYSHORT(1,多头开仓数,LMT,DYNAINFO(28)); END END END |
-- 作者:FireScript -- 发布时间:2020/7/16 15:08:22 -- “能把后台程序化写成一个函数, 我要开空的时候直接调用该函数吗” 这个是不行的。 你只能直接运行这个后台程序。 |
-- 作者:OscarDeng -- 发布时间:2020/7/16 22:16:09 -- 也就是如果我在某个程序有8次开空, 那这8次 的开空程序都要加上这段算法交易上去? |
-- 作者:FireScript -- 发布时间:2020/7/17 8:56:23 -- 是的。引用通常是引用纯粹的计算指标或者图表模型会比较稳定。 |