在什么情况下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"));
    }

 

 

A_SendOrderEx函数下单返回False
实时行情,A函数撤单成功,却返回false
A_SendOrderEx函数与Buy、Sell、BuyToCover、SellShort等函数有什么区别?
buy/sell下单返回ture,但实际下单失败
sell 函数问题
使用Buy/Sell函数下单,用数据源策略函数获取的信息会丢失
A函数发单成交但返回值为False
关于Buy函数和A_Buy函数在实盘上遇到的问题
A函数返回值为False,是因为电脑操作系统有关吗?
使用A_Buy/A_Sell/A_DeleteAccountOrder下模拟柜台股票单, 不管成功失败返回值都是False

buy如果返回false只有两个原因,lots不合法或者price不合法。lots可能是手数不满足最小,price可能是超出了价格范围。

返回false就是表示当前这个交易信号无法标记,如果你图上没信号但是账户里有相应的报单,那只可能是信号闪烁了

好的,谢谢

TB程序是否会自动跳过前N根BAR? 用PlotString输出连线时,也发现前N根是没有画线的,直到第55根BAR

可以使用函数maxbarsback输出你的公式所需的最大历史K线数, 底层会有控制,当currentbar<maxbarsback时,是不会输出画图或是信号的,但是commenatry做为调试语句可以输出你想要显示的一些值  。

在你的图表上K线数小于55根时,即便条件已经满足开平仓条件,但是因为数据不满足你的设置需求,此时的计算结果是可能不符合你交易需求的,为了避免在这样的情况下进行错误的开平仓。所以底层会有所控制 不显示也不做操作。

谢谢老师~