以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (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编辑过]