在什么情况下buy()函数sell()函数 返回false?

看海龟交易代码的时候发现了这样的情况,满足条件触发了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根时,即便条件已经满足开平仓条件,但是因为数据不满足你的设置需求,此时的计算结果是可能不符合你交易需求的,为了避免在这样的情况下进行错误的开平仓。所以底层会有所控制 不显示也不做操作。

回复:谢谢老师~