本帖最后由 资深技术05 于 2024-10-31 17:23 编辑
首先程序本身肯定无法判断你这笔开仓是因为资金不足失败的。PEL函数里没有提供相关的支持的。如果你想矫正这种情况带来的仓位,那只能引入新的代码结构。
如果你是常规的指标信号,那么你这种补仓,就只能使用后台调用图表理论持仓的方式。调用到图表理论持仓后再和实际持仓进行对比,来实现仓位的矫正。还有一种方式是后台自己记录理论持仓的方式,但是这种结构非常复杂且不具有稳定性。另外你这里肯定要先调用保证金 算下资金,判断可用资金充足后再去进行下单,否则可能会反复触发无效的开仓动作。
要注意的是调用图表理论持仓的方式,通常都是调用上一个已经确定的持仓信号来进行矫正。 否则会因为图表信号闪烁 造成反复矫正仓位。
参考这个范例吧,其中ho是定义在被调用指标里的holding:
[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);
//如果当前品种有挂单或者上一根K理论持仓没有发生变化,就不执行
if is_order or (ho1=ho2) 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
|