
| 品种 | 数据起始时间 | 品种 | 数据起始时间 | 品种 | 数据起始时间 | 品种 | 数据起始时间 | 
|---|---|---|---|---|---|---|---|
| 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线的总持仓的累加 / 持仓周期数 | 
| 最大持仓手数 | 在持仓周期内持仓手数最大值 | 
| 平均资金使用金额 | 开仓保证金求和/持仓周期数 | 
| 最大资金使用金额 | 在持仓周期内,开仓保证金额最大值 | 
| 最大资金使用金额时间 | 在持仓周期内,最大资金使用金额的时间点 | 
| 手续费 | 手续费合计 | 
| 手续费/收益 | 手续费合计/收益 | 
| 滑点损耗 | 滑点损耗合计 | 
| 滑点损耗/收益 | 滑点损耗合计/收益 | 
| 成交额 | 成交额合计 成交额=成交价*(开仓或者平仓手数)*交易单位 | 
| 模型得分 | 根据盈利能力、稳定性、风险暴露、敏感度计算的综合得分 | 


























//---------------------买开委托处理--------------------//
//反手委托:平仓成交后发开仓委托
For X = 0 To BKDN - 1 //遍历买开处理
{
	If(BKDFLG[X] > 0) //如果已开启买开处理
	{
		//------------------------买开委托发出------------------------//
		//根据盘口挂单智能分批下单
		If(1)
		{
			If(BKOFLG[X] == 0) //如果没有买开委托
			{
				If(BKVLM[X] > 0) //如果买开手数大于0
				{
					BKM[BKN] = Min(Ceiling(P * ASKV,1),BKVLM[X]); //买开委托手数
					BKVLM[X] = BKVLM[X] - BKM[BKN]; //买开手数
					BKSM[BKN] = BKM[BKN]; //买开总手数
					BKP[BKN] = BKPRC[X]; //买开委托价格
					If(BKDFLG[X] == 1) //如果是BK信号买开
					{
						Commentary("【买开:买开委托" + Text(BKN + 1) + "发出】");
					}
					Else If(BKDFLG[X] == 2) //如果是BPK信号买开
					{
						Commentary("【买平开:买开委托" + Text(BKN + 1) + "发出】");
					}
					Else If(BKDFLG[X] == 3) //如果是SP信号买开
					{
						Commentary("【卖平:买开委托" + Text(BKN + 1) + "发出】");
					}
					Commentary("【盘口数据:卖一价=" + Text(ASKP) + ",卖一量=" + Text(ASKV) + "】");
					Commentary("【盘口数据:买一价=" + Text(BIDP) + ",买一量=" + Text(BIDV) + "】");
					Commentary("【买开委托:买开价格=" + Text(BKP[BKN]) + ",买开手数=" + Text(BKM[BKN]) + "】");
					BKID[BKN] = COD.A_SendOrder(Enum_Buy,Enum_Entry,BKM[BKN],BKP[BKN]); //发出买开委托
					BKT[BKN] = NOW; //买开委托时间
					BKDX[BKN] = X; //买开委托序号
					BKFLG[BKN] = BKDFLG[X]; //已发出买开委托
					BKN = BKN + 1; //买开委托数量
					BKOFLG[X] = 1; //已发出买开委托
				}
				Else If(BKVLM[X] == 0) //如果买开手数等于0
				{
					BKDFLG[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
						
						
						


















