写了一个唐奇安通道突破建仓,最大值回撤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后面一行的代码。