条件满足,打印成功,但为什么没有出现交易信号

//下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组
    OnBarClose(ArrayRef<Integer> indexs)
    {
        //指标计算
        b = (XAverage(Close,shortPeriod)/AverageFC(Close,longPeriod)-1)*100;

        //交易信息
        If(b<-doors){
            //打印成功
            Print("b<doors");
            If(MarketPosition==0 And b>b[1]){
                    //多头建仓
                    Buy(lots,Close);  //为什么没有执行
                    Print("close is ok");//打印成功
                }

}

有没有统计连续满足某个条件个数的函数?
为什么条件限制没有作用
满足平仓条件,为什么不平仓呢
未打印的问题
if条件不满足,值为什么?
交易套利合约,满足平仓条件策略没有平仓且信号消失
if条件不满足,但进入了执行语句
求连续满足某条件
多图层条件满足先后问题
为什么当根BAR没有触达的价格范围实盘却能交易成功?

Params
    //此处添加参数

Vars
    //此处添加变量
    Global Numeric n(0);
    Numeric lots(1);
    
Defs
    //此处添加公式函数
    
Events
    //此处实现事件函数
    
    //初始化事件函数,策略运行期间,首先运行且只有一次
    OnInit()
    {
        
    }


    //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
    OnBar(ArrayRef<Integer> indexs)
    {
        n=n+1;
        Print("n= "+Text(n));
        If(n==2300){
            Buy(lots,Close);
            Print("Condition is ok,and close = "+Text(Close));
            If(Buy(lots,Close)){
                Print("Buy is ok");
            }Else{
                Print("Buy isn't ok, and why");
            }
            
        }
    }

 

又写了一段代码来实测,就是一个计数器,到达设定值就买入,结果还是没有执行Buy函数,返回Buy isn't ok, and why

你这段代码我测试也是正常发单了,就改了个计数器参数,从改成了1100,快一点触发

这里唯一的问题是信号闪烁,你的global判断条件是等于,那么当计数器超过1100的时候条件就不满足了,信号就没了。

简单来说过程就是,当计数器等于1100的那一跳驱动,条件满足,执行buy命令,图上出现信号,系统根据信号发单,成交

下一跳,计数器等于1101,不满足条件,图上的信号就消失了,也不会在print内容

这个运行结果是符合我上面的描述的,不知道你是哪里有问题?

//------------------------------------------------------------------------
// 简称: Amita_T
// 名称: 
// 类别: 公式应用
// 类型: 用户应用
// 输出: Void
//------------------------------------------------------------------------
//------------------------------------------------------------------------
Params
    //此处添加参数
    Numeric shortPeriod(62);
    Numeric longPeriod(83);
    Numeric doors(1);
    
Vars
    //此处添加变量
    Numeric lots(1);
    Series<Numeric> b(0);
    Global Numeric millsecs(1000);
    Global Integer timerId;

Defs
    //此处添加公式函数


Events
    //此处实现事件函数
    
    //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作
    OnInit()
    {
        timerId=createTimer(millsecs);
        //与数据源有关
        Range[0:DataCount-1]
        {
            //=========数据源相关设置==============
            //AddDataFlag(Enum_Data_RolloverBackWard());    //设置后复权

            //AddDataFlag(Enum_Data_RolloverRealPrice());    //设置映射真实价格

            //AddDataFlag(Enum_Data_AutoSwapPosition());    //设置自动换仓

            //AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());    //设置忽略换仓信号计算

            //AddDataFlag(Enum_Data_OnlyDay());        //设置仅日盘
            
            //AddDataFlag(Enum_Data_OnlyNight());    //设置仅夜盘
            
            //AddDataFlag(Enum_Data_NotGenReport());    //设置数据源不参与生成报告标志
            
            //=========交易相关设置==============
            //MarginRate rate;
            //rate.ratioType = Enum_Rate_ByFillAmount; //设置保证金费率方式为成交金额百分比
            //rate.longMarginRatio = 0.1; //设置保证金率为10%
            //rate.shortMarginRatio = 0.2; //设置保证金率为20%
            //SetMarginRate(rate);    
            
            //CommissionRate tCommissionRate;
            //tCommissionRate.ratioType = Enum_Rate_ByFillAmount;
            //tCommissionRate.openRatio = 5; //设置开仓手续费为成交金额的5%%
            //tCommissionRate.closeRatio = 2; //设置平仓手续费为成交金额的2%%
            //tCommissionRate.closeTodayRatio = 0; //设置平今手续费为0
            //SetCommissionRate(tCommissionRate); //设置手续费率
            
            //SetSlippage(Enum_Rate_PointPerHand,2);    //设置滑点为2跳/手
            SetOrderPriceOffset(2);    //设置委托价为叫买/卖价偏移2跳
            //SetOrderMap2MainSymbol();    //设置委托映射到主力
            //SetOrderMap2AppointedSymbol(symbols, multiples);     //设置委托映射到指定合约,symbols是映射合约数组,multiples是映射倍数数组
        }
        //与数据源无关
        //SetBeginBarMaxCount(10);    //设置最大起始bar数为10
            
        //SetBackBarMaxCount(10);    //设置最大回溯bar数为10
        
        //=========交易相关设置==============
        SetInitCapital(20000);    //设置初始资金为100万
        //AddTradeFlag(Enum_Trade_Ignore_Buy());    //设置忽略多开
        //AddTradeFlag(Enum_Trade_Ignore_Sell());    //设置忽略多平
        //AddTradeFlag(Enum_Trade_Ignore_SellShort());    //设置忽略空开
        //AddTradeFlag(Enum_Trade_Ignore_Buy2Cover());    //设置忽略空平
    }

    //在所有的数据源准备完成后调用,应用在数据源的设置等操作
    OnReady()
    {

    }

    //在新bar的第一次执行之前调用一次,参数为新bar的图层数组
    OnBarOpen(ArrayRef<Integer> indexs)
    {
        //指标计算
        b = (XAverage(Close,shortPeriod)/AverageFC(Close,longPeriod)-1)*100;
        
        //交易信息
        If(b<-doors){
            If(MarketPosition==0 And b>b[1]){
                    Buy(lots,Close);
                }Else if(MarketPosition==1 And BarsSinceEntry>=1 And Close<LastEntryPrice){
                    Buy(lots,Close);
                }Else if(MarketPosition==-1){
                    If(b>b[1]){
                        BuyToCover(0,Close);
                        Buy(lots,Close);
                    }
                }
        }Else If(b>doors){
            If(MarketPosition==0 And b<b[1]){
                    SellShort(lots,Close);
                }Else if(MarketPosition==-1 And BarsSinceEntry>=1 And Close>LastEntryPrice){
                    SellShort(lots,Close);
                }Else if(MarketPosition==1){
                    If(b<b[1]){
                        Sell(0,Close);
                        SellShort(lots,Close);
                    }
                }
        }Else{
            If(MarketPosition==1 And BarsSinceEntry>=1 And Close<LastEntryPrice){
                Buy(lots,Close);
            }
            If(MarketPosition==-1 And BarsSinceEntry>=1 And Close>LastEntryPrice){
                SellShort(lots,Close);
            }
        }
    }

    //Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
    OnBar(ArrayRef<Integer> indexs)
    {
        //指标计算
        b = (XAverage(Close,shortPeriod)/AverageFC(Close,longPeriod)-1)*100;
        //指标划线
        PlotNumeric("BIAS",b);
        PlotNumeric("z",0);
        PlotNumeric("u",doors);
        PlotNumeric("d",-doors);
    }

    //下一个Bar开始前,重新执行当前bar最后一次,参数为当前bar的图层数组
    OnBarClose(ArrayRef<Integer> indexs)
    {
        //指标计算
        b = (XAverage(Close,shortPeriod)/AverageFC(Close,longPeriod)-1)*100;

        //交易信息
        If(b<-doors){
            Print("b<doors");
            If(MarketPosition==0 And b>b[1]){
                    //多头建仓
                    Buy(lots,Close);
                    Print("close is ok");
                    if(Buy(lots,Close)){
                        Print("Buy is ok");
                    }Else{
                        Print("Buy is not ok");
                    }
                }Else if(MarketPosition==1 And BarsSinceEntry>=1 And Close<LastEntryPrice){
                    Buy(lots,Close);
                }Else if(MarketPosition==-1){
                    If(b>b[1]){
                        BuyToCover(0,Close);
                        Buy(lots,Close);
                    }
                }
        }Else If(b>doors){
            Print("b>doors");
            If(MarketPosition==0 And b<b[1]){
                    SellShort(lots,Close);
                }Else if(MarketPosition==-1 And BarsSinceEntry>=1 And Close>LastEntryPrice){
                    SellShort(lots,Close);
                }Else if(MarketPosition==1){
                    If(b<b[1]){
                        Sell(0,Close);
                        SellShort(lots,Close);
                    }
                }
        }Else{
            Print("doors<b<doors");
            If(MarketPosition==1 And BarsSinceEntry>=1 And Close<LastEntryPrice){
                Buy(lots,Close);
            }
            If(MarketPosition==-1 And BarsSinceEntry>=1 And Close>LastEntryPrice){
                SellShort(lots,Close);
            }
        }
        
        //打印信息
        Print("===================");
        Print("b="+Text(b)+",b[1]="+Text(b[1]));
        Print("pos"+Text(MarketPosition));
        
    }

    //持仓更新事件函数,参数pos表示更新的持仓结构体
    OnPosition(PositionRef pos)
    {
        
    }

    //策略账户仓更新事件函数,参数pos表示更新的账户仓结构体
    OnStrategyPosition(PositionRef pos)
    {
        
    }

    //委托更新事件函数,参数ord表示更新的委托结构体
    OnOrder(OrderRef ord)
    {
        
    }

    //成交更新事件函数,参数ordFill表示更新的成交结构体
    OnFill(FillRef ordFill)
    {
        
    }

    //定时器更新事件函数,参数id表示定时器的编号,millsecs表示定时间的间隔毫秒值
    OnTimer(Integer id,Integer intervalMillsecs)
    {
        
    }

    //通用事件触发函数,参数evtName为事件名称,参数evtValue为事件内容
    OnEvent(StringRef evtName,MapRef<String,String> evtValue) 
    {
        
    }

    //当前策略退出时触发
    OnExit()
    {

    }

    

//------------------------------------------------------------------------
// 编译版本    2023/01/10 111537
// 版权所有    Amita2012
// 更改声明    TradeBlazer Software保留对TradeBlazer平台
//            每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------

我这个是实盘账户,虚拟账户也要有资金吗

谢谢你,我明白你的意思,但我的代码却没执行,我也没想明白,这不在找原因吗,

一直发单,已经连续六单了

if(Buy(lots,Close)){
     Print("Buy is ok");
}

刚才又增加这一段代码在同一条件域内,没有打印成功,说明这句Buy(lots,Close)没有成功

 

buy没有执行成功一般的问题就是虚拟账户资金不足,或者价格参数有问题

我反正没有复现出来你的问题

不是历史信号,每根Bar close时都会打印条件信息,每次打印,都是满足条件,但就是没有交易

这是我的测试结果,发单很正常。

无法复现你说的不执行结果,除非你能提供完整的能复现问题的代码

是的,Print("close is ok"); 和Buy对应

首先,你的代码是无法运行的,很多变量参数没有定义,我不能完全确定这是一个完整的模型

其次,因为不是完整的模型,我不能确定运行结果,所以你说得打印信息一一对应也是不可信的,从这个代码无法确定这个推断

咨询模型运行问题,请把代码和环境配置完全,以后再看到这种半吊子的内容就不回复了,浪费时间诊断不出有用的结论

buy也可能执行失败的

你如果是要监控buy的执行结果 那应该是

if(Buy(lots,Close))                      Print("close is ok");

另外你能确定你打印的东西和buy是一一对应的么?