品种 | 数据起始时间 | 品种 | 数据起始时间 | 品种 | 数据起始时间 | 品种 | 数据起始时间 |
---|---|---|---|---|---|---|---|
300股指 | 2010/4/16 | 螺纹钢 | 2009/3/27 | PVC | 2009/5/25 | 粳稻 | 2013/11/18 |
50股指 | 2015/4/16 | 铁矿石 | 2013/10/18 | BR橡胶 | 2023/7/28 | 晚籼稻 | 2014/7/8 |
500股指 | 2015/4/16 | 热卷 | 2014/3/21 | 橡胶 | 1997/4/14 | 豆二 | 2004/12/22 |
1000股指 | 2022/7/22 | 不锈钢 | 2019/9/25 | 20号胶 | 2019/8/12 | 豆粕 | 2000/7/17 |
二年债 | 2018/8/17 | 线材 | 2018/10/16 | 塑料 | 2007/7/31 | 豆油 | 2006/1/9 |
五年债 | 2013/9/6 | 硅铁 | 2014/8/8 | 短纤 | 2020/10/12 | 油菜籽 | 2012/12/28 |
十年债 | 2015/3/20 | 锰硅 | 2014/8/8 | 乙二醇 | 2018/12/10 | 菜籽粕 | 2012/12/28 |
三十年债 | 2023/4/21 | 焦煤 | 2013/3/22 | 甲醇 | 2011/10/28 | 菜籽油 | 2007/6/8 |
沪金 | 2008/7/15 | 焦炭 | 2011/4/15 | 聚丙烯 | 2014/2/28 | 棕榈油 | 2007/10/29 |
沪银 | 2012/5/10 | 动力煤 | 2013/9/26 | 苯乙烯 | 2019/9/26 | 花生 | 2021/2/1 |
沪铜 | 1996/4/2 | 玻璃 | 2012/12/3 | 尿素 | 2019/8/9 | 棉花 | 2004/6/1 |
沪铝 | 1994/10/7 | 纸浆 | 2018/11/27 | 纯碱 | 2019/12/6 | 白糖 | 2006/1/6 |
沪锌 | 2007/3/26 | 纤维板 | 2019/12/2 | 对二甲苯 | 2023/9/15 | 棉纱 | 2017/8/18 |
沪铅 | 2011/3/24 | 胶合板 | 2013/12/6 | 烧碱 | 2023/9/15 | 鸡蛋 | 2013/11/8 |
沪镍 | 2015/3/27 | 原油 | 2018/3/26 | 玉米 | 2004/9/22 | 生猪 | 2021/1/8 |
沪锡 | 2015/3/27 | 燃料油 | 2018/7/16 | 豆一 | 2002/3/15 | 苹果 | 2017/12/22 |
氧化铝 | 2023/6/19 | LU燃油 | 2020/6/22 | 淀粉 | 2014/12/19 | 红枣 | 2019/4/30 |
国际铜 | 2020/11/19 | 沥青 | 2013/10/9 | 强麦 | 2003/3/28 | 集运欧线 | 2023/8/18 |
工业硅 | 2022/12/22 | 液化气 | 2020/3/30 | 粳米 | 2019/8/16 | ||
碳酸锂 | 2023/7/21 | PTA | 2006/12/18 | 早籼稻 | 2009/4/20 |
测试天数 | 从回测数据开始到结束的自然日 |
测试周期数 | 从回测数据开始到结束的K线根数 |
信号个数 | 信号出现的总个数 |
执行信号个数 | 信号执行的总个数 |
信号消失次数 | 信号消失的总次数 |
初始资金 | 初始化的资金 |
初始资金使用率 | 手数*每手保证金率*第一个信号的开仓价*交易单位/初始资金 |
最大资金使用率 | 在持仓周期内(开仓保证金/当前权益)的最大值 |
平均资金使用率 | ((开仓保证金/当前权益)求和)/持仓周期数 |
杠杆倍数 | 杠杆倍数 = 最大资金使用率 / 保证金率 |
回测期间最大权益 | 回测期间最大的权益 整个测试过程中每个周期已缴保证金+剩余可用资金+持仓浮盈所得结果中的最大值 |
回测期间最小权益 | 回测期间最小的权益 整个测试过程中每个周期已缴保证金+剩余可用资金+持仓浮盈所得结果中的最小值 |
最终权益 | 包括当前的可用资金和浮动盈亏 |
收益 | 总盈利-总亏损(已扣除手续费) |
收益率 | 收益/初始资金 |
年化单利收益率 | 收益率/(测试天数/365) |
月化单利收益率 | 收益率/(测试天数/30) |
年化复利收益率 | (最终权益/初始资金)^(365/测试天数)-1 |
月化复利收益率 | (最终权益/初始资金)^(30/测试天数)-1 |
平均保证金收益率 | (单次交易收益/开仓保证金)求和/交易次数 =(Σ((每次交易盈利数值-手续费)/保证金))/交易次数 |
扣除最大盈利后收益率 | (最终权益-最大盈利-初始资金)/初始资金 |
扣除最大亏损后收益率 | (最终权益+最大亏损-初始资金)/初始资金 |
夏普比率 |
(年化单利收益率-无风险利率)/收益率的标准离差率 计算公式:夏普比率=[E(Rp)-Rf]/σp; 其中: E(Rp):年化单利收益率 Rf:无风险利率(大约是1.5%) σp:收益率的标准差率(年化标准差率)=标准差率/sqrt (测试天数/365) 标准差率=标准离差/初始资金 |
索提诺比率 |
(年化单利收益率-无风险利率)/下行收益率标准差 其中: 年化单利收益率=收益率/(测试天数/365) 无风险利率=1.5% 下行收益率标准差=下行标准差率/sqrt(测试天数/365) 下行标准差率=下行标准离差/初始资金 下行标准离差= n=交易次数 r=每次收益 =平均收益 if r<,f(t)=1 if r>=,f(t)=0 |
权益离散度 | 权益离散度=单次盈亏的平方和/交易次数,再开方 |
权益离散系数 | 权益离散系数=权益离散度/初始资金*100% |
权益最大回撤 | 从回测开始到结束,动态权益计算出来的波段从高点到低点回撤的最大值 |
权益最大回撤时间 | 权益最大回撤出现的时间 |
权益最大回撤比率 | (权益回撤/权益回撤时的权益)的最大值 |
权益最大回撤比率时间 | 权益最大回撤比率出现的时间 |
权益最长未创新高周期数 | 权益最长未创新高周期数 |
权益最长未创新高时间段 | 权益最长未创新高时间段 |
损益最大回撤 | 从回测开始到结束,动态损益计算出来的波段从高点到低点回撤的最大值(损益最大回撤是以持仓等于0时的资金为标准计算的) |
损益最大回撤时间 | 损益最大回撤出现的时间 |
损益最大回撤比率 | (损益回撤/损益回撤时的权益)的最大值 |
损益最大回撤比率时间 | 损益最大回撤比率出现的时间 |
损益最长未创新高周期数 | 损益最长未创新高周期数 |
损益最长未创新高时间段 | 损益最长未创新高时间段 |
本金风险率 | (初始资金 - 回测期间最小权益)/初始资金 |
年化收益风险比率 | 年化单利收益率/本金风险率 |
胜率 | (盈利次数+持平次数)/交易次数 |
*盈亏比率 |
盈利交易的平均每次盈利/亏损交易的平均每次亏损 平均每次盈利 = 总盈利/盈利交易次数 平均每次亏损 = 总亏损/亏损交易次数 |
*平均每次盈利 | 平均每次盈利交易的盈利=总盈利/总盈利次数(计算手续费) |
*平均每次亏损 | 平均每次亏损交易的亏损=总亏损/总亏损次数(计算手续费) |
*平均每次盈利/权益最大回撤 | 平均每次盈利/权益最大回撤 |
*平均每次盈利率/平均每次亏损率 |
平均每次盈利率/平均每次亏损率 平均每次盈利率 = SUM(单次盈利率) / 计算单次盈利率次数 平均每次亏损率 = SUM(单次亏损率)/ 计算单次亏损率次数 单次盈利率 = 上一次持仓为0到今次持仓为0期间的盈利占初始资金的百分比 (盈利/初始资金) 单次亏损率 = 上一次持仓为0到今次持仓为0期间的亏损占初始资金的百分比 (亏损/初始资金) |
*平均每次收益/平均每次亏损 | 平均每次收益/平均每次亏损 |
平均每次收益 | 平均每笔交易的收益=(总盈利-总亏损)/ 交易笔数(总成交量的 1/2) |
最大每手盈利 | 每手盈利的最大值(每手盈利:对于每次交易,用该次交易的盈利值除以这次交易过程中的成交手数) |
最大每手亏损 | 每手亏损的最大值(每手亏损:对于每次交易,用该次交易的亏损值除以这次交易过程中的成交手数) |
平均每手每次收益 | 平均每手每次交易的收益 |
总盈利/总亏损 | 总盈利/总亏损 |
总盈利 | 盈利的总和 |
总亏损 | 亏损的总和 |
*单次最大盈利 | 单次交易盈利的最大值 |
*单次最大亏损 | 单次交易亏损的最大值 |
单次最大盈利占比率 | 单次最大盈利/总盈利 |
单次最大亏损占比率 | 单次最大亏损/总亏损 |
收益/单次最大盈利 | 收益/单次最大盈利 |
收益/单次最大亏损 | 收益/单次最大亏损 |
*交易次数 | 发生交易的次数 |
*盈利次数 | 盈利的交易次数 |
*亏损次数 | 亏损的交易次数 |
*持平次数 | 持平的交易次数 |
*最大持续盈利次数 | 最大持续盈利的次数 |
*最大持续盈利次数出现时间 | 最大持续盈利的次数出现的时间 |
*最大持续亏损次数 | 最大持续亏损的次数 |
*最大持续亏损次数出现时间 | 最大持续亏损的次数出现的时间 |
空仓周期数 | 空仓的周期数 |
最长连续空仓周期数 | 最长连续空仓的周期数 |
*最长持仓周期数 | 持仓最长周期数 |
平均持仓周期数 | 平均多少根K线发生一笔交易=测试周期数/交易次数 |
*平均盈利持仓周期数 | 平均多少根K线发生一笔盈利的交易=测试周期数/盈利次数 |
*平均亏损持仓周期数 | 平均多少根K线发生一笔亏损的交易=测试周期数/亏损次数 |
平均持仓手数 | 每根K线的总持仓的累加 / 持仓周期数 |
最大持仓手数 | 在持仓周期内持仓手数最大值 |
平均资金使用金额 | 开仓保证金求和/持仓周期数 |
最大资金使用金额 | 在持仓周期内,开仓保证金额最大值 |
最大资金使用金额时间 | 在持仓周期内,最大资金使用金额的时间点 |
手续费 | 手续费合计 |
手续费/收益 | 手续费合计/收益 |
滑点损耗 | 滑点损耗合计 |
滑点损耗/收益 | 滑点损耗合计/收益 |
成交额 | 成交额合计 成交额=成交价*(开仓或者平仓手数)*交易单位 |
模型得分 | 根据盈利能力、稳定性、风险暴露、敏感度计算的综合得分 |
If(F_FreshSig() == 1) //如果刷新到新信号 { COD = F_SigCode(); //信号合约 SGM = F_SigVol(); //信号手数 SGFLG = 1; //已出现新信号 } For X = 0 To BKN - 1 //遍历买开委托 { If(BKFLG[X] > 0) //如果有买开委托 { BKCM[X] = F_OrderFilledLot(BKID[X]); //买开成交手数 If(F_OrderStatus(BKID[X]) == Enum_Filled && BRP >= BKSM[X]) //如果买开委托成交 { If(BKFLG[X] == 1) //如果是BK信号买开委托 { Commentary("【买开:买开委托" + Text(X + 1) + "成交】"); } Else If(BKFLG[X] == 2) //如果是BPK信号买开委托 { Commentary("【买平开:买开委托" + Text(X + 1) + "成交】"); } Else If(BKFLG[X] == 3) //如果是SP信号买开委托 { Commentary("【卖平:买开委托" + Text(X + 1) + "成交】"); } BKFLG[X] = 0; //买开标志归0 BKDEL[X] = 0; //买开撤单标志归0 BKOFLG[BKDX[X]] = 0; //买开挂单标志归0 } Else If(F_OrderStatus(BKID[X]) == Enum_Canceled) //如果买开委托已撤 { If(BKDEL[X] == 1) //如果是追价撤单 { If(BKFLG[X] == 1) //如果是BK信号买开委托 { Commentary("【买开:买开委托" + Text(X + 1) + "已撤】"); } Else If(BKFLG[X] == 2) //如果是BPK信号买开委托 { Commentary("【买平开:买开委托" + Text(X + 1) + "已撤】"); } Else If(BKFLG[X] == 3) //如果是SP信号买开委托 { Commentary("【卖平:买开委托" + Text(X + 1) + "已撤】"); } BKM[X] = BKM[X] - BKCM[X]; //买开委托手数 If(BKM[X] > 0) //如果买开委托手数大于0 { BKP[X] = BKZP; //买开委托价格 If(BKFLG[X] == 1) //如果是BK信号买开委托 { Commentary("【买开:买开委托" + Text(X + 1) + "追价】"); } Else If(BKFLG[X] == 2) //如果是BPK信号买开委托 { Commentary("【买平开:买开委托" + Text(X + 1) + "追价】"); } Else If(BKFLG[X] == 3) //如果是SP信号买开委托 { Commentary("【卖平:买开委托" + Text(X + 1) + "追价】"); } Commentary("【盘口数据:卖一价=" + Text(ASKP) + ",卖一量=" + Text(ASKV) + "】"); Commentary("【盘口数据:买一价=" + Text(BIDP) + ",买一量=" + Text(BIDV) + "】"); Commentary("【买开委托:买开价格=" + Text(BKP[X]) + ",买开手数=" + Text(BKM[X]) + "】"); BKID[X] = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM[X],BKP[X]); //发出买开委托 BKT[X] = NOW; //买开委托时间 } } Else If(BKDEL[X] == 2 || BKDEL[X] == 3 || BKDEL[X] == 4) //如果是平仓信号撤单 { If(BKDLF == 1) //如果是SP信号撤单 { Commentary("【卖平:买开委托" + Text(X + 1) + "已撤】"); } Else If(BKDLF == 2) //如果是SPK信号撤单 { Commentary("【卖平开:买开委托" + Text(X + 1) + "已撤】"); } BKDM = BKDM + BKM[X] - BKCM[X]; //买开撤单手数 BKDP = IIF(BKDP == 0,BKP[X],Min(BKDP,BKP[X])); //买开重发价格 BKFLG[X] = 0; //买开标志归0 } BKDEL[X] = 0; //买开撤单标志归0 } Else If(F_OrderStatus(BKID[X]) == Enum_Declared || F_OrderStatus(BKID[X]) == Enum_FillPart) //如果买开委托挂单 { If(BKDEL[X] == 0) //如果未撤单 { If(ZJFLG == 1 && TimeDiff(BKT[X],NOW) >= ZJT && BKP[X] != RLP) //如果满足撤单条件 { If(BKFLG[X] == 1) //如果是BK信号买开委托 { Commentary("【买开:买开委托" + Text(X + 1) + "撤单】"); } Else If(BKFLG[X] == 2) //如果是BPK信号买开委托 { Commentary("【买平开:买开委托" + Text(X + 1) + "撤单】"); } Else If(BKFLG[X] == 3) //如果是SP信号买开委托 { Commentary("【卖平:买开委托" + Text(X + 1) + "撤单】"); } COD.F_DeleteOrder(F_OrderContractNo(BKID[X])); //撤掉买开委托挂单 BKDEL[X] = 1; //已发出撤掉买开委托挂单 } } Else If(BKDEL[X] == 3) //如果是平仓信号撤单 { If(BKDLF == 1) //如果是SP信号撤单买开委托 { Commentary("【卖平:买开委托" + Text(X + 1) + "撤单】"); } Else If(BKDLF == 2) //如果是SPK信号买开委托 { Commentary("【卖平开:买开委托" + Text(X + 1) + "撤单】"); } COD.F_DeleteOrder(F_OrderContractNo(BKID[X])); //撤掉买开委托挂单 BKDEL[X] = 4; //已发出撤掉买开委托挂单 } } Else If(F_OrderStatus(BKID[X]) == Enum_Deleted) //如果买开委托废单 { If(BKFLG[X] == 1) //如果是BK信号买开委托 { Commentary("【买开:买开委托" + Text(X + 1) + "废单】"); } Else If(BKFLG[X] == 2) //如果是BPK信号买开委托 { Commentary("【买平开:买开委托" + Text(X + 1) + "废单】"); } Else If(BKFLG[X] == 3) //如果是SP信号买开委托 { Commentary("【卖平:买开委托" + Text(X + 1) + "废单】"); } BKFLG[X] = 0; //买开标志归0 BKDEL[X] = 0; //买开撤单标志归0 } } }
Vars Global_String AID; //账号 Global_String COD; //合约编码 Numeric SIG; //下单信号 Numeric P; //数值比例 Numeric SH; //上海合约标志 Numeric BIDP,ASKP; //买卖一价 Numeric BIDV,ASKV; //买卖一量 Numeric BRP0,BRP1,BRP; //多头可用持仓 Numeric SRP0,SRP1,SRP; //空头可用持仓 Numeric OPFLG; //模型处理标志 Global_Numeric VLM; //交易手数 Global_Numeric KPFLG; //委托处理标志 Global_Numeric BKDFLG; //买开处理标志 Global_Numeric SKDFLG; //卖开处理标志 Global_Numeric BPDFLG; //买平处理标志 Global_Numeric SPDFLG; //卖平处理标志 Global_Numeric BKID,SKID; //开仓委托 Global_Numeric BKFLG,SKFLG; //开仓标志 Global_Numeric BKM,SKM; //开仓委托手数 Global_Numeric BKP,SKP; //开仓委托价格 Global_Numeric BPID0,BPID1,BPID; //买平委托 Global_Numeric SPID0,SPID1,SPID; //卖平委托 Global_Numeric BPFLG0,BPFLG1,BPFLG; //买平标志 Global_Numeric SPFLG0,SPFLG1,SPFLG; //卖平标志 Global_Numeric BPM0,BPM1,BPM; //买平委托手数 Global_Numeric SPM0,SPM1,SPM; //卖平委托手数 Global_Numeric BPP0,BPP1,BPP; //买平委托价格 Global_Numeric SPP0,SPP1,SPP; //卖平委托价格 Begin //------------------获取手动下单信息-----------------// If(1) { If(KPFLG == 0) //如果未开启委托处理 { AID = M_GetTradeAccount(0); //账号 COD = M_GetTradeContract(); //合约编码 SIG = M_GetTradeSig(); //下单信号 VLM = M_GetTradeVol(); //交易手数 If(VLM > 0 && COD.A_IsExchangeOpen() == 1) //如果交易手数大于0,且当前状态是开盘 { If(SIG == Sig_BK) //如果是买开 { Commentary("【" + COD + "买开:手动买开" + Text(VLM) + "手】"); BKDFLG = 1; //开启买开处理 } Else If(SIG == Sig_SP) //如果是卖平 { Commentary("【" + COD + "卖平:手动卖平" + Text(VLM) + "手】"); SPDFLG = 1; //开启卖平处理 } Else If(SIG == Sig_SK) //如果是卖开 { Commentary("【" + COD + "卖开:手动卖开" + Text(VLM) + "手】"); SKDFLG = 1; //开启卖开处理 } Else If(SIG == Sig_BP) //如果是买平 { Commentary("【" + COD + "买平:手动买平" + Text(VLM) + "手】"); BPDFLG = 1; //开启买平处理 } KPFLG = 1; //开启委托处理 } } If(KPFLG == 1 && COD.A_IsExchangeOpen() == 1) //如果已开启委托处理,且当前状态是开盘 { OPFLG = 1; //开启模型处理 } } //---------------------期货变量赋值---------------------// If(OPFLG == 1) { P = 0.5; //数值比例 BIDP = COD.Price("Bid1"); //买一价 ASKP = COD.Price("Ask1"); //卖一价 BIDV = COD.Price("BidVol1"); //买一量 ASKV = COD.Price("AskVol1"); //卖一量 SH = COD.A_IsSHCode(); //上海合约标志 BRP = COD.A_BuyRemainPosition(AID); //多头可用持仓 SRP = COD.A_SellRemainPosition(AID); //空头可用持仓 If(SH == 1) //如果是上期所合约 { BRP0 = COD.A_TodayBuyRemainPosition(AID); //多头今仓可用持仓 SRP0 = COD.A_TodaySellRemainPosition(AID); //空头今仓可用持仓 BRP1 = BRP - BRP0; //多头老仓可用持仓 SRP1 = SRP - SRP0; //空头老仓可用持仓 } } //------------------查询组件当前任务-----------------// If(OPFLG == 1) { If(BKFLG == 1) //如果有买开委托 { If(F_OrderStatus(BKID) == Enum_Filled) //如果买开委托成交 { Commentary("【" + COD + "买开:买开委托成交】"); VLM = VLM - BKM; //买开手数 BKFLG = 0; //买开标志归0 } } If(SH == 1) //如果是上期所合约 { If(SPFLG0 == 1) //如果有卖平今仓委托 { If(F_OrderStatus(SPID0) == Enum_Filled) //如果卖平今仓委托成交 { Commentary("【" + COD + "卖平:卖平今仓委托成交】"); VLM = VLM - SPM0; //卖平手数 SPFLG0 = 0; //卖平今仓标志归0 } } If(SPFLG1 == 1) //如果有卖平老仓委托 { If(F_OrderStatus(SPID1) == Enum_Filled) //如果卖平老仓委托成交 { Commentary("【" + COD + "卖平:卖平老仓委托成交】"); VLM = VLM - SPM1; //卖平手数 SPFLG1 = 0; //卖平老仓标志归0 } } } Else //如果非上期所合约 { If(SPFLG == 1) //如果有卖平委托 { If(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交 { Commentary("【" + COD + "卖平:卖平委托成交】"); VLM = VLM - SPM; //卖平手数 SPFLG = 0; //卖平标志归0 } } } If(SKFLG == 1) //如果有卖开委托 { If(F_OrderStatus(SKID) == Enum_Filled) //如果卖开委托成交 { Commentary("【" + COD + "卖开:卖开委托成交】"); VLM = VLM - SKM; //卖开手数 SKFLG = 0; //卖开标志归0 } } If(SH == 1) //如果是上期所合约 { If(BPFLG0 == 1) //如果有买平今仓委托 { If(F_OrderStatus(BPID0) == Enum_Filled) //如果买平今仓委托成交 { Commentary("【" + COD + "买平:买平今仓委托成交】"); VLM = VLM - BPM0; //买平手数 BPFLG0 = 0; //买平今仓标志归0 } } If(BPFLG1 == 1) //如果有买平老仓委托 { If(F_OrderStatus(BPID1) == Enum_Filled) //如果买平老仓委托成交 { Commentary("【" + COD + "买平:买平老仓委托成交】"); VLM = VLM - BPM1; //买平手数 BPFLG1 = 0; //买平老仓标志归0 } } } Else //如果非上期所合约 { If(BPFLG == 1) //如果有买平委托 { If(F_OrderStatus(BPID) == Enum_Filled) //如果买平委托成交 { Commentary("【" + COD + "买平:买平委托成交】"); VLM = VLM - BPM; //买平手数 BPFLG = 0; //买平标志归0 } } } } //------------------------委托发出------------------------// If(OPFLG == 1) { //---------------------买开委托处理--------------------// If(BKDFLG == 1) //如果已开启买开处理 { If(BKFLG == 0) //如果没有买开委托 { //------------------------买开委托发出------------------------// If(1) { BKM = Min(Ceiling(P * ASKV,1),VLM); //买开委托手数 If(BKM > 0) //如果买开委托手数大于0 { BKP = ASKP; //买开委托价格 Commentary("【" + COD + "买开:公式买开" + Text(BKM) + "手】"); Commentary("【" + COD + "买开:买开委托发出】"); BKID = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP,AID); //发出买开委托 BKFLG = 1; //已发出买开委托 } Else If(BKM == 0) //如果买开委托手数等于0 { Commentary("【" + COD + "买开:买开委托完成】"); Exit(); //退出公式 } } } } //---------------------卖平委托处理--------------------// If(SPDFLG > 0) //如果已开启卖平处理 { If(SPFLG0 == 0 && SPFLG1 == 0 && SPFLG == 0) //如果没有卖平委托 { //------------------------卖平委托发出------------------------// If(1) { SPM = Min(Ceiling(P * BIDV,1),VLM); //卖平委托手数 If(BRP > 0 && SPM > 0) //如果有多头可用持仓,且卖平委托手数大于0 { If(SH == 1) //如果是上期所合约 { If(BRP0 > 0) //如果有多头今仓可用持仓 { SPM0 = Min(SPM,BRP0); //卖平今仓委托手数 SPM1 = Min(SPM - SPM0,BRP1); //卖平老仓委托手数 SPP0 = BIDP; //卖平今仓委托价格 Commentary("【" + COD + "卖平:公式卖平今仓" + Text(SPM0) + "手】"); Commentary("【" + COD + "卖平:卖平今仓委托发出】"); SPID0 = COD.A_SendOrder(Enum_Sell,Enum_ExitToday,SPM0,SPP0,AID); //发出卖平今仓委托 SPFLG0 = 1; //已发出卖平今仓委托 } Else If(BRP0 == 0) //如果没有多头今仓可用持仓 { SPM1 = Min(SPM,BRP1); //卖平老仓委托手数 } If(BRP1 > 0 && SPM1 > 0) //如果有多头老仓可用持仓,且卖平老仓委托手数大于0 { SPP1 = BIDP; //卖平老仓委托价格 Commentary("【" + COD + "卖平:公式卖平老仓" + Text(SPM1) + "手】"); Commentary("【" + COD + "卖平:卖平老仓委托发出】"); SPID1 = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM1,SPP1,AID); //发出卖平老仓委托 SPFLG1 = 1; //已发出卖平老仓委托 } } Else //如果非上期所合约 { SPM = Min(SPM,BRP); //卖平委托手数 SPP = BIDP; //卖平委托价格 Commentary("【" + COD + "卖平:公式卖平" + Text(SPM) + "手】"); Commentary("【" + COD + "卖平:卖平委托发出】"); SPID = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM,SPP,AID); //发出卖平委托 SPFLG = 1; //已发出卖平委托 } } Else If(BRP == 0 || SPM == 0) //如果没有多头可用持仓,或卖平委托手数等于0 { Commentary("【" + COD + "卖平:卖平委托完成】"); Exit(); //退出公式 } } } } //---------------------卖开委托处理--------------------// If(SKDFLG == 1) //如果已开启卖开处理 { If(SKFLG == 0) //如果没有卖开委托 { //------------------------卖开委托发出------------------------// If(1) { SKM = Min(Ceiling(P * BIDV,1),VLM); //卖开委托手数 If(SKM > 0) //如果卖开委托手数大于0 { SKP = BIDP; //卖开委托价格 Commentary("【" + COD + "卖开:公式卖开" + Text(SKM) + "手】"); Commentary("【" + COD + "卖开:卖开委托发出】"); SKID = COD.A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP,AID); //发出卖开委托 SKFLG = 1; //已发出卖开委托 } Else If(SKM == 0) //如果卖开委托手数等于0 { Commentary("【" + COD + "卖开:卖开委托完成】"); Exit(); //退出公式 } } } } //---------------------买平委托处理--------------------// If(BPDFLG > 0) //如果已开启买平处理 { If(BPFLG0 == 0 && BPFLG1 == 0 && BPFLG == 0) //如果没有买平委托 { //------------------------买平委托发出------------------------// If(1) { BPM = Min(Ceiling(P * ASKV,1),VLM); //买平委托手数 If(SRP > 0 && BPM > 0) //如果有空头可用持仓,且买平委托手数大于0 { If(SH == 1) //如果是上期所合约 { If(SRP0 > 0) //如果有空头今仓可用持仓 { BPM0 = Min(BPM,SRP0); //买平今仓委托手数 BPM1 = Min(BPM - BPM0,SRP1); //买平老仓委托手数 BPP0 = ASKP; //买平今仓委托价格 Commentary("【" + COD + "买平:公式买平今仓" + Text(BPM0) + "手】"); Commentary("【" + COD + "买平:买平今仓委托发出】"); BPID0 = COD.A_SendOrder(Enum_Buy,Enum_ExitToday,BPM0,BPP0,AID); //发出买平今仓委托 BPFLG0 = 1; //已发出买平今仓委托 } Else If(SRP0 == 0) //如果没有空头今仓可用持仓 { BPM1 = Min(BPM,SRP1); //买平老仓委托手数 } If(SRP1 > 0 && BPM1 > 0) //如果有空头老仓可用持仓,且买平老仓委托手数大于0 { BPP1 = ASKP; //买平老仓委托价格 Commentary("【" + COD + "买平:公式买平老仓" + Text(BPM1) + "手】"); Commentary("【" + COD + "买平:买平老仓委托发出】"); BPID1 = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM1,BPP1,AID); //发出买平老仓委托 BPFLG1 = 1; //已发出买平老仓委托 } } Else //如果非上期所合约 { BPM = Min(BPM,SRP); //买平委托手数 BPP = ASKP; //买平委托价格 Commentary("【" + COD + "买平:公式买平" + Text(BPM) + "手】"); Commentary("【" + COD + "买平:买平委托发出】"); BPID = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM,BPP,AID); //发出买平委托 BPFLG = 1; //已发出买平委托 } } Else If(SRP == 0 || BPM == 0) //如果没有空头可用持仓,或买平委托手数等于0 { Commentary("【" + COD + "买平:买平委托完成】"); Exit(); //退出公式 } } } } } End
Vars Global_String AID; //账号 Global_String COD; //合约编码 Numeric SIG; //下单信号 Numeric SH; //上海合约标志 Numeric BIDP,ASKP; //买卖一价 Numeric BIDV,ASKV; //买卖一量 Numeric BRP0,BRP1,BRP; //多头可用持仓 Numeric SRP0,SRP1,SRP; //空头可用持仓 Numeric OPFLG; //模型处理标志 Global_Numeric VLM; //交易手数 Global_Numeric KPFLG; //委托处理标志 Global_Numeric BKDFLG; //买开处理标志 Global_Numeric SKDFLG; //卖开处理标志 Global_Numeric BPDFLG; //买平处理标志 Global_Numeric SPDFLG; //卖平处理标志 Global_Numeric BKID,SKID; //开仓委托 Global_Numeric BKFLG,SKFLG; //开仓标志 Global_Numeric BKDEL,SKDEL; //开仓撤单标志 Global_Numeric BKCM,SKCM; //开仓成交手数 Global_Numeric BKM,SKM; //开仓委托手数 Global_Numeric BKP,SKP; //开仓委托价格 Global_Numeric BPID0,BPID1,BPID; //买平委托 Global_Numeric SPID0,SPID1,SPID; //卖平委托 Global_Numeric BPFLG0,BPFLG1,BPFLG; //买平标志 Global_Numeric SPFLG0,SPFLG1,SPFLG; //卖平标志 Global_Numeric BPDEL0,BPDEL1,BPDEL; //买平撤单标志 Global_Numeric SPDEL0,SPDEL1,SPDEL; //卖平撤单标志 Global_Numeric BPCM0,BPCM1,BPCM; //买平成交手数 Global_Numeric SPCM0,SPCM1,SPCM; //卖平成交手数 Global_Numeric BPM0,BPM1,BPM; //买平委托手数 Global_Numeric SPM0,SPM1,SPM; //卖平委托手数 Global_Numeric BPP0,BPP1,BPP; //买平委托价格 Global_Numeric SPP0,SPP1,SPP; //卖平委托价格 Begin //------------------获取手动下单信息-----------------// If(1) { If(KPFLG == 0) //如果未开启委托处理 { AID = M_GetTradeAccount(0); //账号 COD = M_GetTradeContract(); //合约编码 SIG = M_GetTradeSig(); //下单信号 VLM = M_GetTradeVol(); //交易手数 If(VLM > 0 && COD.A_IsExchangeOpen() == 1) //如果交易手数大于0,且当前状态是开盘 { If(SIG == Sig_BK) //如果是买开 { Commentary("【" + COD + "买开:手动买开" + Text(VLM) + "手】"); BKDFLG = 1; //开启买开处理 } Else If(SIG == Sig_SP) //如果是卖平 { Commentary("【" + COD + "卖平:手动卖平" + Text(VLM) + "手】"); SPDFLG = 1; //开启卖平处理 } Else If(SIG == Sig_SK) //如果是卖开 { Commentary("【" + COD + "卖开:手动卖开" + Text(VLM) + "手】"); SKDFLG = 1; //开启卖开处理 } Else If(SIG == Sig_BP) //如果是买平 { Commentary("【" + COD + "买平:手动买平" + Text(VLM) + "手】"); BPDFLG = 1; //开启买平处理 } KPFLG = 1; //开启委托处理 } } If(KPFLG == 1 && COD.A_IsExchangeOpen() == 1) //如果已开启委托处理,且当前状态是开盘 { OPFLG = 1; //开启模型处理 } } //---------------------期货变量赋值---------------------// If(OPFLG == 1) { BIDP = COD.Price("Bid1"); //买一价 ASKP = COD.Price("Ask1"); //卖一价 BIDV = COD.Price("BidVol1"); //买一量 ASKV = COD.Price("AskVol1"); //卖一量 SH = COD.A_IsSHCode(); //上海合约标志 BRP = COD.A_BuyRemainPosition(AID); //多头可用持仓 SRP = COD.A_SellRemainPosition(AID); //空头可用持仓 If(SH == 1) //如果是上期所合约 { BRP0 = COD.A_TodayBuyRemainPosition(AID); //多头今仓可用持仓 SRP0 = COD.A_TodaySellRemainPosition(AID); //空头今仓可用持仓 BRP1 = BRP - BRP0; //多头老仓可用持仓 SRP1 = SRP - SRP0; //空头老仓可用持仓 } } //------------------查询组件当前任务-----------------// If(OPFLG == 1) { If(BKFLG == 1) //如果有买开委托 { If(F_OrderStatus(BKID) == Enum_Filled) //如果买开委托成交 { Commentary("【" + COD + "买开:买开委托成交】"); VLM = VLM - BKM; //买开手数 BKFLG = 0; //买开标志归0 BKDEL = 0; //买开撤单标志归0 } Else If(F_OrderStatus(BKID) == Enum_Canceled) //如果买开委托已撤 { Commentary("【" + COD + "买开:买开委托已撤】"); BKCM = F_OrderFilledLot(BKID); //买开成交手数 If(BKCM > 0) //如果买开委托部分成交 { BKM = BKM - BKCM; //买开委托手数 VLM = VLM - BKCM; //买开手数 } BKM = Min(ASKV,BKM); //买开委托手数 If(BKM > 0) //如果买开委托手数大于0 { BKP = ASKP; //买开委托价格 Commentary("【" + COD + "买开:公式买开" + Text(BKM) + "手】"); Commentary("【" + COD + "买开:买开委托追价】"); BKID = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP,AID); //发出买开委托 } BKDEL = 0; //买开撤单标志归0 } Else If(F_OrderStatus(BKID) == Enum_Declared || F_OrderStatus(BKID) == Enum_FillPart) //如果买开委托挂单 { If(BKDEL == 0) //如果未撤单 { If(ASKP != BKP) //如果满足撤单条件 { Commentary("【" + COD + "买开:买开委托撤单】"); COD.F_DeleteOrder(F_OrderContractNo(BKID),AID); //撤掉买开委托挂单 BKDEL = 1; //已发出撤掉买开委托挂单 } } } } If(SH == 1) //如果是上期所合约 { If(SPFLG0 == 1) //如果有卖平今仓委托 { If(F_OrderStatus(SPID0) == Enum_Filled) //如果卖平今仓委托成交 { Commentary("【" + COD + "卖平:卖平今仓委托成交】"); VLM = VLM - SPM0; //卖平手数 SPFLG0 = 0; //卖平今仓标志归0 SPDEL0 = 0; //卖平今仓撤单标志归0 } Else If(F_OrderStatus(SPID0) == Enum_Canceled) //如果卖平今仓委托已撤 { Commentary("【" + COD + "卖平:卖平今仓委托已撤】"); SPCM0 = F_OrderFilledLot(SPID0); //卖平今仓成交手数 If(SPCM0 > 0) //如果卖平今仓委托部分成交 { SPM0 = SPM0 - SPCM0; //卖平今仓委托手数 VLM = VLM - SPCM0; //卖平手数 } SPM0 = Min1(BRP0,BIDV,SPM0); //卖平今仓委托手数 If(BRP0 > 0 && SPM0 > 0) //如果有多头今仓可用持仓,且卖平今仓委托手数大于0 { SPP0 = BIDP; //卖平今仓委托价格 Commentary("【" + COD + "卖平:公式卖平今仓" + Text(SPM0) + "手】"); Commentary("【" + COD + "卖平:卖平今仓委托追价】"); SPID0 = COD.A_SendOrder(Enum_Sell,Enum_ExitToday,SPM0,SPP0,AID); //发出卖平今仓委托 } SPDEL0 = 0; //卖平今仓撤单标志归0 } Else If(F_OrderStatus(SPID0) == Enum_Declared || F_OrderStatus(SPID0) == Enum_FillPart) //如果卖平今仓委托挂单 { If(SPDEL0 == 0) //如果未撤单 { If(BIDP != SPP0) //如果满足撤单条件 { Commentary("【" + COD + "卖平:卖平今仓委托撤单】"); COD.F_DeleteOrder(F_OrderContractNo(SPID0),AID); //撤掉卖平今仓委托挂单 SPDEL0 = 1; //已发出撤掉卖平今仓委托挂单 } } } } If(SPFLG1 == 1) //如果有卖平老仓委托 { If(F_OrderStatus(SPID1) == Enum_Filled) //如果卖平老仓委托成交 { Commentary("【" + COD + "卖平:卖平老仓委托成交】"); VLM = VLM - SPM1; //卖平手数 SPFLG1 = 0; //卖平老仓标志归0 SPDEL1 = 0; //卖平老仓撤单标志归0 } Else If(F_OrderStatus(SPID1) == Enum_Canceled) //如果卖平老仓委托已撤 { Commentary("【" + COD + "卖平:卖平老仓委托已撤】"); SPCM1 = F_OrderFilledLot(SPID1); //卖平老仓成交手数 If(SPCM1 > 0) //如果卖平老仓委托部分成交 { SPM1 = SPM1 - SPCM1; //卖平老仓委托手数 VLM = VLM - SPCM1; //卖平手数 } SPM1 = Min1(BRP1,BIDV,SPM1); //卖平老仓委托手数 If(BRP1 > 0 && SPM1 > 0) //如果有多头老仓可用持仓,且卖平老仓委托手数大于0 { SPP1 = BIDP; //卖平老仓委托价格 Commentary("【" + COD + "卖平:公式卖平老仓" + Text(SPM1) + "手】"); Commentary("【" + COD + "卖平:卖平老仓委托追价】"); SPID1 = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM1,SPP1,AID); //发出卖平老仓委托 } SPDEL1 = 0; //卖平老仓撤单标志归0 } Else If(F_OrderStatus(SPID1) == Enum_Declared || F_OrderStatus(SPID1) == Enum_FillPart) //如果卖平老仓委托挂单 { If(SPDEL1 == 0) //如果未撤单 { If(BIDP != SPP1) //如果满足撤单条件 { Commentary("【" + COD + "卖平:卖平老仓委托撤单】"); COD.F_DeleteOrder(F_OrderContractNo(SPID1),AID); //撤掉卖平老仓委托挂单 SPDEL1 = 1; //已发出撤掉卖平老仓委托挂单 } } } } } Else //如果非上期所合约 { If(SPFLG == 1) //如果有卖平委托 { If(F_OrderStatus(SPID) == Enum_Filled) //如果卖平委托成交 { Commentary("【" + COD + "卖平:卖平委托成交】"); VLM = VLM - SPM; //卖平手数 SPFLG = 0; //卖平标志归0 SPDEL = 0; //卖平撤单标志归0 } Else If(F_OrderStatus(SPID) == Enum_Canceled) //如果卖平委托已撤 { Commentary("【" + COD + "卖平:卖平委托已撤】"); SPCM = F_OrderFilledLot(SPID); //卖平成交手数 If(SPCM > 0) //如果卖平委托部分成交 { SPM = SPM - SPCM; //卖平委托手数 VLM = VLM - SPCM; //卖平手数 } SPM = Min1(BRP,BIDV,SPM); //卖平委托手数 If(BRP > 0 && SPM > 0) //如果有多头可用持仓,且卖平委托手数大于0 { SPP = BIDP; //卖平委托价格 Commentary("【" + COD + "卖平:公式卖平" + Text(SPM) + "手】"); Commentary("【" + COD + "卖平:卖平委托追价】"); SPID = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM,SPP,AID); //发出卖平委托 } SPDEL = 0; //卖平撤单标志归0 } Else If(F_OrderStatus(SPID) == Enum_Declared || F_OrderStatus(SPID) == Enum_FillPart) //如果卖平委托挂单 { If(SPDEL == 0) //如果未撤单 { If(BIDP != SPP) //如果满足撤单条件 { Commentary("【" + COD + "卖平:卖平委托撤单】"); COD.F_DeleteOrder(F_OrderContractNo(SPID),AID); //撤掉卖平委托挂单 SPDEL = 1; //已发出撤掉卖平委托挂单 } } } } } If(SKFLG == 1) //如果有卖开委托 { If(F_OrderStatus(SKID) == Enum_Filled) //如果卖开委托成交 { Commentary("【" + COD + "卖开:卖开委托成交】"); VLM = VLM - SKM; //卖开手数 SKFLG = 0; //卖开标志归0 SKDEL = 0; //卖开撤单标志归0 } Else If(F_OrderStatus(SKID) == Enum_Canceled) //如果卖开委托已撤 { Commentary("【" + COD + "卖开:卖开委托已撤】"); SKCM = F_OrderFilledLot(SKID); //卖开成交手数 If(SKCM > 0) //如果卖开委托部分成交 { SKM = SKM - SKCM; //卖开委托手数 VLM = VLM - SKCM; //卖开手数 } SKM = Min(BIDV,SKM); //卖开委托手数 If(SKM > 0) //如果卖开委托手数大于0 { SKP = BIDP; //卖开委托价格 Commentary("【" + COD + "卖开:公式卖开" + Text(SKM) + "手】"); Commentary("【" + COD + "卖开:卖开委托追价】"); SKID = COD.A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP,AID); //发出卖开委托 } SKDEL = 0; //卖开撤单标志归0 } Else If(F_OrderStatus(SKID) == Enum_Declared || F_OrderStatus(SKID) == Enum_FillPart) //如果卖开委托挂单 { If(SKDEL == 0) //如果未撤单 { If(BIDP != SKP) //如果满足撤单条件 { Commentary("【" + COD + "卖开:卖开委托撤单】"); COD.F_DeleteOrder(F_OrderContractNo(SKID),AID); //撤掉卖开委托挂单 SKDEL = 1; //已发出撤掉卖开委托挂单 } } } } If(SH == 1) //如果是上期所合约 { If(BPFLG0 == 1) //如果有买平今仓委托 { If(F_OrderStatus(BPID0) == Enum_Filled) //如果买平今仓委托成交 { Commentary("【" + COD + "买平:买平今仓委托成交】"); VLM = VLM - BPM0; //买平手数 BPFLG0 = 0; //买平今仓标志归0 BPDEL0 = 0; //买平今仓撤单标志归0 } Else If(F_OrderStatus(BPID0) == Enum_Canceled) //如果买平今仓委托已撤 { Commentary("【" + COD + "买平:买平今仓委托已撤】"); BPCM0 = F_OrderFilledLot(BPID0); //买平今仓成交手数 If(BPCM0 > 0) //如果买平今仓委托部分成交 { BPM0 = BPM0 - BPCM0; //买平今仓委托手数 VLM = VLM - BPCM0; //买平手数 } BPM0 = Min1(SRP0,ASKV,BPM0); //买平今仓委托手数 If(SRP0 > 0 && BPM0 > 0) //如果有空头今仓可用持仓,且买平今仓委托手数大于0 { BPP0 = ASKP; //买平今仓委托价格 Commentary("【" + COD + "买平:公式买平今仓" + Text(BPM0) + "手】"); Commentary("【" + COD + "买平:买平今仓委托追价】"); BPID0 = COD.A_SendOrder(Enum_Buy,Enum_ExitToday,BPM0,BPP0,AID); //发出买平今仓委托 } BPDEL0 = 0; //买平今仓撤单标志归0 } Else If(F_OrderStatus(BPID0) == Enum_Declared || F_OrderStatus(BPID0) == Enum_FillPart) //如果买平今仓委托挂单 { If(BPDEL0 == 0) //如果未撤单 { If(ASKP != BPP0) //如果满足撤单条件 { Commentary("【" + COD + "买平:买平今仓委托撤单】"); COD.F_DeleteOrder(F_OrderContractNo(BPID0),AID); //撤掉买平今仓委托挂单 BPDEL0 = 1; //已发出撤掉买平今仓委托挂单 } } } } If(BPFLG1 == 1) //如果有买平老仓委托 { If(F_OrderStatus(BPID1) == Enum_Filled) //如果买平老仓委托成交 { Commentary("【" + COD + "买平:买平老仓委托成交】"); VLM = VLM - BPM1; //买平手数 BPFLG1 = 0; //买平老仓标志归0 BPDEL1 = 0; //买平老仓撤单标志归0 } Else If(F_OrderStatus(BPID1) == Enum_Canceled) //如果买平老仓委托已撤 { Commentary("【" + COD + "买平:买平老仓委托已撤】"); BPCM1 = F_OrderFilledLot(BPID1); //买平老仓成交手数 If(BPCM1 > 0) //如果买平老仓委托部分成交 { BPM1 = BPM1 - BPCM1; //买平老仓委托手数 VLM = VLM - BPCM1; //买平手数 } BPM1 = Min1(SRP1,ASKV,BPM1); //买平老仓委托手数 If(SRP1 > 0 && BPM1 > 0) //如果有空头老仓可用持仓,且买平老仓委托手数大于0 { BPP1 = ASKP; //买平老仓委托价格 Commentary("【" + COD + "买平:公式买平老仓" + Text(BPM1) + "手】"); Commentary("【" + COD + "买平:买平老仓委托追价】"); BPID1 = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM1,BPP1,AID); //发出买平老仓委托 } BPDEL1 = 0; //买平老仓撤单标志归0 } Else If(F_OrderStatus(BPID1) == Enum_Declared || F_OrderStatus(BPID1) == Enum_FillPart) //如果买平老仓委托挂单 { If(BPDEL1 == 0) //如果未撤单 { If(ASKP != BPP1) //如果满足撤单条件 { Commentary("【" + COD + "买平:买平老仓委托撤单】"); COD.F_DeleteOrder(F_OrderContractNo(BPID1),AID); //撤掉买平老仓委托挂单 BPDEL1 = 1; //已发出撤掉买平老仓委托挂单 } } } } } Else //如果非上期所合约 { If(BPFLG == 1) //如果有买平委托 { If(F_OrderStatus(BPID) == Enum_Filled) //如果买平委托成交 { Commentary("【" + COD + "买平:买平委托成交】"); VLM = VLM - BPM; //买平手数 BPFLG = 0; //买平标志归0 BPDEL = 0; //买平撤单标志归0 } Else If(F_OrderStatus(BPID) == Enum_Canceled) //如果买平委托已撤 { Commentary("【" + COD + "买平:买平委托已撤】"); BPCM = F_OrderFilledLot(BPID); //买平成交手数 If(BPCM > 0) //如果买平委托部分成交 { BPM = BPM - BPCM; //买平委托手数 VLM = VLM - BPCM; //买平手数 } BPM = Min1(SRP,ASKV,BPM); //买平委托手数 If(SRP > 0 && BPM > 0) //如果有空头可用持仓,且买平委托手数大于0 { BPP = ASKP; //买平委托价格 Commentary("【" + COD + "买平:公式买平" + Text(BPM) + "手】"); Commentary("【" + COD + "买平:买平委托追价】"); BPID = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM,BPP,AID); //发出买平委托 } BPDEL = 0; //买平撤单标志归0 } Else If(F_OrderStatus(BPID) == Enum_Declared || F_OrderStatus(BPID) == Enum_FillPart) //如果买平委托挂单 { If(BPDEL == 0) //如果未撤单 { If(ASKP != BPP) //如果满足撤单条件 { Commentary("【" + COD + "买平:买平委托撤单】"); COD.F_DeleteOrder(F_OrderContractNo(BPID),AID); //撤掉买平委托挂单 BPDEL = 1; //已发出撤掉买平委托挂单 } } } } } } //------------------------委托发出------------------------// If(OPFLG == 1) { //---------------------买开委托处理--------------------// If(BKDFLG == 1) //如果已开启买开处理 { If(BKFLG == 0) //如果没有买开委托 { //------------------------买开委托发出------------------------// If(1) { BKM = Min(ASKV,VLM); //买开委托手数 If(BKM > 0) //如果买开委托手数大于0 { BKP = ASKP; //买开委托价格 Commentary("【" + COD + "买开:公式买开" + Text(BKM) + "手】"); Commentary("【" + COD + "买开:买开委托发出】"); BKID = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM,BKP,AID); //发出买开委托 BKFLG = 1; //已发出买开委托 } Else If(BKM == 0) //如果买开委托手数等于0 { Commentary("【" + COD + "买开:买开委托完成】"); Exit(); //退出公式 } } } } //---------------------卖平委托处理--------------------// If(SPDFLG > 0) //如果已开启卖平处理 { If(SPFLG0 == 0 && SPFLG1 == 0 && SPFLG == 0) //如果没有卖平委托 { //------------------------卖平委托发出------------------------// If(1) { SPM = Min(BIDV,VLM); //卖平委托手数 If(BRP > 0 && SPM > 0) //如果有多头可用持仓,且卖平委托手数大于0 { If(SH == 1) //如果是上期所合约 { If(BRP0 > 0) //如果有多头今仓可用持仓 { SPM0 = Min(SPM,BRP0); //卖平今仓委托手数 SPM1 = Min(SPM - SPM0,BRP1); //卖平老仓委托手数 SPP0 = BIDP; //卖平今仓委托价格 Commentary("【" + COD + "卖平:公式卖平今仓" + Text(SPM0) + "手】"); Commentary("【" + COD + "卖平:卖平今仓委托发出】"); SPID0 = COD.A_SendOrder(Enum_Sell,Enum_ExitToday,SPM0,SPP0,AID); //发出卖平今仓委托 SPFLG0 = 1; //已发出卖平今仓委托 } Else If(BRP0 == 0) //如果没有多头今仓可用持仓 { SPM1 = Min(SPM,BRP1); //卖平老仓委托手数 } If(BRP1 > 0 && SPM1 > 0) //如果有多头老仓可用持仓,且卖平老仓委托手数大于0 { SPP1 = BIDP; //卖平老仓委托价格 Commentary("【" + COD + "卖平:公式卖平老仓" + Text(SPM1) + "手】"); Commentary("【" + COD + "卖平:卖平老仓委托发出】"); SPID1 = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM1,SPP1,AID); //发出卖平老仓委托 SPFLG1 = 1; //已发出卖平老仓委托 } } Else //如果非上期所合约 { SPM = Min(SPM,BRP); //卖平委托手数 SPP = BIDP; //卖平委托价格 Commentary("【" + COD + "卖平:公式卖平" + Text(SPM) + "手】"); Commentary("【" + COD + "卖平:卖平委托发出】"); SPID = COD.A_SendOrder(Enum_Sell,Enum_Exit,SPM,SPP,AID); //发出卖平委托 SPFLG = 1; //已发出卖平委托 } } Else If(BRP == 0 || SPM == 0) //如果没有多头可用持仓,或卖平委托手数等于0 { Commentary("【" + COD + "卖平:卖平委托完成】"); Exit(); //退出公式 } } } } //---------------------卖开委托处理--------------------// If(SKDFLG == 1) //如果已开启卖开处理 { If(SKFLG == 0) //如果没有卖开委托 { //------------------------卖开委托发出------------------------// If(1) { SKM = Min(BIDV,VLM); //卖开委托手数 If(SKM > 0) //如果卖开委托手数大于0 { SKP = BIDP; //卖开委托价格 Commentary("【" + COD + "卖开:公式卖开" + Text(SKM) + "手】"); Commentary("【" + COD + "卖开:卖开委托发出】"); SKID = COD.A_SendOrder(Enum_Sell,Enum_Entry,SKM,SKP,AID); //发出卖开委托 SKFLG = 1; //已发出卖开委托 } Else If(SKM == 0) //如果卖开委托手数等于0 { Commentary("【" + COD + "卖开:卖开委托完成】"); Exit(); //退出公式 } } } } //---------------------买平委托处理--------------------// If(BPDFLG > 0) //如果已开启买平处理 { If(BPFLG0 == 0 && BPFLG1 == 0 && BPFLG == 0) //如果没有买平委托 { //------------------------买平委托发出------------------------// If(1) { BPM = Min(ASKV,VLM); //买平委托手数 If(SRP > 0 && BPM > 0) //如果有空头可用持仓,且买平委托手数大于0 { If(SH == 1) //如果是上期所合约 { If(SRP0 > 0) //如果有空头今仓可用持仓 { BPM0 = Min(BPM,SRP0); //买平今仓委托手数 BPM1 = Min(BPM - BPM0,SRP1); //买平老仓委托手数 BPP0 = ASKP; //买平今仓委托价格 Commentary("【" + COD + "买平:公式买平今仓" + Text(BPM0) + "手】"); Commentary("【" + COD + "买平:买平今仓委托发出】"); BPID0 = COD.A_SendOrder(Enum_Buy,Enum_ExitToday,BPM0,BPP0,AID); //发出买平今仓委托 BPFLG0 = 1; //已发出买平今仓委托 } Else If(SRP0 == 0) //如果没有空头今仓可用持仓 { BPM1 = Min(BPM,SRP1); //买平老仓委托手数 } If(SRP1 > 0 && BPM1 > 0) //如果有空头老仓可用持仓,且买平老仓委托手数大于0 { BPP1 = ASKP; //买平老仓委托价格 Commentary("【" + COD + "买平:公式买平老仓" + Text(BPM1) + "手】"); Commentary("【" + COD + "买平:买平老仓委托发出】"); BPID1 = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM1,BPP1,AID); //发出买平老仓委托 BPFLG1 = 1; //已发出买平老仓委托 } } Else //如果非上期所合约 { BPM = Min(BPM,SRP); //买平委托手数 BPP = ASKP; //买平委托价格 Commentary("【" + COD + "买平:公式买平" + Text(BPM) + "手】"); Commentary("【" + COD + "买平:买平委托发出】"); BPID = COD.A_SendOrder(Enum_Buy,Enum_Exit,BPM,BPP,AID); //发出买平委托 BPFLG = 1; //已发出买平委托 } } Else If(SRP == 0 || BPM == 0) //如果没有空头可用持仓,或买平委托手数等于0 { Commentary("【" + COD + "买平:买平委托完成】"); Exit(); //退出公式 } } } } } End
Vars Global_StringArray AID; //账号 Global_String COD; //合约编码 Numeric SIG; //下单信号 Numeric VLM; //交易手数 Numeric X; //循环变量 Numeric T; //时间间隔 Numeric P; //数值比例 Numeric NOW; //当前时间 Numeric ASKP; //卖一价 Numeric ASKV; //卖一量 Numeric ODFLG; //挂单判断标志 Numeric OPFLG; //模型处理标志 Global_Numeric ADN; //账号数量 Global_Numeric TP; //下单总倍数 Global_Numeric KPFLG; //委托处理标志 Global_Numeric BKDFLG; //买开处理标志 Global_NumericArray NP; //下单倍数 Global_NumericArray BKID; //买开委托 Global_NumericArray BKFLG; //买开标志 Global_NumericArray BKDEL; //买开撤单标志 Global_NumericArray BKSM; //买开总手数 Global_NumericArray BKM; //买开委托手数 Global_NumericArray BKP; //买开委托价格 Global_NumericArray BKT; //买开委托时间 Begin //------------------获取手动下单信息-----------------// If(1) { If(KPFLG == 0) //如果未开启委托处理 { ADN = M_GetTradeAccountNum; //账号数量 COD = M_GetTradeContract(); //合约编码 SIG = M_GetTradeSig(); //下单信号 VLM = M_GetTradeVol(); //交易手数 For X = 0 To ADN - 1 //遍历账号 { AID[X] = M_GetTradeAccount(X); //账号 NP[X] = M_GetTradeOrderRatio(X);//下单倍数 BKSM[X] = NP[X] * VLM; //买开总手数 TP = TP + NP[X]; //下单总倍数 } If(VLM > 0 && COD.A_IsExchangeOpen() == 1)//如果交易手数大于0,且当前状态是开盘 { If(SIG == Sig_BK)//如果是买开方向 { Commentary("【" + COD +"买开:手动买开" + Text(VLM) + "手!】"); BKDFLG = 1;//开启买开处理 } KPFLG = 1; //开启委托处理 } } If(KPFLG == 1 && COD.A_IsExchangeOpen() == 1) //如果已开启委托处理,且当前状态是开盘 { OPFLG = 1; //开启模型处理 } } //---------------------期货变量赋值---------------------// If(OPFLG == 1) //变量赋值 { T = 3; //时间间隔 P = 0.2; //数值比例 NOW = CurrentTime(); //当前时间 ASKP = COD.Price("Ask1"); //卖一价 ASKV = COD.Price("AskVol1"); //卖一量 } //------------------查询组件当前任务-----------------// If(OPFLG == 1) { For X = 0 To ADN - 1 //遍历账号 { If(BKFLG[X] == 1) //如果有买开委托 { If(F_OrderStatus(BKID[X]) == Enum_Filled)//如果买开委托成交 { Commentary("【" + COD + "买开:买开委托成交!" + AID[X] + "】"); BKFLG[X] = 0;//买开标志归0 BKDEL[X] = 0;//买开撤单标志归0 } Else If(F_OrderStatus(BKID[X]) == Enum_Canceled) //如果买开委托已撤 { Commentary("【" + COD + "买开:买开委托已撤!" + AID[X] + "】"); If(F_OrderFilledLot(BKID[X]) > 0) //如果买开委托部分成交 { BKM[X] = BKM[X] - F_OrderFilledLot(BKID[X]); //买开委托手数 } If(BKM[X] > 0) //如果买开委托手数大于0 { BKP[X] = ASKP; //买开委托价格 Commentary("【" + COD + "买开:买开委托追价!" + AID[X] + "】"); BKID[X] = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM[X],BKP[X],AID[X]); //发出买开委托 BKT[X] = NOW; //买开委托时间 } BKDEL[X] = 0; //买开撤单标志归0 } Else If(F_OrderStatus(BKID[X]) == Enum_Declared || F_OrderStatus(BKID[X]) == Enum_FillPart) //如果买开委托挂单 { If(BKDEL[X] == 0) //如果未撤单 { If(TimeDiff(BKT[X],NOW) >= T) //如果时间间隔T秒 { Commentary("【" + COD + "买开:买开委托撤单!" + AID[X] + "】"); COD.F_DeleteOrder(F_OrderContractNo(BKID[X]),AID[X]); //撤掉买开委托挂单 BKDEL[X] = 1; //已发出撤掉买开委托挂单 } } } } } ODFLG = 1; //挂单判断标志初始化 For X = 0 To ADN - 1 //遍历账号 { If(BKFLG[X] == 1 || BKSM[X] > 0) //如果有买开委托,或有剩余买开手数 { ODFLG = 2; //存在买开委托挂单 } } If(ODFLG == 1) //如果没有买开委托 { Commentary("【" + COD + "买开:买开委托完成!】"); BKDFLG = 0; //买开处理标志归0 Exit(); //退出公式 } } //------------------------委托发出------------------------// If(OPFLG == 1) //委托处理 { //---------------------买开委托处理--------------------// If(BKDFLG == 1) //如果已开启买开处理 { For X = 0 To ADN - 1 //遍历账号 { If(BKFLG[X] == 0) //如果没有买开委托 { //------------------------买开委托发出------------------------// If(1) { If(TP > 0) //如果已取得下单总倍数 { BKM[X] = Min(Floor((NP[X] / TP) * P * ASKV),BKSM[X]); //买开委托手数 } If(BKM[X] > 0) //如果买开委托手数大于0 { BKP[X] = ASKP; //买开委托价格 Commentary("【" + COD + "买开:公式买开" + Text(BKM[X]) + "手!" + AID[X] + "】"); Commentary("【" + COD + "买开:买开委托发出!" + AID[X] + "】"); BKID[X] = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM[X],BKP[X],AID[X]); //发出买开委托 BKSM[X] = BKSM[X] - BKM[X]; //买开总手数 BKT[X] = NOW; //买开委托时间 BKFLG[X] = 1; //已发出买开委托 } } } } } } End