期货交易公式中
1、费了好大功夫才弄清楚,在未开仓状态下,asset=cash*保证金率,因此cash比asset大很多倍。但按照常理未开仓时应该asset=cash。
既然设置中的初始资金是asset,那么以cash来计算应开仓量的话会高估很多,产生错误结果,比如系统自带的海龟交易法中。
2、bhwhui写的双向海龟交易法。即使按照asset来计算开仓量,在股指期货5分钟图上还是只能产生某个日期之前的信号,原因何在?明明是盈利的,不存在资金回撤到0的状态。保证金率设为18%,合约单位300。
稍微修改了一下bhwhui写的海龟交易法,用Asset来计算开仓量。
费率设置,保证金率margin 10%,合约单位10,交易费用0.02%,初始资金100万。运行到白糖1007的5MIN结果如图..(图传不来)
1、图中直观看出未开仓时,asset=cash*margin的关系,是否此点设计有误?应该asset=cash
2、在5MIN图上只有在4月22日之前能产生信号,而15MIN图上所有日期都有信号,这点十分不理解。
======================================
input:trn(20,5,30),hn(20,5,30),lown(10,5,20);
VARIABLE:dayCount=1,PositionCount=1,SellSign=0,dK=0;//加多空标志,1:多,-1:空 0:空仓
VARIABLE:EntAndExitSign=1,EntPoint=0,ExitPoint=0;
VARIABLE:N=0;
margin:=0.1;//保证金率
value:=10;//合约单位
//现金:CASH(0)/1000*margin;//若输出此行,cash和asset相等
现金:CASH(0)/1000;//若输出此行,asset=cash*margin。处以1000是为了坐标比例与K线适应
资产:ASSET/1000;
N:=MA(TR,trn);
BUYHHV:=HHV(H,hn);
SELLLLV:=LLV(L,lown);
sellshortllv:=llv(l,hn);
buyshorthhv:=hhv(h,lown);
IF BARPOS>=hn THEN
BEGIN
IF BARPOS=hn THEN
IF DayCount=hn/2 OR BARPOS=hn THEN
BEGIN{hn/2天调整N值}
N:=((hn-1)*N+TR)/hn;{计算N值}
DayCount:=2;
END
DayCount:=DayCount+1;
EntPoint:=ENTERBARS+1;
IF EntPoint=EntAndExitSign THEN
BEGIN{说明STOP指令买进头寸成功}
PositionCount:=PositionCount+1;{头寸计数}
SellSign:=True;{可以平仓信号,如果达到指定的价格}
END
IF PositionCount=1 THEN BEGIN{第一头寸}
HOW:=ASSET*0.01/N/value;{波动性百分比决定头寸规模}
if high=buyhhv then
BEGIN
dk:=1;
多开1:BUY(1,HOW,STOP,BUYHHV);{在20日新高STOP指令买进}
END;
if low=sellshortllv then
begin
dk:=-1;
空开1:buyshort(1,HOW,STOP,sellshortllv);{在20日新低STOP指令空开}
end;
END
IF PositionCount=2 THEN BEGIN{如到第二头寸}
HOW:=ASSET*0.01/N/value;{波动性百分比决定头寸规模}
if dk=1 then 多开2:BUY(1,HOW,STOP,ENTERPRICE+0.5*N);{在上头寸(即第一头寸)+0.5个N以STOP指令买进}
if dk=-1 then 空开2:buyshort(1,HOW,STOP,ENTERPRICE-0.5*N);
END
IF PositionCount=3 THEN BEGIN{如到第三头寸}
HOW:=ASSET*0.01/N/value;
if dk=1 then 多开3:BUY(1,HOW,STOP,ENTERPRICE+0.5*N);{在上头寸(即第二头寸)+0.5个N以STOP指令买进}
if dk=-1 then 空开3:buyshort(1,HOW,STOP,ENTERPRICE-0.5*N);
END
IF PositionCount=4 THEN BEGIN
HOW:=ASSET*0.01/N/value;
if dk=1 then 多开4:BUY(1,HOW,STOP,ENTERPRICE+0.5*N);
if dk=-1 then 空开4:buyshort(1,HOW,STOP,ENTERPRICE-0.5*N);
END
IF SellSign=True THEN
BEGIN
ExitPoint:=EXITBARS+1;
if dk=1 then
begin
IF ExitPoint=EntAndExitSign THEN
BEGIN {说明卖出成功}
PositionCount:=1;{头寸计算复原}
SellSign:=False;
dk:=0;
END
IF ENTERPRICE-2*N then
SELL(1,100%,STOP,SELLLLV);{退出离盈利头寸}
ELSE
SELL(1,100%,STOP,ENTERPRICE-2*N);{退出亏损头寸}
end;
if dk=-1 then
begin
IF ExitPoint=EntAndExitSign THEN
BEGIN
PositionCount:=1;
SellSign:=False;
dk:=0;
END
IF ENTERPRICE+2*N then
sellSHORT(1,100%,STOP,BUYSHORTHHV);
ELSE
sellSHORT(1,100%,STOP,ENTERPRICE+2*N);
END;
END
END;
asset=cash的问题,我们下个版本会按照你的方法进行输出修正,感谢提交此问题。
另外第二个问题,你可以看看是否因为资金不足无法后续开仓问题造成
关于第二个问题,我不太认为是资金不足无法开仓。或许正是因为cash和asset以及费率设置中的保证金率、合约单位、初始资金之间错综复杂的换算关系有瑕疵导致的。
或许第一个问题解决后,第二个问题自然解决...
你可以通过
持仓:HOLDING,LINETHICK0;
这种方式打印出公式中的变量,然后通过十字光标查看每个周期的变化,最终查明原因。