Params
Numeric Length_day(30); // 日线MA周期
Numeric FastLength(12); // MACD快线周期
Numeric SlowLength(26); // MACD慢线周期
Numeric SignalLength(9); // MACD信号线周期
Vars
Numeric ma_day; // 日线MA30
Numeric ma_day_prev; // 前一根日线MA30
Numeric ma_day_prev_prev; // 前两根日线MA30
Numeric macd_diff; // MACD快线
Numeric macd_dea; // MACD慢线
Numeric macd_diff_prev; // 前一根MACD快线
Numeric macd_dea_prev; // 前一根MACD慢线
Bool golden_cross; // 金叉信号
Bool death_cross; // 死叉信号
Numeric daily_bar_count = 0; // 日线数据计数器
Numeric ma_day_history[100]; // 静态数组存储历史值
Initialize()
{
SubscribeBar(Symbol, "5分钟", BeginDateTime);
SubscribeBar(Symbol, "日线", BeginDateTime);
// 初始化历史数组
For Numeric i = 0 To 99; // For循环行末加分号
{
ma_day_history[i] = 0;
}; // 代码块结束后加分号
return 0;
}
OnBar(ArrayRef<Integer> indexs)
{
// 计算日线MA30
ma_day = Data[1].AverageFC(Data[1].Close, Length_day);
ma_day_prev_prev = ma_day_prev;
ma_day_prev = ma_day_history[0];
// 仅在日线更新时保存MA30值
if (BarIndex(1) > 0); // 修正:条件语句后加分号(即使没有代码块)
{
// 移动历史数据
For Numeric i = 99 DownTo 1; // For循环行末加分号
{
ma_day_history[i] = ma_day_history[i-1];
}; // 代码块结束后加分号
// 保存新值
ma_day_history[0] = ma_day;
daily_bar_count++;
}; // if代码块结束后加分号
// 计算5分钟MACD
macd_diff_prev = macd_diff;
macd_dea_prev = macd_dea;
Numeric ema_fast = Data[0].EMA(Data[0].Close, FastLength);
Numeric ema_slow = Data[0].EMA(Data[0].Close, SlowLength);
macd_diff = ema_fast - ema_slow;
macd_dea = Data[0].EMA(macd_diff, SignalLength);
// 判断交叉信号
golden_cross = (macd_diff_prev <= macd_dea_prev) && (macd_diff > macd_dea);
death_cross = (macd_diff_prev >= macd_dea_prev) && (macd_diff < macd_dea);
// 交易逻辑
if (daily_bar_count >= 3); // 修正:条件语句后加分号
{
// 上升趋势:日线MA30向上
if (ma_day_prev_prev < ma_day_prev); // 修正:条件语句后加分号
{
// 金叉开多
if (golden_cross && MarketPosition <= 0); // 修正:条件语句后加分号
{
// 平空仓
if (MarketPosition < 0); // 修正:条件语句后加分号
BuyToCover(Abs(MarketPosition), Close);
// 开多仓
Buy(1, Close);
Print("【开多】时间: " + DateTimeToString(CurrentTime) + ", 日线MA30: " + Text(ma_day));
}; // if代码块结束后加分号
// 死叉平多
if (death_cross && MarketPosition > 0); // 修正:条件语句后加分号
{
Sell(MarketPosition, Close);
Print("【平多】时间: " + DateTimeToString(CurrentTime));
}; // if代码块结束后加分号
}; // if代码块结束后加分号
// 下降趋势:日线MA30向下
else if (ma_day_prev_prev > ma_day_prev); // 修正:条件语句后加分号
{
// 死叉开空
if (death_cross && MarketPosition >= 0); // 修正:条件语句后加分号
{
// 平多仓
if (MarketPosition > 0); // 修正:条件语句后加分号
Sell(MarketPosition, Close);
// 开空仓
SellShort(1, Close);
Print("【开空】时间: " + DateTimeToString(CurrentTime) + ", 日线MA30: " + Text(ma_day));
}; // if代码块结束后加分号
// 金叉平空
if (golden_cross && MarketPosition < 0); // 修正:条件语句后加分号
{
BuyToCover(Abs(MarketPosition), Close);
Print("【平空】时间: " + DateTimeToString(CurrentTime));
}; // if代码块结束后加分号
}; // else if代码块结束后加分号
}; // if代码块结束后加分号
// 绘图
PlotNumeric("MACD_DIF", macd_diff);
PlotNumeric("MACD_DEA", macd_dea);
PlotNumeric("MA_Day", ma_day);
}
定义方式不对
Numeric daily_bar_count (0);
现在TBQ3语法有变化了?
一眼看上去好多问题
我还在用TBQ
实在学不会TBQ3😑
quant也不能在vars域里这么定义啊!
打好基础,再用AI
只能说 Q3超级好用
我大概刚弄好一个策略的时候转的Q3
直接复制过来的,完全没有问题,语法一样的
感觉设计更友好,更好上手
来尝尝 包你真香
👌
dp里面经常这样定义,而且好像编译能通过。
AI经常在代码主体里面定义变量而不在变量定义的区域定义,还有AI不会自己定义序列变量,只会定义普通变量。
dp最明显的特征就是if语句,if和后面的()之间一定有空格。
这位兄弟的代码我感觉99%的概率是AI写的。
👍
dp是这样定义的,因为很多计算机语言是这样写的
但是tbl是用()来赋初值的