
请教老师这种内置函数为何会编译报错呢?
软件是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的语法生成并修改的,哪里不对吗?