等级: 超级版主
- 注册:
- 2021-5-18
- 曾用名:
|
本帖最后由 资深技术05 于 2024-12-16 16:50 编辑
我们从图表转入后台时候往往会发现后台没有持仓同步这个功能,那是因为后台本质上使用的是账户持仓而非理论持仓
那么如果我们还是想要实现这个功能怎么办呢,这边给出一个模板范例大致原理就是获取图表策略的理论持仓holding然后和账户持仓做匹配。
此外范例增加了有未成交单不进行仓位矫正,以避免信号的反复。
注意:所引用的策略最后要输出一个ho:holding;用来被调用,另外这里默认调用500根k计算得出持仓结果,如果要和图表上进行对应也需要控制图表k线数量在500
另外这里策略理论持仓是一个策略的,如果你有多个策略引用可以进行多个策略的stkindiex,然后把引用过来的持仓加起来得到一个总的理论持仓。
我们提供了2套思路上略有偏差的模版参考。
模板1: 比对理论持仓(前一个K的)和实际仓位,有差异直接进行仓位矫正
[PEL] 复制代码 //上一根K策略理论持仓
ho1:stkindiex(stklabel,'BOLL布林带交易系统.ho',0,1,-1,500);
//账户多头持仓
tbuyho:tbuyholdingex('',STKLABEL,1);
//账户空头持仓
tsellho:tsellholdingex('',STKLABEL,1);
//是否有未成交单,返回1表示有未成交
is_order:TGLOBALSUBMITEX(0,'',stklabel,0);
//如果当前品种有挂单就不执行
if is_order then exit;
else
BEGIN
//多头部分
if ho1>=0 and tsellho>0 then tsellshort(1,tsellho,mkt);
//理论持仓大于0,补仓
if ho1>0 and ho1>tbuyho then
BEGIN
tbuy(1,ho1-tbuyho,mkt);
END
//理论持仓大于0,减仓
if ho1>0 and ho1<tbuyho then
BEGIN
tsell(1,tbuyho-ho1,mkt);
END
//空头部分
if ho1<=0 and tbuyho>0 then tsell(1,tbuyho,mkt);
//理论持仓小于0,补仓
if ho1<0 and abs(ho1)>tsellho then
BEGIN
tbuyshort(1,abs(ho1)-tsellho,mkt);
END
//理论持仓小于0,减仓
if ho1<0 and abs(ho1)<tsellho then
BEGIN
tsellshort(1,tsellho-abs(ho1),mkt);
END
END
模板2:仅当理论持仓发生变化时候进行操作,否则即便当前理论持仓和实际仓位有差异也不操作。这个思路主要是考虑到实际
运行中,客户的程序未能持续运行的情况:此时我们的理论信号实际是发生在较久远之前的位置,我们已经是错过了那个入场时机了,
此时如果死板直接进行仓位矫正并不合适。
[PEL] 复制代码
//调用1分钟周期前一周期 以及前前一周前的持仓
hd1:=stkindiex(stklabel,'boll布林带交易系统.ho',0,1,-1,500);
hd2:=stkindiex(stklabel,'boll布林带交易系统.ho',0,1,-2,500);
//调用15分钟周期前一周期 以及前前一周前的持仓
hd3:=stkindiex(stklabel,'boll布林带交易系统.ho',0,3,-1,500);
hd4:=stkindiex(stklabel,'boll布林带交易系统.ho',0,3,-2,500);
//上一根k线的理论持仓汇总
ho1:hd1+hd3;
//上上一根k线的理论持仓汇总
ho2:hd2+hd4;
//账户多头持仓
tbuyho:tbuyholdingex('',stklabel,1);
//账户空头持仓
tsellho:tsellholdingex('',stklabel,1);
//是否有未成交单,返回1表示有未成交
is_order:tglobalsubmitex(0,'',stklabel,0);
//如果当前品种有挂单就不执行
if is_order then exit;
//如何没有理论持仓变化就不执行
if (ho1=ho2) then exit;
//多头部分
if ho1>=0 and tsellho>0 then tsellshort(1,tsellho,mkt);
//理论持仓大于0,补仓
if ho1>0 and ho1>tbuyho then
begin
tbuy(1,ho1-tbuyho,mkt);
end
//理论持仓大于0,减仓
if ho1>0 and ho1<tbuyho then
begin
tsell(1,tbuyho-ho1,mkt);
end
//空头部分
if ho1<=0 and tbuyho>0 then tsell(1,tbuyho,mkt);
//理论持仓小于0,补仓
if ho1<0 and abs(ho1)>tsellho then
begin
tbuyshort(1,abs(ho1)-tsellho,mkt);
end
//理论持仓小于0,减仓
if ho1<0 and abs(ho1)<tsellho then
begin
tsellshort(1,tsellho-abs(ho1),mkt);
end
|
|