看海龟交易代码的时候发现了这样的情况,满足条件触发了buy()函数,但是没成交,经查看,函数返回值为false。
也不是都不会成交,在过了N根BAR后,又能正常开仓
出现这样情况是什么原因?麻烦老师解答
为了直观,输出了条件是否满足,持仓保证金,等信息,如图
代码如下(可直接复制黏贴,编译看结果):
Params
Numeric nEntries(3); // 最大建仓次数
Numeric RiskRatio(1); // % Risk Per N ( 0 - 100)
Numeric ATRLength(20); // 平均波动周期 ATR Length
Numeric boLength(20); // 短周期 BreakOut Length
Numeric fsLength(55); // 长周期 FailSafe Length
Numeric teLength(10); // 离市周期 Trailing Exit Length
Bool LastProfitableTradeFilter(True); // 使用入市过滤条件
Vars
Numeric MinPoint; // 最小变动单位
Series<Numeric> AvgTR; // ATR
Numeric N; // N 值
Numeric TotalEquity; // 按最新收盘价计算出的总资产
Numeric TurtleUnits; // 交易单位
Series<Numeric> DonchianHi; // 唐奇安通道上轨,延后1个Bar
Series<Numeric> DonchianLo; // 唐奇安通道下轨,延后1个Bar
Series<Numeric> fsDonchianHi; // 唐奇安通道上轨,延后1个Bar,长周期
Series<Numeric> fsDonchianLo; // 唐奇安通道下轨,延后1个Bar,长周期
Numeric ExitHighestPrice; // 离市时判断需要的N周期最高价
Numeric ExitLowestPrice; // 离市时判断需要的N周期最低价
Numeric myEntryPrice; // 开仓价格
Numeric myExitPrice; // 平仓价格
Bool SendOrderThisBar(False); // 当前Bar有过交易
Series<Numeric> preEntryPrice(0); // 前一次开仓的价格
Series<Bool> PreBreakoutFailure(false); // 前一次突破是否失败
Bool info_buy;
Bool info_sell;
Events
OnBar(ArrayRef<Integer> indexs)
{
If(BarStatus == 0)
{
preEntryPrice = InvalidNumeric;
PreBreakoutFailure = false;
}
MinPoint = MinMove*PriceScale;
AvgTR = XAverage(TrueRange,ATRLength);
N = AvgTR[1];
TotalEquity = Portfolio_CurrentCapital() + Portfolio_UsedMargin();
TurtleUnits = (TotalEquity*RiskRatio/100) /(N * ContractUnit()*BigPointValue());
TurtleUnits = IntPart(TurtleUnits);
DonchianHi = HighestFC(High[1],boLength);
DonchianLo = LowestFC(Low[1],boLength);
fsDonchianHi = HighestFC(High[1],fsLength);
fsDonchianLo = LowestFC(Low[1],fsLength);
ExitLowestPrice = LowestFC(Low[1],teLength);
ExitHighestPrice = HighestFC(High[1],teLength);
If(MarketPosition == 0)
{
If(High > fsDonchianHi && TurtleUnits >= 1)
{
myEntryPrice = min(high,fsDonchianHi + MinPoint);
myEntryPrice = IIF(myEntryPrice < Open, Open,myEntryPrice);
preEntryPrice = myEntryPrice;
info_buy = Buy(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
Commentary("空仓且突破上轨!");
}
If(Low < fsDonchianLo && TurtleUnits >= 1)
{
myEntryPrice = max(low,fsDonchianLo - MinPoint);
myEntryPrice = IIF(myEntryPrice > Open, Open,myEntryPrice);
preEntryPrice = myEntryPrice;
info_sell = SellShort(TurtleUnits,myEntryPrice);
SendOrderThisBar = True;
PreBreakoutFailure = False;
Commentary("空仓且突破下轨!");
}
}
Commentary("preEntryPrice="+Text(preEntryPrice));
Commentary("myEntryPrice="+Text(myEntryPrice));
Commentary("Portfolio_UsedMargin()="+Text(Portfolio_UsedMargin()));
Commentary("信号info_buy="+IIFString(info_buy,"True","False"));
Commentary("信号的info_sell="+IIFString(info_sell,"True","False"));
}
buy如果返回false只有两个原因,lots不合法或者price不合法。lots可能是手数不满足最小,price可能是超出了价格范围。
返回false就是表示当前这个交易信号无法标记,如果你图上没信号但是账户里有相应的报单,那只可能是信号闪烁了
好的,谢谢
TB程序是否会自动跳过前N根BAR? 用PlotString输出连线时,也发现前N根是没有画线的,直到第55根BAR
可以使用函数maxbarsback输出你的公式所需的最大历史K线数, 底层会有控制,当currentbar<maxbarsback时,是不会输出画图或是信号的,但是commenatry做为调试语句可以输出你想要显示的一些值 。
在你的图表上K线数小于55根时,即便条件已经满足开平仓条件,但是因为数据不满足你的设置需求,此时的计算结果是可能不符合你交易需求的,为了避免在这样的情况下进行错误的开平仓。所以底层会有所控制 不显示也不做操作。
谢谢老师~