以文本方式查看主题

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

--  作者:OscarDeng
--  发布时间:2020/7/15 8:15:19
--  能否自动指定改合约的连续合约?
我的程序必须在具体合约实施, 例如SF2009,CF2009, 但是我又想直接调用该合约的连续合约的日线的指标,也就是问能否自动指定改合约的连续合约? 例如这个程序放在SF2009 5分钟上能自动调用SF的连续合约, 放到CF2009 5分钟上又会自动调用CF的连续合约, 不需要在不同品种中修改程序, 要怎样写?  
--  作者:FireScript
--  发布时间:2020/7/15 8:58:31
--  
 s:=STRREMOVE(STKLABEL,STRLEN(STKLABEL)-2,2);
lxstr:=s+\'00\';//连续品种代码

这样有了品种代码。你后面就可以调用连续的数据了。在跨周期调用里面指定品种代码是lxstr 就行了。


--  作者:OscarDeng
--  发布时间:2020/7/15 18:15:49
--  
使用你给的程序, 放在AP10 的一分钟身上, 得出s是:100001.000, lsstr:1000002.000,  并不会返回AP00 呀? 是不是你程序有错?
--  作者:wenarm
--  发布时间:2020/7/15 20:46:45
--  

字符串不能直接在图表变量值输出。必须通过绘图函数或者EXPLAIN函数输出显示。

上面的代码没没有对双年份合约和原油进行处理。需要调整下。以保证逻辑的健壮性。

 

STR:=STRTRIMRIGHT( STKLABEL, \'0123456789\');

//双年份合约,豆一和白糖虽然取消双年份,但是金字塔为保证老用户策略的正常操作,所以保持不变。因此依旧需要区分。
if STRCMP(STR,\'AY\')=0 or  STRCMP(STR,\'BUY\')=0 OR  STRCMP(STR,\'SRY\') THEN BEGIN
 STR:=STRREPLACE(STR , \'Y\',\'X\' );
END
//EXPLAIN( 1, STR );

//区分处理原油和其他品种的连续代码
STR00:=IF(STRCMP(STR,\'SC\')=0,STRCAT(STR , \'0000\'),STRCAT( STR, \'00\'));
EXPLAIN( 1, STR00 );

[此贴子已经被作者于2020/7/16 8:29:48编辑过]

--  作者:OscarDeng
--  发布时间:2020/7/16 9:57:57
--  
你的程序跟第一次给的程序完全不一样,   我只需要拿到一个连续合约代码, 输出值是 STR00 吗?我直接调用STR00  就可以了吗? 例如  STKINDI(\'str00\',\'macd.def\',0,6,-1),noaxis;
--  作者:FireScript
--  发布时间:2020/7/16 10:00:35
--  

前面的方式在部分品种上会失效   以4楼的方式为准。


STR:=STRTRIMRIGHT( STKLABEL, \'0123456789\');

//双年份合约,豆一和白糖虽然取消双年份,但是金字塔为保证老用户策略的正常操作,所以保持不变。因此依旧需要区分。
if STRCMP(STR,\'AY\')=0 or  STRCMP(STR,\'BUY\')=0 OR  STRCMP(STR,\'SRY\') THEN BEGIN
 STR:=STRREPLACE(STR , \'Y\',\'X\' );
END

//区分处理原油和其他品种的连续代码
STR00:=IF(STRCMP(STR,\'SC\')=0,STRCAT(STR , \'0000\'),STRCAT( STR, \'00\'));



STKINDI(str00,\'macd.def\',0,6,-1),noaxis;
这里不用带引号。本身就是字符串变量了。

--  作者:OscarDeng
--  发布时间:2020/7/27 17:45:22
--  
使用4楼的公式能成功调用跨周期的, 但是STKINDI调用后, 我发现调用后得出的数值与被调用的真实数值区别很大, 不知道什么原因? 是我写的程序有问题吗? 能否帮忙检查一下哪里出错了?  下面的语句是程序运行在主力合约例如CJ09在一分钟周期内 调用CJ00的一分钟周期成交量指标。 例如:在09合约2020年7月27日15点00分MV1 和 MV2 是222和89 , 但是连续合约查到的值15:00是 156和91;14:59是134和77. 


STR:=STRTRIMRIGHT( STKLABEL, \'0123456789\');
//双年份合约,豆一和白糖虽然取消双年份,但是金字塔为保证老用户策略的正常操作,所以保持不变。因此依旧需要区分。
if STRCMP(STR,\'AY\')=0 or  STRCMP(STR,\'BUY\')=0 OR  STRCMP(STR,\'SRY\') THEN BEGIN
 STR:=STRREPLACE(STR , \'Y\',\'X\' );
END
//EXPLAIN( 1, STR );
//区分处理原油和其他品种的连续代码
STR00:=IF(STRCMP(STR,\'SC\')=0,STRCAT(STR , \'0000\'),STRCAT( STR, \'00\'));
EXPLAIN( 1, STR00 );

MV1:STKINDI(STR00,\'VOL1.MA1(3,100)\',0,1,1);
MV2:STKINDI(STR00,\'VOL1.MA2(3,100)\',0,1,-1);


//被调用的成交量指标
VOLUME:VOL,VOLSTICK;
OPENINT,linethick3, coloryellow,NOAXIS;
MA1:MA(VOL,M1);
MA2:MA(VOL,M2);
//MA3:MA(VOL,M3); 


--  作者:wenarm
--  发布时间:2020/7/27 23:44:50
--  

代码没问题。怀疑你在连续上看错了或者周期不对。建议你自己再核实下

[此贴子已经被作者于2020/7/27 23:45:11编辑过]

--  作者:OscarDeng
--  发布时间:2020/7/28 10:06:01
--  
就是核实过才会 过来问的。 
 例如:在JC09合约2020年7月27日15点00分MV1 和 MV2 是222和89 , 但是连续合约查到的值15:00是 156和91;14:59是134和77. 
 例如:在JC09合约2020年7月28日10点01分MV1 和 MV2 是46和81 , 但是连续合约查到的值10:01是 156和91;14:59是59和50. 

--  作者:wenarm
--  发布时间:2020/7/28 10:13:32
--  

截图看。我本地结果是正常的