您一楼提供的是算法模型需要结合模组来使用的
分析您一楼源码正常是不会存在锁仓情况的
核实一下您具体是哪里有疑问呢?
参考:
VAR Modname;
VAR Code1;//定义合约名称
VAR Price1;//定义最新价
VAR SellPosition,BuyPosition;//定义模组空头持仓、多头持仓
GLOBAL_VAR LastWithDrawFinsh,B,S; //这个变量的作用是避免撤单的过程中反复的进行撤单
VOID MAIN()
{
Modname="沪银1812_30秒_细分(5)";
Code1=Modname.F_DealCode();
Price1=Price(Code1,"New");//定义最新价为当前模型所加载合约的最新价
SellPosition=AL_SellRemainPosition(Code1);
BuyPosition=AL_BuyRemainPosition(Code1);
IF(CurrentTime()-LastOrderTime()<2 && LastOrderTime()!=0)
// RETURN; //控制组件的执行频率 两秒执行一次
//icount=Modname.F_SigCount();
IF(T_IsNoOrder()!=1 ) //有挂单的情况
{
//查询挂单然后进行撤单重下?还是直接撤单?
//need added code
IF(CurrentTime()-LastOrderTime()>60 && LastWithDrawFinsh == 1) //如果20秒有委托未成交,全撤,下次进入会重新下委托
{
T_DeleteOrderAll();
LastWithDrawFinsh=0;
S=0;
B=0;
}
RETURN;
}
LastWithDrawFinsh=1;
Modname.F_FreshSig(); //取得一个还未处理的新信号
IF(Modname.F_Sig() == BK && Modname.F_SigValid() == 1) //如果取出的信号为BPK 且信号不是消失状态
{
IF(SellPosition!=0)
{
MessageOut("信号BPK生效,平掉所有卖仓");
T_ReduceSellOpiTo(Code1, Price1,0); //平掉所有空头持仓
}
IF(BuyPosition == 0&&B==0)
{
MessageOut("信号BPK生效,开仓");
T_AddBuyOpiTo(Code1, Price1,Modname.F_SigVol()); //补充持仓
B=1;
S=0;
}
}
ELSE IF(Modname.F_Sig() == SK && Modname.F_SigValid() == 1) //如果取出的信号为SPK 且信号不是消失状态
{
IF(BuyPosition!=0)
{
MessageOut("信号SPK生效,平掉所有卖仓");
T_ReduceBuyOpiTo(Code1, Price1,0); //平掉所有多头持仓
}
IF(SellPosition == 0&&S==0) //如果买仓为0,不存在止赢止损问题,直接开仓
{
MessageOut("信号SPK生效,开仓");
T_AddSellOpiTo(Code1, Price1,Modname.F_SigVol()); //补充空头持仓
S=1;
B=0;
}
}
IF(Modname.F_Sig() == BK && Modname.F_SigValid() == 0) //BPK 条件不满足(似可认为BPK信号处在消失状态)
{
IF(BuyPosition!=0)
{
MessageOut("信号BPK失效,平掉所有买仓");
T_ReduceBuyOpiTo(Code1, Price1,0); //平掉所有多头持仓
B=0;
}
}
ELSE IF(Modname.F_Sig() == SK && Modname.F_SigValid() == 0) //SPK 条件不满足(似可认为SPK信号处在消失状态)
{
IF(SellPosition!=0)
{
MessageOut("信号SPK失效,平掉所有卖仓");
T_ReduceSellOpiTo(Code1, Price1,0); //平掉所有空头持仓
S=0;
}
}
}