请教老师这种内置函数MarketPosition为何会编译报错呢?

请教老师这种内置函数为何会编译报错呢?软件是tbquant版本如下://------------------------------------------------------------------------------ // 简称:OscillationAdaptive // 名称:自适应震荡交易策略 // 类别:公式应用 // 类型:用户应用 // 输出:Void // 版本:TBQuant 适配版 // 日期:2026/03/17 //------------------------------------------------------------------------------ Params // 布林带参数 Numeric BollLength(20); // 布林带周期 Numeric BollDev(2); // 布林带标准差倍数 // RSI 参数 Numeric RSILength(14); // RSI 周期 Numeric RSIOverSold(30); // RSI 超卖线 Numeric RSIOverBought(70); // RSI 超买线 // ADX 参数 Numeric ADXLength(14); // ADX 周期 Numeric ADXThreshold(25); // 震荡/趋势分界线 // 均线参数 Numeric FastMALength(10); // 快速均线周期 Numeric SlowMALength(30); // 慢速均线周期 // 止损止盈参数 Numeric StopLossPct(0.02); // 止损百分比 Numeric TakeProfitPct(0.04); // 止盈百分比 Numeric TrailingStopPct(0.015); // 移动止损百分比 // 资金管理参数 Numeric RiskPerTrade(0.02); // 单笔风险比例 // 过滤参数 Numeric MinVolRatio(0.5); // 最小成交量比率 Numeric ChicangN(5); // 最大持仓品种数 Vars // 布林带变量 Series<Numeric> UpperBand; Series<Numeric> LowerBand; Series<Numeric> MidBand; Series<Numeric> BandWidth; // RSI 变量 Series<Numeric> RSIValue; // ADX 变量 Series<Numeric> ADXValue; Series<Numeric> PlusDI; Series<Numeric> MinusDI; // 均线变量 Series<Numeric> FastMA; Series<Numeric> SlowMA; // 市场状态变量 Series<Bool> IsRanging; Series<Numeric> TrendDirection; // 价格跟踪变量 Series<Numeric> HighestSinceEntry; Series<Numeric> LowestSinceEntry; // 交易信号变量 Bool LongSignal; Bool ShortSignal; Bool ExitLongSignal; Bool ExitShortSignal; // 成交量变量 Series<Numeric> VolRatio; Series<Numeric> AvgVol; // 临时变量 Numeric MyEntryPrice; Numeric StopLossPrice; Numeric TakeProfitPrice; Numeric TradeLots; // 持仓统计变量 Numeric i; Integer ChiCang; Integer ChiCang11; Series<Numeric> MyMarketPosition; Series<Numeric> lots; // K 线对齐检查 Numeric result(1); Numeric ii; // 过滤条件变量 Bool GuoLv; Events // 初始化事件函数 OnInit() { // 设置初始资金 SetInitCapital(1000000); // 设置数据标志 Range[0:DataCount-1] { AddDataFlag(Enum_Data_RolloverBackWard()); // 设置后复权 AddDataFlag(Enum_Data_RolloverRealPrice()); // 映射真实价格 AddDataFlag(Enum_Data_AutoSwapPosition()); // 设置自动换仓 AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); // 忽略换仓信号计算 } // 初始化价格跟踪变量 HighestSinceEntry = 0; LowestSinceEntry = 999999; } // 在所有的数据源准备完成后调用 OnReady() { Numeric maxBackBars; maxBackBars = Max(Max(SlowMALength, BollLength), Max(ADXLength, RSILength)) + 10; SetBackBarMaxCount(maxBackBars); } // 新 bar 的第一次执行之前调用一次 OnBarOpen(ArrayRef<Integer> indexs) { // 重置最高最低价跟踪 If MarketPosition > 0 { HighestSinceEntry = High; } Else If MarketPosition < 0 { LowestSinceEntry = Low; } } // Bar 更新事件函数,主要策略逻辑 OnBar(ArrayRef<Integer> indexs) { //==============================// 判断 K 线是否对齐 result = 1; For ii = 0 To DataSourceSize - 1 { result = result * Data[ii].Barexiststatus; } // If(result <> 1) Return; // 可选:K 线未对齐时退出 //============================== Range[0:DataCount-1] { // 数据有效性检查 If Data[0].BarIndex < Max(Max(SlowMALength, BollLength), Max(ADXLength, RSILength)) Return; // ==================================================================== // 第一部分:技术指标计算 // ==================================================================== // 计算布林带 MidBand = AverageFC(Close, BollLength); UpperBand = MidBand + StandardDev(Close, BollLength, 1) * BollDev; LowerBand = MidBand - StandardDev(Close, BollLength, 1) * BollDev; BandWidth = (UpperBand - LowerBand) / MidBand * 100; // 计算 RSI RSIValue = RSI(Close, RSILength); // 计算 ADX 系统 ADXValue = ADX(ADXLength); PlusDI = DMIPlus(ADXLength); MinusDI = DMIMinus(ADXLength); // 计算均线 FastMA = AverageFC(Close, FastMALength); SlowMA = AverageFC(Close, SlowMALength); // 计算成交量比率 AvgVol = AverageFC(Volume, 20); If AvgVol > 0 VolRatio = Volume / AvgVol; Else VolRatio = 0; // ==================================================================== // 第二部分:市场状态判断 // ==================================================================== // 初始化市场状态 IsRanging = False; // 判断是否为震荡行情 If ADXValue < ADXThreshold IsRanging = True; If BandWidth < 5 IsRanging = True; // 判断趋势方向 If FastMA > SlowMA And PlusDI > MinusDI TrendDirection = 1; Else If FastMA < SlowMA And MinusDI > PlusDI TrendDirection = -1; Else TrendDirection = 0; // ==================================================================== // 第三部分:持仓统计 // ==================================================================== ChiCang11 = 0; ChiCang = 0; MyMarketPosition = MarketPosition; For i = 0 To DataCount - 1 { If(Abs(Data[i].MyMarketPosition[1]) > 0) ChiCang11 = ChiCang11 + 1; If(Abs(Data[i].MarketPosition) > 0) ChiCang = ChiCang + 1; } Commentary("Chicang111==" + Text(ChiCang)); // ==================================================================== // 第四部分:交易信号生成 // ==================================================================== // 初始化信号 LongSignal = False; ShortSignal = False; ExitLongSignal = False; ExitShortSignal = False; // 过滤条件 GuoLv = Data[0].BarIndex >= Max(Max(SlowMALength, BollLength), Max(ADXLength, RSILength)) * 2 And OpenInt > 50000 And result == 1; // 震荡行情策略 If IsRanging { // 多头信号:价格触及下轨 + RSI 超卖 If Close <= LowerBand And RSIValue < RSIOverSold { If VolRatio >= MinVolRatio And GuoLv And ChiCang < ChicangN And ChiCang11 < ChicangN LongSignal = True; } // 空头信号:价格触及上轨 + RSI 超买 If Close >= UpperBand And RSIValue > RSIOverBought { If VolRatio >= MinVolRatio And GuoLv And ChiCang < ChicangN And ChiCang11 < ChicangN ShortSignal = True; } // 多头平仓信号 If MarketPosition > 0 { If Close >= UpperBand Or RSIValue > RSIOverBought ExitLongSignal = True; } // 空头平仓信号 If MarketPosition < 0 { If Close <= LowerBand Or RSIValue < RSIOverSold ExitShortSignal = True; } } // 趋势行情策略 Else { // 多头信号:金叉 + ADX 确认 If CrossOver(FastMA, SlowMA) And ADXValue > ADXThreshold { If PlusDI > MinusDI And VolRatio >= MinVolRatio And GuoLv And ChiCang < ChicangN And ChiCang11 < ChicangN LongSignal = True; } // 空头信号:死叉 + ADX 确认 If CrossUnder(FastMA, SlowMA) And ADXValue > ADXThreshold { If MinusDI > PlusDI And VolRatio >= MinVolRatio And GuoLv And ChiCang < ChicangN And ChiCang11 < ChicangN ShortSignal = True; } // 多头平仓信号 If MarketPosition > 0 { If CrossUnder(FastMA, SlowMA) Or ADXValue < ADXThreshold ExitLongSignal = True; } // 空头平仓信号 If MarketPosition < 0 { If CrossOver(FastMA, SlowMA) Or ADXValue < ADXThreshold ExitShortSignal = True; } } // ==================================================================== // 第五部分:止损止盈逻辑 // ==================================================================== // 多头持仓止损止盈 If MarketPosition > 0 { MyEntryPrice = AvgEntryPrice; HighestSinceEntry = Max(HighestSinceEntry, High); // 固定止损 StopLossPrice = MyEntryPrice * (1 - StopLossPct); If Low <= StopLossPrice { Sell(0, Min(Open, StopLossPrice)); HighestSinceEntry = 0; LowestSinceEntry = 999999; Return; } // 固定止盈 TakeProfitPrice = MyEntryPrice * (1 + TakeProfitPct); If High >= TakeProfitPrice { Sell(0, Max(Open, TakeProfitPrice)); HighestSinceEntry = 0; LowestSinceEntry = 999999; Return; } // 移动止损 If HighestSinceEntry >= MyEntryPrice * (1 + TrailingStopPct) { StopLossPrice = HighestSinceEntry * (1 - TrailingStopPct); If Low <= StopLossPrice { Sell(0, Min(Open, StopLossPrice)); HighestSinceEntry = 0; LowestSinceEntry = 999999; Return; } } } // 空头持仓止损止盈 If MarketPosition < 0 { MyEntryPrice = AvgEntryPrice; LowestSinceEntry = Min(LowestSinceEntry, Low); // 固定止损 StopLossPrice = MyEntryPrice * (1 + StopLossPct); If High >= StopLossPrice { BuyToCover(0, Max(Open, StopLossPrice)); HighestSinceEntry = 0; LowestSinceEntry = 999999; Return; } // 固定止盈 TakeProfitPrice = MyEntryPrice * (1 - TakeProfitPct); If Low <= TakeProfitPrice { BuyToCover(0, Min(Open, TakeProfitPrice)); HighestSinceEntry = 0; LowestSinceEntry = 999999; Return; } // 移动止损 If LowestSinceEntry <= MyEntryPrice * (1 - TrailingStopPct) { StopLossPrice = LowestSinceEntry * (1 + TrailingStopPct); If High >= StopLossPrice { BuyToCover(0, Max(Open, StopLossPrice)); HighestSinceEntry = 0; LowestSinceEntry = 999999; Return; } } } // ==================================================================== // 第六部分:执行交易 // ==================================================================== // 平仓操作 If ExitLongSignal And MarketPosition > 0 { Sell(0, Open); HighestSinceEntry = 0; LowestSinceEntry = 999999; } If ExitShortSignal And MarketPosition < 0 { BuyToCover(0, Open); HighestSinceEntry = 0; LowestSinceEntry = 999999; } // 开仓操作 - 多头 If LongSignal And MarketPosition <= 0 { // 计算仓位 (简化版:固定手数) lots = 1; // 如果持有空头,先平仓 If MarketPosition < 0 BuyToCover(0, Open); // 开多仓 Buy(lots, Open); // 初始化价格跟踪 HighestSinceEntry = Open; LowestSinceEntry = 999999; } // 开仓操作 - 空头 If ShortSignal And MarketPosition >= 0 { // 计算仓位 (简化版:固定手数) lots = 1; // 如果持有多头,先平仓 If MarketPosition > 0 Sell(0, Open); // 开空仓 SellShort(lots, Open); // 初始化价格跟踪 HighestSinceEntry = 0; LowestSinceEntry = Open; } // ==================================================================== // 第七部分:绘图输出 // ==================================================================== PlotNumeric("上轨", UpperBand); PlotNumeric("下轨", LowerBand); PlotNumeric("中轨", MidBand); PlotNumeric("快线", FastMA); PlotNumeric("慢线", SlowMA); If IsRanging PlotString("状态", "震荡"); Else PlotString("状态", "趋势"); PlotNumeric("ADX", ADXValue); PlotNumeric("RSI", RSIValue); // 持仓统计输出 ChiCang = 0; For i = 0 To DataCount - 1 { If(Abs(Data[i].MarketPosition) > 0) ChiCang = ChiCang + 1; } Commentary("MarketPosition==" + Text(MarketPosition)); Commentary("Chicang==" + Text(ChiCang)); } } // 持仓更新事件函数 OnPosition(PositionRef pos) { // 可添加持仓监控逻辑 } // 委托更新事件函数 OnOrder(OrderRef ord) { // 可添加委托监控逻辑 } // 成交更新事件函数 OnFill(FillRef ordFill) { // 可添加成交监控逻辑 } //------------------------------------------------------------------------------ // 编译版本:2026/03/17 // 版权所有:TradeBlazer Software // 更改声明:TradeBlazer 平台保留对每一版本的 TradeBlazer 公式修改和重写的权利 //------------------------------------------------------------------------------

这不是TB语言的代码,请联系提供代码的人咨询

回复:老师好,这是我用Claude code生成后又自己改了一下的代码,按照tbquant的语法生成并修改的,哪里不对吗?

回复:AI生成的TB代码基本都不可用,建议学习官网帮助与视频,自己写

回复:谢谢老师,搞定了。