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

//下一个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");//打印成功 } }

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&#39;t ok, and why"); } } } 又写了一段代码来实测,就是一个计数器,到达设定值就买入,结果还是没有执行Buy函数,返回Buy isn&#39;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是一一对应的么?