求管理帮忙检查策略

写了一个唐奇安通道突破建仓,最大值回撤2atr止损的策略,回测只出现一个信号。请管理帮忙看看哪里写错了。// 名称: 突破atr止损// 类别: 公式应用// 类型: 用户应用// 输出: Void//------------------------------------------------------------------------Params Numeric ATRLength(20); // 平均波动周期 ATR Length Numeric boLength(20); // 短周期 BreakOut Length Numeric RiskRatio(1); // 单笔亏损% Numeric Stop_per(5); //止损 利润百分比 Vars Numeric myprice; //委托价格 Series<Numeric> AvgTR; //ATR Numeric N; // N值 Numeric TotalEquity; // 按最新收盘价计算出的总资产 Numeric TurtleUnits; // 计划开仓手数 Series<Numeric> DonchianHi; // 唐奇安通道上轨,延后1个Bar Series<Numeric> DonchianLo; // 唐奇安通道下轨,延后1个Bar Series<Numeric> lasthh; //离市最高价 Series<Numeric> lastll; //离市最低价 Numeric myEntryPrice; // 开仓价格 Numeric myExitPrice; //平仓价格 Numeric MinPoint; // 最小变动单位 Bool SendOrderThisBar(False); // 当前Bar有过交易 Series<Numeric> preEntryPrice(0); // 前一次开仓的价格 series<Numeric> ExitLowestPrice; // 离市最低价格 series<Numeric> ExitHighestPrice; // 离市最高价 Defs //此处添加公式函数 Events OnBar(ArrayRef<Integer>indexs) { If(BarStatus == 0) //如果当前bar是第一组数据 MinPoint = MinMove*PriceScale; //最小变动单位=当前商品最小变动量*计数单位(一跳是多少) AvgTR = XAverage(TrueRange,ATRLength); //求atr,计算20日高低点的加权平均差值 N=AvgTR[1]; //定义前一根K线的atr,防止信号闪烁 TotalEquity=Portfolio_CurrentCapital()+Portfolio_UsedMargin(); //总资金=当前开盘可用资金+当前持仓保证金 TurtleUnits=(TotalEquity*RiskRatio/100)/(N*ContractUnit()*BigPointValue()); //开仓手数=总资金1%/atr*合约基本单位数量*每点的基本价值(人民币) TurtleUnits=IntPart(TurtleUnits); // 对小数取整(不是四舍五入,是取整数部分) DonchianHi=HighestFC(High[1],boLength); //定义唐奇安通道上轨 DonchianLo=LowestFC(Low[1],boLength); //定义唐奇安通道下轨 If(MarketPosition==0) //如果当前没有持仓,并且,前一次突破失败 { If(High>DonchianHi&&TurtleUnits>=1) //当最高价大于唐奇安上轨,并且可开仓手数大于1时 { myEntryPrice=min(high,DonchianHi+MinPoint); //开仓价格=唐奇安上轨+1个最小变动单位 myEntryPrice=IIF(myEntryPrice<Open,Open,myEntryPrice);//大跳空的时候用开盘价代替 preEntryPrice=myEntryPrice; Buy(TurtleUnits,myEntryPrice); //买开仓价的可开仓单位 } If(Low<DonchianLo&&TurtleUnits>=1) // 开仓价格取突破下轨-一个价位和最低价之间的较大值,这样能更接近真实情况,并能尽量保证成交 { myEntryPrice=max(low,DonchianLo-MinPoint); //开仓价格=唐奇安上轨-1个最小变动单位 myEntryPrice=IIF(myEntryPrice>Open,Open,myEntryPrice); // 大跳空的时候用开盘价代替 preEntryPrice=myEntryPrice; SellShort(TurtleUnits,myEntryPrice); } } //出场 If(MarketPosition==1)//有多仓时 { If(BarsSinceEntry==0) {lasthh=High; lasthh=high; ExitLowestPrice=(lasthh-2*N); } Else lasthh=max(high,lasthh); ExitLowestPrice=(lasthh-2*N); //定义离市条件 If(Low<ExitLowestPrice) //触发离场条件 { myExitPrice = Min(Low,ExitLowestPrice - MinPoint); myExitPrice = IIF(myExitPrice > Open, Open,myExitPrice); // 大跳空的时候用开盘价代替 Sell(0,myExitPrice); // 平多单 } } If(MarketPosition==-1)//有空仓时 { If(BarsSinceEntry==0) {lastll=Low; lastll=low; ExitLowestPrice=(lastll+2*N); } Else lastll=Min(Low,lastll); ExitLowestPrice=(lastll-2*N); //定义离市条件 {If(Low<ExitLowestPrice) //触发立场条件 { myExitPrice = Min(Low,ExitLowestPrice - MinPoint); myExitPrice = IIF(myExitPrice < Open, Open,myExitPrice); // 大跳空的时候用开盘价代替 BuyToCover(0,myExitPrice); // 平空单 } } } }

我一个非专业的认为是这边空头平仓时赋值错误。而且else后面得要跟大括号,不然只默认运行else后面一行的代码。