有交易信号,但是无发单委托

老师好,新人小白一枚,最近在模拟交易时遇到个问题:有交易信号,但是无发单委托。比如:有开仓信号,但无发单委托;有平仓信号,无发单委托。附上部分代码及图片,还请帮忙看看是哪里有潜在的问题,感谢!//------ 持仓处理 ------ If(MarketPosition == 1) { CurrentPrice = Close[1]; // 使用前一Bar收盘价(确定值) FloatProfitRatio = (CurrentPrice - FirstEntryPrice) / FirstEntryPrice; // 计算相对盈亏 // 全局风控检查 If(!EquityRiskTriggered) { // 直接使用计算盈亏比例(不再依赖 PositionProfit) If(FloatProfitRatio <= -FloatLossThreshold) // 注意:亏损时为负值 { Sell(0, Open, SlipPoint); Commentary("多头浮动止损触发 | 亏损比例:" + Text(FloatProfitRatio*100) + "%"); EquityRiskTriggered = True; LastExitBar = CurrentBar; } } // 动态止损止盈 DynamicStopRatio = FixScale * (1 + (ATRValue[1]/Close[1])*StopSensitivity); FixedStopLong = FirstEntryPrice * (1 - DynamicStopRatio); ProfitTargetLong = FirstEntryPrice + ATRValue[1] * ProfitMultiplier; // 止损执行(使用前一日低点防闪烁) If(Low <= FixedStopLong && Low[1] > FixedStopLong) { Sell(0, FixedStopLong, SlipPoint); LastExitBar = CurrentBar; Commentary("多头止损触发于:"+Text(FixedStopLong)); } // 止盈执行 Else If(High >= ProfitTargetLong && Close[1] < ProfitTargetLong) { Sell(0, ProfitTargetLong, SlipPoint); LastExitBar = CurrentBar; Commentary("多头止盈触发于:"+Text(ProfitTargetLong)); } }//------ 开仓逻辑 ------ If(MarketPosition == 0) { If(LongSignal) { // 开多仓 Buy(PositionSize, Open, SlipPoint); FirstEntryPrice = Open; If(!FirstEntryLong) { InitialEquity = Portfolio_CurrentEquity(); FirstEntryLong = True; } AddCount = 1; LastEntryBar = CurrentBar; EquityRiskTriggered = False; Commentary("多头开仓于:"+Text(Open)); } Else If(ShortSignal) { // 开空仓 SellShort(PositionSize, Open, SlipPoint); FirstEntryPrice = Open; If(!FirstEntryShort) { InitialEquity = Portfolio_CurrentEquity(); FirstEntryShort = True; } AddCount = 1; LastEntryBar = CurrentBar; EquityRiskTriggered = False; Commentary("空头开仓于:"+Text(Open)); } }//------ 盈利保护模块 ------ If(MarketPosition != 0 && InitialEquity > 0) { // 核心修改:用固定入场价差替代浮动盈亏计算 CurrentPrice = Close[1]; // 关键!使用前一Bar收盘价 // 多空统一计算公式(自动识别方向) If(MarketPosition == 1) { FloatProfitValue = (CurrentPrice - FirstEntryPrice) * PositionSize * ContractUnit() * BigPointValue(); FloatProfitRatio = (CurrentPrice - FirstEntryPrice) / FirstEntryPrice; } Else If(MarketPosition == -1) { FloatProfitValue = (FirstEntryPrice - CurrentPrice) * PositionSize * ContractUnit() * BigPointValue(); FloatProfitRatio = (FirstEntryPrice - CurrentPrice) / FirstEntryPrice; } // 盈利达标平仓 If(FloatProfitRatio >= InitialEquity * 0.15) { If(MarketPosition == 1) { Sell(0, Open, SlipPoint); Commentary("盈利保护触发(多头)| 收益率:" + Text(FloatProfitRatio*100) + "%"); } Else If(MarketPosition == -1) { BuyToCover(0, Open, SlipPoint); Commentary("盈利保护触发(空头)| 收益率:" + Text(FloatProfitRatio*100) + "%"); } } }

辅k线警告!老生常谈的问题了。首先明确第一天,打开k线这个功能不是展示该单元的运行轨迹,仅仅是以该策略单元的配置新建一个图表运行一下。这里可能会有疑惑为什么要强调这个?因为策略单元里的k线都是盘中实时bar挨个tick执行过来的。而打开k线时,本来应该挨个tick执行的bar全都变成历史bar,只会按照收盘状态执行一次。这就造成了策略单元和辅助k线可能运行轨迹不一致的问题。但是这个运行轨迹不一致的问题,根本上来说,是模型编写的问题,一般因为模型含有信号闪烁的隐患,所以导致k线图的信号失去了参考意义。如果想查看策略单元的实际信号执行记录,必须如下操作。首先,必须保证,该单元没有停止运行并重启过。如果重启过,那就没意义了,就跟打开k线没区别了。其次,打开测试报告,查看交易记录,这里才是单元内真实执行出来的信号。这个问题说到底,还是因为模型有信号闪烁,所以才导致信号对不上。需要理解这个问题,首先要清楚onbar事件域对于历史bar和实时bar的运行区别,其次要理解打开k线的原理(上面说了),最后还要了解一下信号闪烁的概念。建议通过视频区零基础课程系统性地学习一下。

回复:好的,感谢老师。零基础的课程也只是过了一遍,理解不深。他这个闪烁问题困扰了我很久,有什么办法能够比较好的快速找出影响闪烁的问题啊。

回复:这个好像直播课教过,直接用quant3的setbaseperiod回测就好了 https://video.tbquant.net/video?id=20250310103731783228