//交易商品:白银5分钟图和白银3分钟图
//跨周期1:信号必须出在小周期上,最小的周期
//跨周期2:多个计算数据的周期,那么出信号的信号周期,必须是所有数据周期的公约数
Params
Numeric FastLength(12);
Numeric SlowLength(26);
Numeric MACDLength(9);
Numeric Length(9);
Numeric SlowLength_kdj(3);
Numeric SmoothLength(3);
Numeric atrLength(14);
Vars
Numeric MACDDiff;
Numeric AvgMACD;
series<Numeric> MACDValue;
plot pen1;
plot pen2;
global numeric i1;//3分钟图层编号
global numeric i2;//5分钟图层编号
Numeric HighestValue;
Numeric LowestValue;
Numeric k;
series<Numeric> kValue;
series<Numeric> DValue;
Series<Numeric> mp;
series<Numeric> macd_sw;
series<Numeric> kdj_sw;
series<Numeric> kdj_total_count;
series<Numeric> kdj_succ_count;
series<Numeric> atrvalue;
series<Numeric> mark;
series<Numeric> mode_3;
series<Bool> firstopen;
Defs
Numeric SMAValue(Numeric Price,Numeric Length,Numeric Weight)
{
if(InvalidNumeric == Price || InvalidNumeric == Length || InvalidNumeric == Weight)
{
return InvalidNumeric;
}
return SMA(Price,Length,Weight);
}
Events
OnInit()
{
i1 = SubscribeBar(symbol, "3m", BeginDateTime);
i2 = SubscribeBar(symbol, "5m", BeginDateTime);
//data[i1].hide;
//data[i2].hide;
SetInitCapital(300000);
pen1.figure(0);
pen2.figure(0);
}
OnReady()
{
pen1.setOption("MACDDiff", "begin-bar", SlowLength);
pen1.setOption("MACDDEA", "begin-bar", SlowLength + MACDLength);
pen1.setOption("MACD", "begin-bar", SlowLength + MACDLength);
pen1.setOption("K", "begin-bar", SlowLength_kdj);
pen1.setOption("D", "begin-bar", SmoothLength);
pen1.setOption("J", "begin-bar", SmoothLength);
}
OnBar(ArrayRef<Integer> indexes)
{
If(BarStatus==0) firstopen = true;
Commentary("close[1]:"+text(close[1]));
Commentary("vol[1]:"+text(vol[1]));
//macd
If(BarStatus==0)
{
macd_sw = 0;
kdj_sw = 0;
}
data0.mp = MarketPosition;
Range[i2:i2]
{
MACDDiff = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ;
AvgMACD = XAverage(MACDDiff, MACDLength);
MACDValue = 2 * (MACDDiff - AvgMACD);
data0.pen1.line("MACDDiff", data[i2].MACDDiff);
data0.pen1.line("MACDDEA", data[i2].AvgMACD);
If (MACDValue >= 0)
data0.pen1.setOption("MACD", "color", Color9());
Else
data0.pen1.setOption("MACD", "color", Color10());
data0.pen1.barv("MACD", data[i2].MACDValue);
data0.pen1.line("零线", 0);
}
//kdj
Range[i1:i1]
{
HighestValue = HighestFC(High, Length);
LowestValue = LowestFC(Low, Length);
k = (Close - LowestValue) / (HighestValue - LowestValue) * 100;
kValue = SMAValue(k, SlowLength_kdj, 1);
DValue = SMAValue(KValue, SmoothLength, 1);
atrvalue = AvgTrueRange(atrLength);
if(kValue <> InvalidNumeric)
{
data0.pen2.line("K", data[i1].KValue);
}
if(DValue <> InvalidNumeric)
{
data0.pen2.line("D",data[i1].DValue);
}
if(kValue <> InvalidNumeric && DValue <> InvalidNumeric)
{
data0.pen2.line("J", 3 * data[i1].KValue - 2 * data[i1].DValue);
}
data0.pen2.line("Ref1", 20);
data0.pen2.line("Ref2", 80);
//统计kdj金叉成功次数
//统计kdj金叉次数
If(KValue[2]<=DValue[2] and KValue[1]>DValue[1])
{
kdj_total_count = kdj_total_count + 1;
}
//统计kdj金叉成功次数
If(KValue[4]<=DValue[4] and KValue[3]>DValue[3] and close[1]-open[2]>2.3*atrvalue[1] )
{
kdj_succ_count = kdj_succ_count + 1;
}
//data0.Commentary(text(data[i1].kdj_succ_count));
data0.Commentary("kdj金叉:"+text(data[i1].kdj_total_count));
//data0.Commentary(text(2.3*data[i1].atrvalue[1]));
//data0.Commentary(text(round(100*data[i1].kdj_succ_count/data[i1].kdj_total_count,2)));
}
If(data[i1].CurrentBar<1+Max(Max(Length,SlowLength),SmoothLength) or data[i2].CurrentBar<SlowLength + MACDLength) return;
//series my_rollover
//my_rollover = Rollover
If(my_rollover<>my_rollover[1])
{
//记录一下序列变量my_date记录TrueDate
//TrueDate和序列变量
//模式3做多
If(data[i2].MACDValue[2]<=0 and data[i2].MACDValue[1]>0 and data[i1].KValue[2]<=data[i1].DValue[2] and data[i1].KValue[1]>data[i1].DValue[1] and macd_sw<>1 and kdj_sw<>1 and my_date<>truedate(0))
{
Buy(3,open);
macd_sw = 1;
kdj_sw = 1;
firstopen = false;
mode_3 = 1;
}
{
//macd做多模式1
If(data[i2].MACDValue[2] <= 0 and data[i2].MACDValue[1] > 0 and macd_sw <> 1 and (BarsSinceExit > 5 or firstopen))
{
buy(1, open);
macd_sw = 1;
firstopen = false;
}
//kdj做多模式2
If(data[i1].KValue[2] <= data[i1].DValue[2] and data[i1].KValue[1] > data[i1].DValue[1] and kdj_sw <>1 and round(100 * data[i1].kdj_succ_count / data[i1].kdj_total_count, 2) > 35)
{
buy(2, open);
kdj_sw = 1;
firstopen = false;
}
}
//macd做空
If(data[i2].MACDValue[2]>=0 and data[i2].MACDValue[1]<0 and macd_sw <> -1)
{
SellShort(1, open);
macd_sw = -1;
}
//kdj做空
If(data[i1].KValue[2]>=data[i1].DValue[2] and data[i1].KValue[1]<data[i1].DValue[1] and kdj_sw <>-1)
{
sellshort(2,open);
kdj_sw = -1;
}
If(mode_3 == 1)//进入3模式
{
//3模式平仓方式
//先判断止损,然后是固定止盈,
//要么固定止盈60,要么移动止盈10
//If(CurrentContracts>1)//判断止损,判断固定止盈
//If(CurrentContracts==1)//判断移动止盈10跳,固定止盈60
mode_3 = 0;
}Else
{
//加仓减仓逻辑写,盈利30,减1手,盈利32,减2手
//亏损30,减1手,亏损32,减2手.
//macd_sw,kdj_sw,=0
}
}
回复:https://tbq3.tbquant.net/helper?product_id=991&search=%E6%8D%A2%E6%9C%88&type=search
回复://data0.pen1.barv("MACD", data[i2].MACDValue); 打开这行代码 1 分钟 K 线图,相对值就会变得很大。显示不正常的问题是怎么修复的?
回复:代码是全部复制的吗老师的Oninit()里面的 pen1.figure(0); 是不是抄漏了
回复:也不对 pen1.figure(0) 抄漏的话,diff和dea也在上面那你是哪的问题,我复制老师的代码运行没问题呀
回复:我是跟着视频写的,第一次课的时候,有这个问题,第二次课就突然好了,所以一直卡在这。比对一下代码,问题找到了。 MACDValue 需要加上图层号。data0.pen1.barv("MACD", MACDValue);