Data
COD:"m2409"; //合约编码,数据区同步
Vars
String ModA;
Numeric C1;//m2409价格
Numeric C1_last;//m2409上一价格
Numeric M; //条件价位倍数
Numeric N; //下单手数
Numeric X; //循环变量
Numeric W; //委托价位倍数
Numeric T; //时间间隔
Numeric QCT; //清仓处理时间
Numeric SH; //上海合约标志
Numeric SVT; //服务器时间
Numeric WQF; //尾盘清仓标志
Numeric QT; //清仓时间间隔
Numeric DTN; //撤单tick数量
Numeric ZYM; //止盈价位倍数
Numeric ZSM; //止损价位倍数
Numeric BKC; //多头开仓条件
Numeric SPC; //多头平仓条件
Numeric TKN; //数据区长度
Numeric TKHP; //tick最高价
Numeric TKLP; //tick最低价
Numeric TKVL; //tick累计成交量
Numeric TPrice; //关键价格
Numeric ODFLG; //挂单判断标志
Numeric NOW; //当前时间
Numeric NEWP; //最新价
Numeric MINP; //最小变动价位
Numeric RLP,FLP; //涨跌停价
Numeric BIDP,ASKP; //买卖一价
NumericArray TKBP; //tick买一价
NumericArray TKAP; //tick卖一价
Numeric BRP,SRP; //多空头可用持仓
Numeric OPFLG; //模型处理标志
Numeric BKDFLG; //买开处理标志
Numeric SKDFLG; //卖开处理标志
Numeric BPDFLG; //买平处理标志
Numeric SPDFLG; //卖平处理标志
NumericArray TKP; //tick价格
Numeric SPVLM; //卖平手数
NumericArray TKO; //tick持仓量
Numeric CLT1; //夜盘收盘时间
Var_TickData TKD; //数据区
Global_Numeric COFLG; //输出处理标志
Global_Numeric KCFLG; //开仓处理标志
Global_Numeric BKID,SKID; //开仓委托
Global_Numeric BPID,SPID; //平仓委托
Global_Numeric SPOFLG;
Global_Numeric BKFLG,SKFLG; //开仓标志
Global_Numeric BPFLG,SPFLG; //平仓标志
Global_Numeric BKDEL,SKDEL; //开仓撤单标志
Global_Numeric BPDEL,SPDEL; //平仓撤单标志
Global_Numeric BKTKN,SKTKN; //开仓tick数量
Global_Numeric BKTKV,SKTKV; //开仓累计成交量
Global_Numeric BKAP,SKAP; //开仓成交均价
Global_Numeric BKCT,SKCT; //开仓成交时间
Global_Numeric BKM,SKM; //开仓委托手数
Global_Numeric BPM,SPM; //平仓委托手数
Global_Numeric BKP,SKP; //开仓委托价格
Global_Numeric BPP,SPP; //平仓委托价格
Global_Numeric QCFLG; //清仓处理标志
Begin
//---------------------组件处理开启---------------------//
If(1)
{
If(A_IsExchangeOpen() == 1) //如果是开盘状态
{
OPFLG = 1; //开启模型处理
}
}
//---------------------期货变量赋值---------------------//
If(OPFLG == 1)
{
M=1.3;
N = 2; //下单手数
W = 1; //委托价位倍数
T = 30; //时间间隔
DTN = 2; //撤单tick数量
ZYM = 4; //止盈价位倍数
ZSM = 8; //止损价位倍数
NOW = CurrentTime(); //当前时间
NEWP = Price("New"); //最新价
BIDP = Price("Bid1"); //买一价
ASKP = Price("Ask1"); //卖一价
RLP = Price("RiseLimit"); //涨停价
FLP = Price("FallLimit"); //跌停价
MINP = Price("MinPrice"); //最小变动价位
BIDP = IIF(BIDP == 0 && NEWP == FLP,FLP,BIDP); //买一价(对手价)
ASKP = IIF(ASKP == 0 && NEWP == RLP,RLP,ASKP); //卖一价(对手价)
BRP = F_BuyRemainPosition(); //多头可用持仓
BRP = Min(BRP,A_BuyRemainPosition()); //多头可用持仓
SH = IIF(A_IsSHCode() == 1,Enum_ExitToday,Enum_Exit); //平仓参数
WQF = 1; //尾盘清仓标志(1-开启/0-关闭)
QT = 5 * 60; //清仓时间间隔
CLT1 = StringToTime("15:00:00"); //收盘时间
QCT = TimeDiff(SVT,CLT1) <= QT && SVT <= CLT1; //清仓处理时间
//------------------------开仓条件判断------------------------//
If(1)
{
TKD = Def_TickData("m2409",0,60); //数据区
If(TKD.State != 1) //如果数据区无效
{
If(COFLG == 0) //如果未执行输出处理
{
Commentary("【数据存储:数据区存储中】");
COFLG = 1; //已执行输出处理
}
OPFLG = 2; //关闭模型处理
}
Else If(TKD.State == 1) //如果数据区有效
{
If(COFLG == 1) //如果已执行输出处理
{
Commentary("【数据存储:数据区已有效】");
COFLG = 2; //已完成输出处理
}
TKN = TKD.Num; //数据区长度
For X = 0 To TKN - 1 //遍历数据区
{
TKBP[X] = TKD[X].Bid1; //tick买一价
TKAP[X] = TKD[X].Ask1; //tick卖一价
TKP[X] = TKD[X].TickPrice; //tick价格
TKO[X] = TKD[X].TickOpi; //tick持仓量
If(X < TKN - 1) //如果非最新tick
{
TPrice=TKP[TKN=0];//tick上一周期收盘价
}
}
TKVL = TKD[TKN - 1].TickVolum; //tick累计成交量
ModA="SGSD_M";
F_Bind(ModA);//绑定模组SGSD
C1=F_Variant(ModA,"C1");//m2409价格
C1_last=F_Variant(ModA,"C1_last");//m2409上一价格
If( C1/C1_last==M) //如果满足多头开仓条件
{
BKC = 1; //满足多头开仓条件
}
If(BKP+4*MINP>=SKP) //如果满足多头盈利平仓条件
{
SPC = 1; //满足多头盈利平仓条件
}
If( SPP>=BKP-8*MINP) //如果满足多头止损平仓条件
{
SPC = 1; //满足多头止损平仓条件
}
}
}
}
//------------------查询组件当前任务-----------------//
If(OPFLG == 1)
{
If(1)
{
If(BKFLG == 1) //如果有买开委托
{
If(F_OrderStatus(BKID) == Enum_Filled && BRP > 0) //如果买开委托成交
{
Commentary("【多头开仓:买开委托成交】");
BKAP = F_OrderFilledPrice(BKID); //买开成交均价
SPDFLG = 1; //开启多头止盈卖平处理
BKCT = NOW; //买开成交时间
BKFLG = 0; //买开标志归0
BKDEL = 0; //买开撤单标志归0
}
Else If(F_OrderStatus(BKID) == Enum_Canceled) //如果买开委托已撤
{
Commentary("【多头开仓:买开委托已撤】");
If(F_OrderFilledLot(BKID) > 0) //如果买开委托部分成交
{
BKAP = F_OrderFilledPrice(BKID); //买开成交均价
SPDFLG = 1; //开启多头止盈卖平处理
BKCT = NOW; //买开成交时间
}
Else //如果买开委托全部撤单
{
KCFLG = 0; //开仓处理标志归0
}
BKFLG = 0; //买开标志归0
BKDEL = 0; //买开撤单标志归0
}
Else If(F_OrderStatus(BKID) == Enum_Declared || F_OrderStatus(BKID) == Enum_FillPart) //如果买开委托挂单
{
If(BKDEL == 0) //如果未撤单
{
If(TKVL != BKTKV) //如果是新tick
{
BKTKN = BKTKN + 1; //买开tick数量
BKTKV = TKVL; //买开累计成交量
}
If(BKTKN == DTN) //如果满足撤单条件
{
Commentary("【多头开仓:买开委托撤单】");
F_DeleteOrder(F_OrderContractNo(BKID)); //撤掉买开委托挂单
BKDEL = 1; //已发出撤掉买开委托挂单
}
}
}
Else If(F_OrderStatus(BKID) == Enum_NoOrder) //如果买开委托无效
{
Commentary("【多头开仓:买开委托无效】");
KCFLG = 0; //开仓处理标志归0
BKFLG = 0; //买开标志归0
BKDEL = 0; //买开撤单标志归0
}
}
If(SPFLG > 0) //如果有卖平委托
{
If(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交
{
If(SPFLG == 1) //如果是多头止盈卖平委托
{
Commentary("【多头止盈:卖平委托成交】");
}
Else If(SPFLG == 2) //如果是多头止损卖平委托
{
Commentary("【多头止损:卖平委托成交】");
}
Else If(SPFLG == 3) //如果是多头清仓卖平委托
{
Commentary("【多头清仓:卖平委托成交】");
}
KCFLG = 0; //开仓处理标志归0
SPFLG = 0; //卖平标志归0
SPDEL = 0; //卖平撤单标志归0
}
Else If(F_OrderStatus(SPID) == Enum_Canceled && BRP > 0) //如果卖平委托已撤
{
If(SPDEL == 1) //如果是追价撤单
{
Commentary("【多头止损:卖平委托已撤】");
If(F_OrderFilledLot(SPID) > 0) //如果卖平委托部分成交
{
SPM = SPM - F_OrderFilledLot(SPID); //卖平委托手数
}
If(BRP > 0 && SPM > 0 && SPM <= BRP) //如果卖平委托手数不超过多头可用持仓
{
SPP = BKP-8*MINP; //卖平委托价格
Commentary("【多头止损:卖平委托追价】");
SPID = A_SendOrder(Enum_Sell,SH,SPM,SPP); //发出卖平委托
}
}
Else If(SPDEL == 2) //如果是多头止损撤单
{
Commentary("【多头止损:卖平委托已撤】");
SPFLG = 0; //卖平标志归0
SPDFLG = 2; //开启多头止损卖平处理
}
Else If(SPDEL == 3) //如果是多头清仓撤单
{
Commentary("【多头清仓:卖平委托已撤】");
SPFLG = 0; //卖平标志归0
SPDFLG = 3; //开启多头清仓卖平处理
}
SPDEL = 0; //卖平撤单标志归0
}
Else If(F_OrderStatus(SPID) == Enum_Declared || F_OrderStatus(SPID) == Enum_FillPart) //如果卖平委托挂单
{
If(SPDEL == 0) //如果未撤单
{
If(SPFLG != 3 && TimeDiff(BKCT,NOW) >= T) //如果满足多头清仓条件
{
Commentary("【多头清仓:卖平委托撤单】");
F_DeleteOrder(F_OrderContractNo(SPID)); //撤掉卖平委托挂单
SPDEL = 3; //多头清仓撤掉卖平委托挂单
}
Else //如果不满足多头清仓条件
{
If(SPFLG == 1) //如果是多头止盈卖平委托
{
If(NEWP <= BKP - ZSM * MINP) //如果满足多头止损条件开仓价减8跳
{
Commentary("【多头止损:卖平委托撤单】");
F_DeleteOrder(F_OrderContractNo(SPID)); //撤掉卖平委托挂单
SPDEL = 2; //多头止损撤掉卖平委托挂单
}
}
Else If(SPFLG == 2) //如果是多头止损卖平委托
{
Commentary("【多头止损:卖平委托撤单】");
F_DeleteOrder(F_OrderContractNo(SPID)); //撤掉卖平委托挂单
SPDEL = 1; //已发出撤掉卖平委托挂单
}
}
}
}
Else If(F_OrderStatus(SPID) == Enum_NoOrder) //如果卖平委托无效
{
If(SPFLG == 1) //如果是多头止盈卖平委托
{
Commentary("【多头止盈:卖平委托无效】");
}
Else If(SPFLG == 2) //如果是多头止损卖平委托
{
Commentary("【多头止损:卖平委托无效】");
}
Else If(SPFLG == 3) //如果是多头清仓卖平委托
{
Commentary("【多头清仓:卖平委托无效】");
}
SPFLG = 0; //卖平标志归0
SPDEL = 0; //卖平撤单标志归0
}
}
If(1) //尾盘清仓
{
If(QCFLG == 0) //如果未执行清仓处理
{
If(WQF == 1 && QCT == 1) //如果是清仓处理时间
{
Commentary("【尾盘清仓:清仓处理开始】");
If(BKFLG == 1) //如果有买开委托
{
If(BKDEL == 0) //如果未撤单
{
If(F_OrderStatus(BKID) == Enum_Declared || F_OrderStatus(BKID) == Enum_FillPart) //如果C买开委托挂单
{
Commentary("【多头清仓:买开委托撤单】");
CODC.F_DeleteOrder(F_OrderContractNo(BKID)); //撤掉买开委托挂单
BKDEL = 2; //多头清仓撤掉买开委托挂单
}
Else //如果买开委托未挂单
{
BKDEL = 3; //多头清仓撤掉买开委托挂单
}
}
Else //如果已发出撤单
{
BKDEL = 4; //多头清仓撤掉买开委托挂单
}
}
}
If(SPFLG > 0) //如果有卖平委托
{
If(SPDEL == 0) //如果未撤单
{
If(F_OrderStatus(SPID) == Enum_Declared || F_OrderStatus(SPID) == Enum_FillPart) //如果卖平委托挂单
{
Commentary("【多头清仓:卖平委托撤单】");
COD.F_DeleteOrder(F_OrderContractNo(SPID)); //撤掉C卖平委托挂单
SPDEL= 2; //多头清仓撤掉C卖平委托挂单
}
Else //如果C卖平委托未挂单
{
SPDEL = 3; //多头清仓撤掉C卖平委托挂单
}
}
Else //如果已撤单
{
SPDEL = 4; //多头清仓撤掉卖平委托挂单
}
}
}
QCFLG = 1; //已发出清仓撤单
}
}
Else If(QCFLG == 1) //如果已发出清仓撤单
{
If(ODFLG == 1) //如果没有开平仓委托
{
SPVLM = BRP; //卖平手数
SPDFLG = 3; //开启多头清仓卖平处理
QCFLG = 2; //已发出清仓平仓
}
}
Else If(QCFLG == 2) //如果已发出清仓平仓
{
If(SPOFLG == 1) //如果没有平仓委托
{
Commentary("【尾盘清仓:清仓处理完成】");
QCFLG = 3; //已完成清仓处理
}
}
Else If(QCFLG == 3) //如果已完成清仓处理
{
If(QCT == 0) //如果非清仓处理时间
{
QCFLG = 0; //清仓处理标志归0
}
}
}
If(1)
{
If(KCFLG == 0) //如果未执行开仓处理
{
If(BKC == 1) //如果满足多头开仓条件
{
Commentary("【多头开仓:满足开仓条件】");
BKDFLG = 1; //开启买开处理
KCFLG = 1; //已执行多头处理
}
}
}
//------------------------委托发出------------------------//
If(OPFLG == 1)
{
//---------------------买开委托处理--------------------//
If(BKDFLG == 1) //如果已开启买开处理
{
If(BKFLG == 0) //如果没有买开委托
{
BKM = N; //买开委托手数
BKP = BIDP ; //买开委托价格
Commentary("【多头开仓:买开委托发出】");
BKID = A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP); //发出买开委托
BKTKV = TKVL; //买开累计成交量
BKTKN = 0; //买开tick数量
BKFLG = 1; //已发出买开委托
}
}
//---------------------卖平委托处理--------------------//
If(SPDFLG > 0) //如果已开启卖平处理
{
If(SPFLG == 0) //如果没有卖平委托
{
If(BRP > 0) //如果有多头可用持仓
{
SPM = BRP; //卖平委托手数
If(SPDFLG == 1) //如果是多头止盈卖平
{
SPP =BKP+4*MINP; //卖平委托价格
Commentary("【多头止盈:卖平委托发出】");
}
Else If(SPDFLG == 2) //如果是多头止损卖平
{
SPP = BKP-8*MINP; //卖平委托价格
Commentary("【多头止损:卖平委托发出】");
}
Else If(SPDFLG == 3) //如果是多头清仓卖平
{
SPP = 0.99*BKP; //卖平委托价格
Commentary("【多头清仓:卖平委托发出】");
}
SPID = A_SendOrder(Enum_Sell,SH,SPM,SPP); //发出卖平委托
SPFLG = SPDFLG; //已发出卖平委托
}
}
}
}
End