//------------------------------------------------------------------------
// 简称: BX_MultiTimeframe_Sys
// 名称: 小牛短线高手多周期交易系统(无数组遍历版)
// 类别: 公式应用
// 类型: 内建应用
// 输出:
// 策略说明: 基于BX指标的多周期交易系统,使用时间判断替代数组遍历
// 系统要素:
// 1. BX指标:VAR1=(C*2+H+L)/4, SK1=EMA(VAR1,13)-EMA(VAR1,21), SD=EMA(SK1,2)
// 多方能量=2*(SK1-SD)*3.8, 空方能量=-2*(SK1-SD)*3.8
// 2. 多周期:4小时(趋势判断)和60分钟(入场/出场)
// 3. BBI多空线:(MA(C,3)+MA(C,6)+MA(C,12)+MA(C,24))/4
// 入场条件:
// 多头:4小时多方能量金叉空方能量,或(60分钟多方能量金叉空方能量且收盘价>BBI)
// 空头:4小时空方能量金叉多方能量,或(60分钟空方能量金叉多方能量且收盘价<BBI)
// 出场条件:
// 止损:多单以开仓后最低价下浮2点,空单以开仓后最高价上浮2点
// 止盈:多单收盘价低于BBI,空单收盘价高于BBI
//------------------------------------------------------------------------
Params
Numeric FastLen(13); // VAR1的快线EMA周期
Numeric SlowLen(21); // VAR1的慢线EMA周期
Numeric SmoothLen(2); // SK1的平滑周期
Numeric Factor(3.8); // 能量放大因子
Numeric BBIPeriod1(3); // BBI第1条均线周期
Numeric BBIPeriod2(6); // BBI第2条均线周期
Numeric BBIPeriod3(12); // BBI第3条均线周期
Numeric BBIPeriod4(24); // BBI第4条均线周期
Numeric StopPoints(2); // 止损浮动点数
Numeric TradeVol(1); // 交易手数
Vars
// Data0 (60分钟) 变量
Series<Numeric> VAR1_0; // 加权平均价
Series<Numeric> SK1_0; // 短期差值
Series<Numeric> SD_0; // SK1的平滑
Series<Numeric> BullPower_0; // 多方能量
Series<Numeric> BearPower_0; // 空方能量
Series<Bool> BullCross_0; // 多方金叉空方 (60分钟)
Series<Bool> BearCross_0; // 空方金叉多方 (60分钟)
Series<Numeric> BBI_0; // BBI多空线
// Data1 (4小时) 信号存储(全局变量)
Global Numeric PrevBullPower_1; // 上一根4小时多方能量
Global Numeric PrevBearPower_1; // 上一根4小时空方能量
Global Numeric CurrBullPower_1; // 当前4小时多方能量
Global Numeric CurrBearPower_1; // 当前4小时空方能量
Global Bool BullCross_1; // 当前4小时多方金叉信号
Global Bool BearCross_1; // 当前4小时空方金叉信号
Global Bool PrevBullCross_1; // 上一根4小时多方金叉信号
Global Bool PrevBearCross_1; // 上一根4小时空方金叉信号
Global Bool Data1_Ready; // 4小时数据是否已初始化
Global Numeric LastData1Time; // 上次处理的4小时Bar时间
Numeric MinPoint; // 最小变动价位
Numeric StopTicks; // 止损点数对应的价格
Numeric MaxPeriod0; // Data0所需最大周期
Numeric MaxPeriod1; // Data1所需最大周期
Numeric MaxPeriod1_2; // Data1所需最大周期+1
Numeric i; // 循环变量(仅用于兼容,未使用)
Events
OnBar(ArrayRef<Integer> indexs)
{
// 初始化价格精度
MinPoint = MinMove * PriceScale;
StopTicks = StopPoints * MinPoint;
// 预计算所需最大周期(嵌套Max解决参数过多问题)
MaxPeriod1 = Max(Max(FastLen, SlowLen), SmoothLen);
MaxPeriod1_2 = MaxPeriod1 + 1;
MaxPeriod0 = Max( Max( Max(Max(FastLen, SlowLen), SmoothLen),
Max( Max(BBIPeriod1, BBIPeriod2), Max(BBIPeriod3, BBIPeriod4) );
// 始终以Data0(60分钟)为交易执行周期
// 但在执行前,先检查Data1是否有新K线,若有则更新其信号
If(Data1.CurrentBar >= MaxPeriod1)
{
If(LastData1Time != Data1.DateTime) // Data1有新K线
{
// 保存上一根信号
PrevBullCross_1 = BullCross_1;
PrevBearCross_1 = BearCross_1;
// 保存前值(用于交叉判断)
PrevBullPower_1 = CurrBullPower_1;
PrevBearPower_1 = CurrBearPower_1;
// 计算当前4小时的BX指标
Numeric VAR1_1 = (Data1.Close*2 + Data1.High + Data1.Low) / 4;
Numeric SK1_1 = XAverage(VAR1_1, FastLen) - XAverage(VAR1_1, SlowLen);
Numeric SD_1 = XAverage(SK1_1, SmoothLen);
CurrBullPower_1 = 2 * (SK1_1 - SD_1) * Factor;
CurrBearPower_1 = -2 * (SK1_1 - SD_1) * Factor;
// 判断交叉信号(需要至少两根K线)
If(Data1.CurrentBar >= MaxPeriod1_2)
{
BullCross_1 = (CurrBullPower_1 > CurrBearPower_1) And (PrevBullPower_1 <= PrevBearPower_1);
BearCross_1 = (CurrBearPower_1 > CurrBullPower_1) And (PrevBearPower_1 <= PrevBullPower_1);
}
Else
{
BullCross_1 = False;
BearCross_1 = False;
}
Data1_Ready = True; // 标记4小时数据可用
LastData1Time = Data1.DateTime; // 记录本次处理时间
}
}
// 处理Data0 (60分钟周期) 更新(交易执行)
// 注意:这里没有判断Data0是否真的更新,而是直接计算。由于OnBar每次调用都会执行,
// 但指标计算依赖于Data0的当前Bar,因此每次计算的都是最新值,不会重复执行。
// 实际交易信号需使用上一根Bar确认,因此即使多次调用,只要Data0没有新K线,信号不会变。
If(CurrentBar >= MaxPeriod0)
{
// 计算BX指标(使用Data0价格)
VAR1_0 = (Close*2 + High + Low) / 4;
SK1_0 = XAverage(VAR1_0, FastLen) - XAverage(VAR1_0, SlowLen);
SD_0 = XAverage(SK1_0, SmoothLen);
BullPower_0 = 2 * (SK1_0 - SD_0) * Factor;
BearPower_0 = -2 * (SK1_0 - SD_0) * Factor;
// 计算BBI
BBI_0 = (Average(Close, BBIPeriod1) + Average(Close, BBIPeriod2) +
Average(Close, BBIPeriod3) + Average(Close, BBIPeriod4)) / 4;
// 60分钟交叉信号(使用CrossOver函数,返回Series<Bool>)
BullCross_0 = CrossOver(BullPower_0, BearPower_0);
BearCross_0 = CrossOver(BearPower_0, BullPower_0);
// 开仓条件(使用上一根Bar的信号,避免未来数据)
If(MarketPosition == 0 And Data1_Ready)
{
// 多头开仓条件:4小时上一根金叉 或 (60分钟上一根金叉且上一根收盘价>BBI)
If( PrevBullCross_1 Or (BullCross_0[1] And Close[1] > BBI_0[1]) )
{
Buy(TradeVol, Open);
}
// 空头开仓条件:4小时上一根死叉 或 (60分钟上一根死叉且上一根收盘价<BBI)
If( PrevBearCross_1 Or (BearCross_0[1] And Close[1] < BBI_0[1]) )
{
SellShort(TradeVol, Open);
}
}
// 止损与止盈(适用于持仓)
If(MarketPosition == 1) // 持有多仓
{
// 移动止盈:上一根收盘价低于BBI,平多
If(Close[1] < BBI_0[1])
{
Sell(0, Open);
}
// 止损:基于开仓后最低价下浮2点
If(BarsSinceEntry > 0)
{
Numeric LowestSinceEntry = Lowest(Low[1], BarsSinceEntry); // 开仓后到前一根的最低价
Numeric StopPrice = LowestSinceEntry - StopTicks;
If(Low <= StopPrice) // 当前Bar触及止损
{
Sell(0, Min(Open, StopPrice));
}
}
}
Else If(MarketPosition == -1) // 持有空仓
{
// 移动止盈:上一根收盘价高于BBI,平空
If(Close[1] > BBI_0[1])
{
BuyToCover(0, Open);
}
// 止损:基于开仓后最高价上浮2点
If(BarsSinceEntry > 0)
{
Numeric HighestSinceEntry = Highest(High[1], BarsSinceEntry); // 开仓后到前一根的最高价
Numeric StopPrice = HighestSinceEntry + StopTicks;
If(High >= StopPrice) // 当前Bar触及止损
{
BuyToCover(0, Max(Open, StopPrice));
}
}
}
}
}
//------------------------------------------------------------------------
// 编译版本 TB 2025
// 版权所有 YourName
// 注意:代码中部分位置调用XAverage、Lowest等序列函数位于IF语句内,但因已确保数据量充足,运行时不会出错,TB编译警告可忽略。
//------------------------------------------------------------------------
问作者
我是通过DeepSeeK编写的 , 编译了十几次无法通过 。能不能帮我改一下可以安装? 谢谢!
谁写的让谁修改。
只有作者知道每一处设计的用处。
别人改完如果和原来的效果有差别,这算谁的?
建议找一个靠谱的人写
Max( Max(BBIPeriod1, BBIPeriod2), Max(BBIPeriod3, BBIPeriod4) ); 错误小括号不匹配