以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (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=176191) |
-- 作者:Amoresvoce -- 发布时间:2020/5/21 17:00:34 -- [求助]编写求助红色//后括号部分是问题 input:inATR(14,1,100,1),risk(1,0,3,0.1),m(5,0,5,1),db(1,0.1,100,0.1); //risk风险,m是ATR比例,inATR日数,db品种最小波动 VARIABLE:n=0; rATR:=MA(ref(tr,1),inATR); CYC:=BARSLAST(DATE<>REF(DATE,1))+1; //OPP:=VALUEWHEN(CYC=1,OPEN); OPP:=ref(open,barslast(todaybar=1));//开盘价 buyo:=OPP+(INTPART(rATR/m/db))*db;//开盘价+浮动区间上轨 sello:=OPP-(INTPART(rATR/m/db))*db;//开盘价+浮动区间下轨 lotst:asset*risk*0.005/(rATR*multiplier),linethick0; lots:=if(risk=0,1,lotst); //如果risk取0,表示固定开1手 T1:=TIME>090000 AND TIME <145500; T2:=TIME>=145800;//需要加入交易时间限制来防止结尾开两次仓位 //(这里的时间设置的是早上开盘那怎么改成当天生成的第一根k线呢?、或者晚上9:30-第二天15:00,以及停了夜盘也不受影响的写法) tbc:=h <> l;//判断是否停板 if holding=0 and tbc then //不是停板才可以交易 (有时候) begin if h > buyo and n<2 and T1 then //开多 begin buyp:=max(o,buyo); buy(1,lots,limitr,buyp);//(买入的价格并不是设计的价格设计的是开盘价+atr/5为上轨买点,但是这个测试的时候完全不对,比如测试棕榈连续,2.4日显示买入价为5510,2.5日显示买入价为5641) n:=n+1; end;//开多结束 else if l < sello and n<2 and T1 then //开空 begin sellp:=min(o,sello); buyshort(1,lots,limitr,sellp); n:=n+1; end; if time=CLOSETIME(0)then n:=0;//清空交易次数限定 end;//holding=0 if holding>0 and tbc then //已有多仓 begin exitlongp:=enterprice-2*rATR/m; //两倍百分比ATR止损 if l <exitlongp and enterbars <>0 or T2 then //出场 begin sell(1,0,MARKETR); end;//出场 end;//else begin if holding<0 and tbc then //已有空仓 begin exitlongp:=enterprice+2*rATR/m; if h >exitlongp and enterbars <>0 or T2 then //出场 begin sellshort(1,0,MARKETR); end;//出场 end;//else end;//holding<0 持仓:holding,linethick0; 资产:asset,noaxis; 可用现金:cash(0),linethick0;
[此贴子已经被作者于2020/5/21 17:02:30编辑过]
|
-- 作者:FireScript -- 发布时间:2020/5/21 17:10:00 -- 1.“(这里的时间设置的是早上开盘那怎么改成当天生成的第一根k线呢?、或者晚上9:30-第二天15:00,以及停了夜盘也不受影响的写法)” 这是要做什么样的时间限制?限制交易时间还是限制要在白盘收盘平仓?你重新描述下这个逻辑。 2.“//(买入的价格并不是设计的价格设计的是开盘价+atr/5为上轨买点,但是这个测试的时候完全不对,比如测试棕榈连续,2.4日显示买入价为5510,2.5日显示买入价为5641)” 什么周期上的运行结果。
|
-- 作者:Amoresvoce -- 发布时间:2020/5/21 17:15:33 -- 日内1分钟 |
-- 作者:Amoresvoce -- 发布时间:2020/5/21 17:21:51 -- 问题1:这个主要是想确定开盘价,以夜盘开盘价为准,之前是设置了一个区间,但是考虑到有时候没有夜盘,怕有影响 |
-- 作者:Amoresvoce -- 发布时间:2020/5/21 17:23:09 -- 第一次提交的时候没有预览 结果字看不清,第二次编辑一直显示审核 不好意思 |
-- 作者:FireScript -- 发布时间:2020/5/21 17:32:44 -- 如果要取第一个K的开盘价可以用ref(o,TODAYBAR)。有夜盘取到夜盘的,没有则取到白盘的 。你可以试下。
|
-- 作者:Amoresvoce -- 发布时间:2020/5/21 17:55:30 -- input:inATR(14,1,100,1),risk(1,0,3,0.1),m(5,0,5,1),db(2,0.1,100,0.1); //risk风险,m是ATR比例,inATR日数,db品种最小波动 VARIABLE:n=0; rATR:=MA(ref(tr,1),inATR); CYC:=BARSLAST(DATE<>REF(DATE,1))+1; //OPP:=VALUEWHEN(CYC=1,OPEN); OPP:=ref(o,TODAYBAR); buyo:=OPP+(INTPART(rATR/m/db))*db;//开盘价+浮动区间上轨 sello:=OPP-(INTPART(rATR/m/db))*db;//开盘价+浮动区间下轨 lotst:asset*risk*0.005/(rATR*multiplier),linethick0; lots:=if(risk=0,1,lotst); //如果risk取0,表示固定开1手 //T1:=TIME>090000 AND TIME <145500; T2:=TIME>=145800;//需要加入交易时间限制来防止结尾开两次仓位 tbc:=h <> l;//判断是否停板 if holding=0 and tbc then //不是停板才可以交易 begin if h > buyo and n<2 then //开多 begin buyp:=max(o,buyo); buy(1,lots,limitr,buyp); n:=n+1; end;//开多结束 else if l < sello and n<2 then //开空 begin sellp:=min(o,sello); buyshort(1,lots,limitr,sellp); n:=n+1; end; if time=CLOSETIME(0)then n:=0;//清空交易次数限定 end;//holding=0 if holding>0 and tbc then //已有多仓 begin exitlongp:=enterprice-2*rATR/m; //两倍百分比ATR止损 if l <exitlongp and enterbars <>0 or T2 then //出场 begin sell(1,0,MARKETR); end;//出场 end;//else begin if holding<0 and tbc then //已有空仓 begin exitlongp:=enterprice+2*rATR/m; if h >exitlongp and enterbars <>0 or T2 then //出场 begin sellshort(1,0,MARKETR); end;//出场 end;//else end;//holding<0 持仓:holding,linethick0; 资产:asset,noaxis; 可用现金:cash(0),linethick0; //你好,改成了以后,出现了新问题,没改前2.4日是做多但是不知道为什么现在变成做空了,设计是做多,而且价格问题依然没有改变,不是open±ATR/5这个上下轨
|
-- 作者:FireScript -- 发布时间:2020/5/22 9:25:04 -- 1. 开仓价 是buyp:=max(o,buyo); 取这个buyo和开盘价的最高价。如果不是buyo那就是开仓K的开盘价。 2.(INTPART(rATR/m/db))*db 这个值恒为0. 不知道你原本思路是怎样的。反正这个直接全是0. 3.至于信号变成了开空这个,代码里面你只是改了取值的方式。影响到信号的只有K线数据的起点位置可能会影响到。你改的那个不影响整体逻辑。 |
-- 作者:Amoresvoce -- 发布时间:2020/5/22 13:08:16 -- 1.是这个设计思路,价格大于等于上轨用buyo,开盘价跳空高开用开盘价。 2.这个值是想取前14日ATR的m分之一,然后按可交易价格取整来,开盘价加减这个值设置交易上下轨(最小跳动价位DB是自己手动设置的,最小跳动价格可以自动跟踪品种自己变吗?、),(INTPART(rATR/m/db))*db不是很明白为啥是0,请问一下应该改成什么样呢?、 3.改成OPP:=ref(o,TODAYBAR)有点问题,感觉这个第一根K线的取值时间点有点问题,我使用原先的OPP:=VALUEWHEN(CYC=1,OPEN)这个,2.4日棕榈是正常做多,这个先不考虑了 我还是按原来的再多加入一段时间来限制交易时间段好了。 设置了时间段的,(INTPART(rATR/m/db))*db这个值不知道应该怎么修改。 input:inATR(14,1,100,1),risk(1,0,3,0.1),m(5,0,5,1),db(2,0.1,100,0.1); //risk风险,m是ATR比例,inATR日数,db品种最小波动 VARIABLE:n=0; rATR:=MA(ref(tr,1),inATR); CYC:=BARSLAST(DATE<>REF(DATE,1))+1; OPP:=VALUEWHEN(CYC=1,OPEN); //OPP:=ref(o,TODAYBAR); buyo:=OPP+(INTPART(rATR/m/db))*db;//开盘价+浮动区间上轨 sello:=OPP-(INTPART(rATR/m/db))*db;//开盘价+浮动区间下轨 lotst:asset*risk*0.005/(rATR*multiplier),linethick0; lots:=if(risk=0,1,lotst); //如果risk取0,表示固定开1手 T1:=TIME>090000 AND TIME <145500;//开仓时间 T2:=TIME>213000 AND TIME <230000;//开仓时间 T3:=T1 OR T2; T4:=TIME>=145800;//需要加入交易时间限制来防止结尾开两次仓位 tbc:=h <> l;//判断是否停板 if holding=0 and tbc then //不是停板才可以交易 begin if h >= buyo and n<2 and T3 then //开多 begin buyp:=max(o,buyo); buy(1,lots,limitr,buyp); n:=n+1; end;//开多结束 else if l <= sello and n<2 then //开空 begin sellp:=min(o,sello); buyshort(1,lots,limitr,sellp); n:=n+1; end; if time=CLOSETIME(0)then n:=0;//清空交易次数限定 end;//holding=0 if holding>0 and tbc then //已有多仓 begin exitlongp:=enterprice-2*rATR/m; //两倍百分比ATR止损 if l <exitlongp and enterbars <>0 or T4 then //出场 begin sell(1,0,MARKETR); end;//出场 end;//else begin if holding < 0 and tbc then //已有空仓 begin exitlongp:=enterprice+2*rATR/m; if h > exitlongp and enterbars <> 0 or T4 then //出场 begin sellshort(1,0,MARKETR); end;//出场 end;//else end;//holding<0 持仓:holding,linethick0; 资产:asset,noaxis; 可用现金:cash(0),linethick0; |
-- 作者:FireScript -- 发布时间:2020/5/22 13:49:46 -- 为0 是因为经过取值之后的缘故。这个rATR的值基本都小于10,再除5,再加上取整。最终导致值变成0. 这个地方你应该输出看下你这里的rATR的值。都不大。 所以你这里估计要调整下思路了。比如调整下M值,M太大,atr则太小。
[此贴子已经被作者于2020/5/22 13:50:20编辑过]
|