先给出第一版,这一版暂时别运行,你就先看下代码注释部分,然后主要是看下是否和你描述的需求一致,我这边还需要明天再测试下。
[PEL] 复制代码 input:ss(1,1,100,1);
//这里暂忽略多空锁仓时候数量不一致的情况
//所有仓位读取 在下面这部分代码中提前读取好,如果在下单条件那里判断 下单后仓位变化会影响到后续逻辑。
多头持仓:tbuyholdingex('','',1);
空头持仓:tsellholdingex('','',1);
多头今仓:tbuyholdingex('','',0);//多头今仓
多头老仓:多头持仓-多头今仓;//多头老仓
空头今仓:tsellholdingex('','',0);//空头今仓
空头老仓:空头持仓-空头今仓;//空头老仓
开多:1;
开空:1;
平多:1;
平空:1;
//有昨日老仓时,只平仓;
//空仓后只开仓;
//持仓满足一多一空后,有开仓信号则平另一个方向的;
//只有多或空持仓时,出现平仓信号时则开另一个方向的;
if time>=185500 then GOTO here;//收盘前跳过常规开平语句
if 平多 and 多头持仓<>0 then
begin
if 多头老仓<>0 then tsell(1,多头老仓,mkt);//有当前方向老仓情况下,直接优先平老仓 不开反向仓
if 多头今仓<>0 and 空头持仓=0 and 多头老仓=0 then tbuyshort(1,ss,mkt);//单边持仓且无当前方向老仓的情况下,平多转开空
end
if 平空 and 空头持仓<>0 then
begin
if 空头老仓<>0 then tsellshort(1,空头老仓,mkt);
if 空头今仓<>0 and 多头持仓=0 and 空头老仓=0 then tbuy(1,ss,mkt);
end
if 开多 then
begin
if 空头老仓<>0 then tsellshort(1,空头老仓,mkt);//有昨日空头老仓,开多转平空
if 多头持仓=0 and 空头老仓=0 then tbuy(1,ss,mkt);//多头无持仓时候 且 没有空头老仓时候直接开多
if 多头持仓<>0 and 空头持仓<>0 and (空头老仓=0) then tsellshort(1,空头持仓,mkt);//锁仓状态下,开仓转平反向仓
end
if 开空 then
begin
if 多头老仓<>0 then tsell(1,多头老仓,mkt);
if 空头持仓=0 and 多头老仓=0 then tbuyshort(1,ss,mkt);
if 多头持仓<>0 and 空头持仓<>0 and (多头老仓=0) then tsell(1,多头持仓,mkt);
end
here@;
//收盘无持仓则对锁
if time>=185500 and 空头持仓=0 and 多头持仓=0 then
begin
tbuy(1,ss,lmt,c);
tbuyshort(1,ss,lmt,c);
end
有几个需要特别说明的地方:
1.另外这版暂时先忽略了一个可能导致情况更加复杂化的情况:多空锁仓时候,多空仓位不一致的情况。
如果包含对仓位不一致的锁仓的判断的话,大致有如下这么多情况,非常复杂,逻辑也很绕:
2.这种锁仓是不适用于多策略同品种运行时候的情况。一旦多策略运行,这个逻辑是完全会混乱的。多策略情况下 只能先进行多个策略的持仓汇总然后再操作才行。
|