以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 公式模型编写问题提交 (http://weistock.com/bbs/list.asp?boardid=4) ---- [求助]麻烦版主帮忙指正一下程序段的问题 (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=169338) |
-- 作者:mikewhq -- 发布时间:2019/4/15 10:26:49 -- [求助]麻烦版主帮忙指正一下程序段的问题 P:100; //帐户总资产(W) N:=4; //总资产分散几个合约品种 S:=MULTIPLIER; //该合约乘数即每手几吨 F:=ROUND(P); //防乌龙指阀值 HD1:=HOLDING; //帐户品种现有持仓 ….. ….. ….. 以上省略部分为算法部分
HS:=…; //省略的是算法计算的帐户某品种应该持有的理论整数手数
If (ABS(HD1)>ABS(HS) or ABS(HD1)<ABS(HS)) then begin
TF:=ABS(HS*10*2/10000); //调整仓位阀值(价差低于手续费不作调整)
T1:=ABS(HS)<F AND HS>=0 AND HD1<0; T2:=ABS(HS)<F AND HS<=0 AND HD1>0;
SELLSHORT(T1,ABS(HD1),MARKETR); SELL(T2,HD1,MARKETR); //清理相反方向持仓
HD2:=HOLDING; //重新检查现在帐户品种持仓 TS:=HS-HD2; //此时应该调整手数
T3:=ABS(TS)>TF AND ABS(HS)<F AND HS>=0 AND HS>HD2; T4:=ABS(TS)>TF AND ABS(HS)<F AND HS>=0 AND HS<HD2; T5:=ABS(TS)>TF AND ABS(HS)<F AND HS<=0 AND HS<HD2; T6:=ABS(TS)>TF AND ABS(HS)<F AND HS<=0 AND HS>HD2;
BUY(T3,TS,MARKETR); SELL(T4,ABS(TS),MARKETR); BUYSHORT(T5,ABS(TS),MARKETR); SELLSHORT(T6,TS,MARKETR);
End
版主好!有一个问题想请教一下:以上这段程序我实际模拟试过,大部分时间里运行是正常的,但不知为何偶尔会不正常,主要表现在有时某一品种会出现HS(理论持仓)为正,但实际持仓HOLDING为负而程序却不调整,手工强行调整为正后,持仓同步却即时又调整回来为负,又或者反之HS为负,而HOLDING为正同样这一现象,究竟我的程序出了什么问题呢?可否帮我指正并修改过来?谢谢了! |
-- 作者:FireScript -- 发布时间:2019/4/15 10:52:34 -- 你看下最新K上的持仓是不是在闪烁中。 你定义一个变量输出下holding,然后看下最新K上的值。这个持仓同步是根据最新K上的holding来处理的。所以还是要看最新K的holding了。而你定义的hs看算法并不是holding了吧。你根据这个hs判断是不行的哦。 |
-- 作者:mikewhq -- 发布时间:2019/4/15 11:27:32 -- 不好意思,不明白你说的意思。再者,最新K上的持仓不是在闪烁中,而且是相当长时间持续这种现象的,HS是理论持仓,HD1,HD2才是holding,我的设想是只要HS与HD不相等就构成调整仓位的其中一个条件。 |
-- 作者:FireScript -- 发布时间:2019/4/15 13:05:28 -- 1.“手工强行调整为正后,持仓同步却即时又调整回来为负,” 你这里的持仓同步是指你本身代码里面的操作逻辑还是软件功能里面的持仓同步 2.“主要表现在有时某一品种会出现HS(理论持仓)为正,但实际持仓HOLDING为负而程序却不调整,” holding本身就是图表虚拟持仓,你这里称之为实际持仓是什么意思呢。是相对于你这里的HS吗?
|
-- 作者:mikewhq -- 发布时间:2019/4/15 13:29:00 -- 你好!你所提出的问题答复如下:1.持仓同步是软件功能里面的持仓同步,启动图表程序化交易时点选的持仓同步功能;2.HS是按照程序算法根据各种参数计算此时帐户“应该”持有某品种的仓位,而HD1,HD2(holding)是此时帐户某品种的“实际”持仓,如果HS与holding不相等(即“实际多少”不等于“应该多少”),那么在其它条件同时满足的情况下,就应该及时调整实际仓位到与理论应该持仓的相同数值,从而使得HS与holding数值保持一致。 |
-- 作者:FireScript -- 发布时间:2019/4/15 13:59:59 -- 1.holding本身就是虚拟持仓。持仓同步功能是只根据holding来处理的。所以如果hs和holding不一致,持仓同步肯定是按照holding的情况来处理实际账户栏上的持仓的。 我注意到你这里还有个不做调整的条件,你看下是不是这个条件导致的呢。
|
-- 作者:mikewhq -- 发布时间:2019/4/15 14:07:20 -- 不是这个条件造成,TF值很小的,这点我可以确认。你们经验丰富,帮我看看是不是其它程序逻辑造成? |
-- 作者:FireScript -- 发布时间:2019/4/15 15:23:17 -- 我仔细看了下。逻辑上应该是可用的。我建议你现在还是把TF,F相关的变量输出下,看下是不是某些特殊情况下触发了。你代码里面其他地方真的看不出来有导致这个结果的原因了。 |
-- 作者:mikewhq -- 发布时间:2019/4/15 17:13:23 -- 哦,那我试试吧。 |
-- 作者:mikewhq -- 发布时间:2019/4/18 20:29:34 -- 按你的方法试过,结果还是不行!后来我想找出是哪个参数造成的,于是将部分怀疑参数显示在图表上,结果发现其中(HD1:=HOLDING; //帐户品种现有持仓)图表显示的数值根本不对,比如 HS 应该是6手(买多)的,这时实际帐户持仓是-6手(卖空),但不知何解, HD1 竟然显示是6,这样的话,程序后面当然不会作出调整啦,天呀,HOLDING 函数这么不靠谱吗?那么如果要显示正确的某品种帐户持仓手数(包括正负哦),该用其它什么函数或怎么设置HOLDING才行呢?我想这个函数是自动交易的最基础的一个函数吧,要不然怎么根据实际帐户持仓多少去判断帐户开平仓操作呢? |