以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  [求助]期权交易时,把50ETF引入平开仓条件的问题  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=164831)

--  作者:zhuwenjie
--  发布时间:2018/8/9 15:45:30
--  [求助]期权交易时,把50ETF引入平开仓条件的问题
谢谢各位老师 小白我在尝试编写关于期权交易的策略
目前先通过图标交易在做测试,过程中遇到两个问题

一个是关于平开仓条件的,虽然交易和监控标的是期权,但是我需要引用510050的历史数据,为的是在做历史测试时,期权K线和50ETF的k线数据的时间同步,我用了callstock函数,不过这个数据似乎只能引用最新的50etf数据,不知道如何是好了

另外一个问题是我的止损条件,我买卖的标的是期权,但是想要根据开仓后,50ETF的变化程度来决定是否止损,这就需要把开仓时50ETF的价格记录下来,设为暂时的常数,然后放到止损的条件函数里去。并且每次开仓时,都需要根据新的开仓点位记录新的50ETF点位,不知道什么函数或者什么样的代码可以做到这样的要求
 
最后,关于第二个问题,不知道后台程序化交易中如何做到?
谢谢!

--  作者:FireScript
--  发布时间:2018/8/9 17:12:32
--  
 callstock  最后一个参数是一个偏移,比如偏移量-1 表示调用上一个指定周期的值。这个周期对应的是callstock里面设置的那个周期。这样就可以调用历史的值了。

如果是图表交易,上次开仓价使用:ENTERPRICE  如果需要更进一步精细的记录,可以考虑使用全局变量来处理 VARIABLE

--  作者:zhuwenjie
--  发布时间:2018/8/10 9:12:32
--  
callstock是读取的标的最新价吗?或者说最后一根K线么?还是读取的每根k线的历史值?我自己试下来似乎是最新值?
另外期权策略交易的是期权标的 enterprice也是期权的成交价 但是策略需要监控的是50ETF的价格。所以也无法实现。。图片点击可在新窗口打开查看
(顺便说一句,=OPOBYPRIRCE函数在图标交易时,如果界面不是期权,而是例如50ETF等标的,它的赋值就会变成-1;在期权标的界面则会正常运行,这是因为跨行情系统所导致的么?)

最后请问老师能示范一下variable在这个策略里的用法思路么 
难点是:我交易的标的是期权,但是需要监控的对象是50ETF 怎么做才能做到测试历史K线时,读取的50ETF数据也是当时的历史数值。
谢谢图片点击可在新窗口打开查看图片点击可在新窗口打开查看


--  作者:FireScript
--  发布时间:2018/8/10 9:32:02
--  
 1.callstock  并不是只能引用最新的数据。 金字塔引用数据是K线对齐的,如果你在日线A品种上引用日线B品种数据,假设没有偏移量,那么A上引用的就是和A k线时间对应的B品种的数据。 引用的数据的情况也是基于你当前K的位置的,这点要明确。
我想知道你代码是怎么写的,你说引用历史数据,具体操作思路是?比如,引用前N个K位置的历史数据?

2.  2楼原先回复有偏差。  你不需要记住某个价格,因为图表上的K线其实就是保存好的历史数据了,这时候思路不是说我保存住某个历史值,因为系统本身就保存了基本数据,而是要考虑如何去调用,引用。 你最好描述下 你引用50ETF的数据具体操作,比如:引用哪个数据 开高低收 成交量? 引用符合什么条件的数据(多少周期内最大,最小?)?




--  作者:wenarm
--  发布时间:2018/8/10 9:45:59
--  

callstock引用的是一个序列值,包含历史值。

因为enterprice这个是图表函数,返回的只能是图表历史计算中的开仓价格。如果要你的这个问题,你只能考虑使用后台,后台策略是可以获得实际交易品种的成交价格。

OPOBYPRIRCE函数只适用于期权,你也只能在期权市场下获取对应的数据。  另外后台程序化更加适合做期权自动化交易。


--  作者:zhuwenjie
--  发布时间:2018/8/10 10:25:06
--  
谢谢老师指导!图标交易找到错误在哪里了!
 这是我后台交易尝试写的函数

50c:=CALLSTOCK(\'qq510050\',VTCLOSE,1,0);    //50ETF价格(这样写显示的是最新价么?)
P:rounds(50c1*4,1)/4,linethick0;     //以0.025为区间的50ETF价格四舍五入 取得最接近的平价
if FRACPART(P*10)=0.75 or FRACPART(P*10)=0.25 THEN//取整末尾是25或者75
begin                          //因为行权价都是整数,通过上述整理, 可以求得最接近当前50ETF价格的平价期权
d1:=OPOBYPRIRCE(\'QQ510050\',P+0.125,0,1,1);     //获取比平价期权高的虚值认购期权合约
d2:=OPOBYPRIRCE(\'QQ510050\',P-0.125,1,1,1);     //获取比平价期权低的虚值认沽期权合约
end

else
begin
d1:=OPOBYPRIRCE(\'QQ510050\',P+0.15,0,1,1);     //比平值高150的认购合约
d2:=OPOBYPRIRCE(\'QQ510050\',P-0.15,1,1,1);     //比平值低150的认沽合约
end

if abs(50c-p)>=0.5 and Tholding<>0 then  //当50ETF最新价格距离上一轮成交时的平价超过0.5元时,平仓
begin
Tsellshort(1,100%,lmt,close+0.0005,0,\'\',d1),pertrader;
Tsellshort(1,100%,lmt,close+0.0005,0,\'\',d2),pertrader;
end
此处遇到问题,交易判断时,我需要的是上一次满足开仓条件时的P值(平价期权,常数)(但是这个值不是50ETF的历史价格,而是我自己公式求出来的,所以没有历史数据可以提取?),而我公式求得的平价(P值)是变量。所以无法得到正确的平仓条件。
if abs(50c-p)<=0.005 and Tholding=0 then  //当50ETF距离最新平价期权价差小于0.0005时,开仓
BEGIN
Tbuyshort(1,100,lmt,close-0.0005,0,\'\',d1);
Tbuyshort(1,100,lmt,close-0.0005,0,\'\',d2);
end



--  作者:FireScript
--  发布时间:2018/8/10 15:01:04
--  
你其实是要求上次满足平仓条件按照下列方式计算出来的P值是吗

50c:=CALLSTOCK(\'qq510050\',VTCLOSE,1,0);    //50ETF价格(这样写显示的是最新价么?)   //这里在最新K上的确是获取最新值
P:rounds(50c1*4,1)/4,linethick0;     //以0.025为区间的50ETF价格四舍五入 取得最接近的平价

--  作者:zhuwenjie
--  发布时间:2018/8/10 15:09:35
--  

是的 具体来说,应该是上次满足 开仓 条件时的P值

谢谢


--  作者:FireScript
--  发布时间:2018/8/10 15:24:31
--  
 GLOBALVARIABLE:rp:=0;//定义一个全局变量

50c:=CALLSTOCK(\'qq510050\',VTCLOSE,1,0);    //50ETF价格(这样写显示的是最新价么?)
P:rounds(50c1*4,1)/4,linethick0;     //以0.025为区间的50ETF价格四舍五入 取得最接近的平价
if FRACPART(P*10)=0.75 or FRACPART(P*10)=0.25 THEN//取整末尾是25或者75
begin                          //因为行权价都是整数,通过上述整理, 可以求得最接近当前50ETF价格的平价期权
d1:=OPOBYPRIRCE(\'QQ510050\',P+0.125,0,1,1);     //获取比平价期权高的虚值认购期权合约
d2:=OPOBYPRIRCE(\'QQ510050\',P-0.125,1,1,1);     //获取比平价期权低的虚值认沽期权合约
end

else
begin
d1:=OPOBYPRIRCE(\'QQ510050\',P+0.15,0,1,1);     //比平值高150的认购合约
d2:=OPOBYPRIRCE(\'QQ510050\',P-0.15,1,1,1);     //比平值低150的认沽合约
end

if abs(50c-p)>=0.5 and Tholding<>0 then  //当50ETF最新价格距离上一轮成交时的平价超过0.5元时,平仓   
begin
Tsellshort(1,100%,lmt,close+0.0005,0,\'\',d1),pertrader;
Tsellshort(1,100%,lmt,close+0.0005,0,\'\',d2),pertrader;
end

if abs(50c-p)<=0.005 and Tholding=0 then  //当50ETF距离最新平价期权价差小于0.0005时,开仓
BEGIN
Tbuyshort(1,100,lmt,close-0.0005,0,\'\',d1);
Tbuyshort(1,100,lmt,close-0.0005,0,\'\',d2);
rp:=p;      //开仓时赋值或者更新这个值
end

然后就是你在需要的地方调用rp就可以了  这个rp代表上次开仓条件触发时候记录的P值。

--  作者:zhuwenjie
--  发布时间:2018/8/10 15:37:11
--  

谢谢老师! 全局变量函数还不是很懂

这么写是不是运行第一遍的时候 把rp赋值为0 然后每出现一跟新K线再度计算的时候,会判断if是否满足

然后如果条件不满足rp的值就一直不变,直到条件满足才执行一次rp=p对么?