老师好,为什么这个开仓没信号,麻烦老师看一下哈,谢谢!
Params
// 日线双均线参数(实际对应data2日线)
Numeric FastLength(5); // 日线短期均线
Numeric SlowLength(20); // 日线长期均线
// 周线MACD参数(实际对应data1周线)
Numeric MACDFast(12); // MACD短期
Numeric MACDSlow(26); // MACD长期
Numeric MACDPeriod(9); // MACD平滑周期
// ATR止损参数
Numeric ATRPeriod(14); // ATR周期
Numeric ATRMultiplier(2); // ATR止损倍数
Numeric lots(1); // 开仓手数
Vars
// 日线双均线变量(data2)
Series<Numeric> AvgValue1; // 日线短期均线
Series<Numeric> AvgValue2; // 日线长期均线
// 周线MACD变量(data1)
Series<Numeric> MACDDiff; // MACD差离值
Series<Numeric> MACDDEA; // MACD信号线
Series<Numeric> MACDVal; // MACD柱状线
// 状态变量(归属data1:周线MACD)
Bool isWeekMACDGolden(False); // 周线MACD金叉状态
Bool isWeekMACDDead(False); // 周线MACD死叉状态
// ATR止损变量
Series<Numeric> ATRValue; // ATR值(Range内用,无图层)
Series<Numeric> StopLossPrice; // 止损价格
// 盈亏记录变量
Series<Numeric> myentryprice; // 开仓价格
Series<Numeric> myexitprice; // 平仓价格
Numeric profit; // 平仓点差利润
Numeric pricediff; // 单价差
Events
OnReady()
{
// 设置最大回溯K线数(兼容双均线+交叉回溯需求)
SetBackBarMaxCount(1+Max(FastLength,SlowLength));
}
// 初始化:调整订阅周期→图层对应关系(data1=周线,data2=日线)
OnInit()
{
SubscribeBar(symbol,"1w", 20200101); // 周线 → data1图层(核心调整)
SubscribeBar(symbol,"1d", 20200101); // 日线 → data2图层(核心调整)
}
// K线更新:先算周线(data1)MACD,再算日线(data2)双均线
OnBar(ArrayRef<Integer> indexs)
{
// ========== 1. 周线(data1):MACD计算(先执行) ==========
Range[1:1] // 原Range[0:0],对应调整为data1周线
{
MACDDiff = XAverage(Close, MACDFast) - XAverage(Close, MACDSlow);
MACDDEA = XAverage(MACDDiff, MACDPeriod);
MACDVal = 2 * (MACDDiff - MACDDEA);
// 更新周线MACD金叉/死叉状态
If (MACDDiff[2] < MACDDEA[2] && MACDDiff[1] > MACDDEA[1]) {
data1.PlotBool("MACD周线金叉",true,low-2); // 原data0→data1
data1.isWeekMACDGolden = True; // 周线MACD金叉(原data0→data1)
/* data1.isWeekMACDDead = False;*/
}
If (MACDDiff[2] > MACDDEA[2] && MACDDiff[1] < MACDDEA[1]) {
data1.PlotBool("MACD周线死叉",false,high+2); // 原data0→data1
data1.isWeekMACDDead = True; // 周线MACD死叉(原data0→data1)
/* data1.isWeekMACDGolden = False;*/
}
}
// ========== 2. 日线(data2):双均线计算(后执行) ==========
Range[2:2] // 原Range[1:1],对应调整为data2日线
{
AvgValue1 = AverageFC(Close,FastLength);
AvgValue2 = AverageFC(Close,SlowLength);
PlotNumeric("MA1",AvgValue1); // 日线短期均线
PlotNumeric("MA2",AvgValue2); // 日线长期均线
ATRValue = Average(TrueRange, ATRPeriod);
Data2.Commentary("ATR计算:ATRValue[1](周期" + Text(ATRPeriod) + ")= Average(TrueRange, " + Text(ATRPeriod) + ") = " + Text(ATRValue[1])); // 原data1→data2
}
// ========== 3. 交易信号(开仓在data2日线,逻辑不变) ==========
// ---- 多单开仓:周线MACD金叉 + 日线双均线金叉 ----
If (data2.MarketPosition <>1 && data1.isWeekMACDGolden // 原data1.MarketPosition→data2,原data0.isWeekMACDGolden→data1
&& data2.AvgValue1[2] < data2.AvgValue2[2] && data2.AvgValue1[1] > data2.AvgValue2[1]) // 原data1→data2
{
data2.PlotBool("均线日线金叉",true,low-2);
Buy(lots,data2.Open); // 日线开仓(原data1→data2)
data2.myentryprice = data2.Open; // 原data1→data2
data2.StopLossPrice = data2.Open - ATRValue[1] * ATRMultiplier; // 原data1→data2
Data2.Commentary("多头开仓原因: MarketPosition(" + Text(data2.MarketPosition) + ") <> 1, 周线MACD金叉(状态:true), 日线双均线金叉(data2.AvgValue1[2](" + Text(data2.AvgValue1[2]) + ") < data2.AvgValue2[2](" + Text(data2.AvgValue2[2]) + ")且data2.AvgValue1[1](" + Text(data2.AvgValue1[1]) + ") > data2.AvgValue2[1](" + Text(data2.AvgValue2[1]) + ")"); // 原data1→data2
Data2.Commentary("多头开仓价格: myentryprice = Open(" + Text(data2.Open) + ") = " + Text(data2.myentryprice)); // 原data1→data2
}
// ---- 空单开仓:周线MACD死叉 + 日线双均线死叉 ----
If (data2.MarketPosition <>-1 && data1.isWeekMACDDead // 原data1.MarketPosition→data2,原data0.isWeekMACDDead→data1
&& data2.AvgValue1[2] > data2.AvgValue2[2] && data2.AvgValue1[1] < data2.AvgValue2[1]) // 原data1→data2
{
data2.PlotBool("均线日线死叉",false,high+2);
SellShort(lots,data2.Open); // 日线开仓(原data1→data2)
data2.myentryprice = data2.Open; // 原data1→data2
data2.StopLossPrice = data2.Open + ATRValue[1] * ATRMultiplier; // 原data1→data2
Data2.Commentary("空头开仓原因: MarketPosition(" + Text(data2.MarketPosition) + ") <> -1, 周线MACD死叉(状态:true), 日线双均线死叉(data2.AvgValue1[2](" + Text(data2.AvgValue1[2]) + ") > data2.AvgValue2[2](" + Text(data2.AvgValue2[2]) + ")且data2.AvgValue1[1](" + Text(data2.AvgValue1[1]) + ") < data2.AvgValue2[1](" + Text(data2.AvgValue2[1]) + ")"); // 原data1→data2
Data2.Commentary("空头开仓价格: myentryprice = Open(" + Text(data2.Open) + ") = " + Text(data2.myentryprice)); // 原data1→data2
}
有同学给你指出了 oninit 和onready都写反了....
说明基础==0
这么搞是没有意义的
策略的调试会有无数的问题 完全看不懂的情况下问是问不完的
要么你看看置顶帖找代写吧
或者
https://video.tbquant.net/?menu=%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%AD%A6%E9%87%8F%E5%8C%96