VBA部分(自定义函数):
Function GotoCode(Formula,X)
if X=1 and Formula.ParentGrid.DataType=1 and Formula.ParentGrid.Type=0 then '仅允许叠加到主图且为K线图的公式调用
Code=Document.GetExtString("股指交易合约") '交易合约从全局变量中取合约代码
if Code="" then Code="IF00" '取不到就交易IF00了
Formula.ParentGrid.ChangeStock Code,Formula.ParentGrid.Market
end if
GoToCode=0
End Function
Perl公式代码部分:
yuefen:=month();
//12月交易1月合约,1月交易2月合约,2月交易3月合约,依此类推
if (yuefen=12) then
jyhy:='IF01';
else if (yuefen>=1 and yuefen<=8) then
jyhy:='IF0'+NUMTOSTR(yuefen+1,0);
else if (yuefen>=9 and yuefen<=11) then
jyhy:='IF'+NUMTOSTR(yuefen+1,0);
isjyhy:=STKLABEL='IF00' or STKLABEL=jyhy; //当前是否要交易的合约
if (isjyhy=false and ISLASTBAR and THOLDING=0 and HOLDING=0) THEN //最后一根K线无虚拟持仓,也无实际持仓的情况下,如当前合约不是要交易的合约,就载入要交易的合约
begin
EXTGBSTRINGSET('股指交易合约',jyhy); //用全局变量传递合约代码
fhz:=GotoCode(STKLABEL<>jyhy);
end;
以下为具体交易代码,但注意开仓的条件中,一定加入isjyhy这个条件,省略代码
问专家:我想只有无持仓的情况下,才切换,否则等平仓信号才切换,由于我的策略不可能出现持仓10日以上,因此交易次月合约的情况下不可能到交割日还不平仓。当THOLDING=0 and HOLDING=0才切换,我同时用了虚拟持仓和实际持仓,为的是避免图表上出现平仓信号,HOLDING已经是0的时候,由于执行平仓需要一个过程(例如走完K线才平仓),再加上平仓委托不一定就成交,所以我想可能THOLDING还未必是0。这样用应该没问题吧
以上逻辑就是:当图表和实际持仓均空仓的时候,检查当前交易合约的代码,如果不是次月合约,就调用GotoCode的自定义函数切换到次月合约
这里还有一个问题,就是如果平仓并反手,能不能保证平仓后,切换到新品种,再反手(走完K线的情况下,实际上两个信号是接连出线的,因为还没遇到,所以不知道实际怎么样)
很多的公式逻辑问题,只能是你自己多尝试才能知道结果了。
推荐你看看通过日志的方法,这种方法不仅可以调试你的代码,也可以了解一些金字塔的工作机理。
我给你的帖子链接不知道你是否有耐心的看过。
不仅仅是系统自带的日志,你的程序代码中的日志记录同样重要