//=====KDJ=====
Numeric FastLength(9); // KDJ快速线参数
Numeric SlowLength(3); // KDJ慢速线参数
Numeric SmoothLength(3); // KDJ慢速线参数
Vars
//============ 指标变量 ============
Series<Numeric> MA1; // 快速MA
Series<Numeric> MA2; // 慢速MA
Series<Numeric> MA3; // 方向MA
Series<Numeric> TR; // 真实波幅
Series<Numeric> atrValue; // ATR值
Series<Numeric> TPLineH; //高突破进场线
Series<Numeric> TPLineL; //低突破进场线
Series<Numeric> kValue; //KDJ K值
Series<Numeric> DValue; //KDJ D值
Series<Numeric> JValue; //KDJ J值
Series<Numeric> RSV; //KDJ RSV值
.....
// 计算KDJ指标
RSV = (Close - Lowest(Low, FastLength)) / (Highest(High, FastLength) - Lowest(Low, FastLength)) * 100;
KValue = SMA(RSV, SlowLength, 1);
DValue = SMA(KValue, SmoothLength, 1);
JValue = 3 * KValue - 2 * DValue;
Commentary("kValue:"+Text(kValue)); //BAR输出K值信息
Commentary("DValue:"+Text(DValue)); //BAR输出D值信息
5分钟,15分周期,只有部分时间段有K,D值输出,后面时间段无输出。但30分钟又有全部输出(2年),是有数据数量限制?
请提供能够复现的部分代码或者全部代码,你上面的代码是有内容的
您好
是不是忘记做除数为0的异常处理了
对比标准KDJ指标代码,没有写下面的代码,是因为这个导致?
Defs
Numeric SMAValue(Numeric Price,Numeric Length,Numeric Weight)
{
if(InvalidNumeric == Price || InvalidNumeric == Length || InvalidNumeric == Weight)
{
return InvalidNumeric;
}
return SMA(Price,Length,Weight);
}
Events
OnReady()
{
SetBackBarMaxCount(1+Max(Max(Length,SlowLength),SmoothLength));
}
是,没有做无效值的异常处理
加上KDJ指标完整代码后(未用回溯最大数代码,影响均线计算),KD值还是只有一半时间有输出,一半时间无(时间共2年多)。
策略需要KD金叉死叉条件开仓。原油加权000指数。数据源0为5分钟,数据源1为1天(K图背景画出日线高低框柱)
策略完整代码如下,请老师看看问题在哪?
Params
Numeric N1(20); // 均线周期N1
Numeric N2(80); // 均线周期N2
Numeric N3(420);
Numeric M(4); //波峰波谷确认前后距离
Numeric M2(150); //计算周期
//============ ATR参数 =============
Numeric ATRLength(14); // ATR计算周期
Numeric MB(2);//目标ART倍数
Numeric ZS(2);//止损ART倍数
Numeric ZY(4);//止盈ART倍数
//============ 仓位参数 ============
Numeric Lots(1);//手数
Numeric RiskRatio(0.02); // 单笔风险比例(2%)
Numeric ContractMultiplier(10); // 合约乘数(示例为螺纹钢)
//============ 过滤参数 ============
Numeric VolN(5); // 成交量过滤天数
//=====KDJ=====
Numeric FastLength(9); // KDJ快速线参数
Numeric SlowLength(3); // KDJ慢速线参数
Numeric SmoothLength(3); // KDJ慢速线参数
Vars
//============ 指标变量 ============
Series<Numeric> MA1; // 快速MA
Series<Numeric> MA2; // 慢速MA
Series<Numeric> MA3; // 方向MA
Series<Numeric> TR; // 真实波幅
Series<Numeric> atrValue; // ATR值
Series<Numeric> TPLineH; //高突破进场线
Series<Numeric> TPLineL; //低突破进场线
Series<Numeric> kValue; //KDJ K值
Series<Numeric> DValue; //KDJ D值
Series<Numeric> JValue; //KDJ J值
Series<Numeric> RSV; //KDJ RSV值
Series<Numeric> SwingHigh_0; //最近波峰价
Series<Numeric> SwingLow_0; //最近波谷价
Series<Numeric> SwingHigh_1; //前一波峰价
Series<Numeric> SwingLow_1; //前一波谷价
Series<Numeric> DayH; //日线最高价
Series<Numeric> DayL; //日线最低价
Series<Numeric>H60H; //小时线最高价
Series<Numeric>H60L; //小时线最低价
Series<Bool> UpTrend; // 上升趋势标志
Series<Bool> DnTrend; // 下降趋势标志
Series<Bool> UpTrend1; //趋势上1
Series<Bool> DnTrend1; //趋势下1
Series<Bool> UpTrend2; //趋势上2
Series<Bool> DnTrend2; //趋势下2
//============ 交易信号 ============
Series<Bool> trendLong; // 多头趋势条件
Series<Bool> trendShort; // 空头趋势条件
Series<Bool> KDOver;
Series<Bool> KDUnder;
//============ 仓位管理 ============
Numeric positionSize; // 计算手数
Numeric totalCapital(1000000); // 总资金(需根据实盘修改)
//============划线显示==============
Plot plt1;
Plot plt2;
Plot plt3;
Plot plt4;
Plot plt5;
Plot plt6;
Plot plt7;
Plot plt8;
Plot plt9;
Plot plt10;
Plot plt11;
Defs
Numeric SMAValue(Numeric Price,Numeric FastLength,Numeric Weight)
{
if(InvalidNumeric == Price || InvalidNumeric == FastLength || InvalidNumeric == Weight)
{
return InvalidNumeric;
}
return SMA(Price,FastLength,Weight);
}
Events
//此处实现事件函数
//OnReady()
//{
// SetBackBarMaxCount(1+Max(Max(Length,SlowLength),SmoothLength));//影响均线计算,忽略
//}
OnInit()
{
plt3.setOption("MA1","color",White());
plt4.setOption("MA2","color",LightBrown());
plt7.setOption("MA3","color",LightBlue());
plt8.setOption("SwingHigh","color",Gray());
plt8.setOption("SwingHigh","line-display","interval");
plt8.setOption("SwingHigh","style",Enum_Dash);
plt9.setOption("SwingLow","color",Brown());
plt9.setOption("SwingLow","line-display","interval");
plt9.setOption("SwingLow","style",Enum_Dash);
plt10.setOption("dayH","color",Gray());
plt10.setOption("dayH","line-display","interval");
plt10.setOption("dayH","style",Enum_Dash);
plt11.setOption("dayL","color",Gray());
plt11.setOption("dayL","line-display","interval");
plt11.setOption("dayL","style",Enum_Dash);
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
{//====== 指标计算 ======
//画出日线K的高低价柱线 (data[1]为日线)
DayH=Data[1].high;
DayL=Data[1].Low;
//plt11.barv("DayL",date+time,DayH,DayL);
PlotAuto("DayL",DayH,DayL,Rgb(60,60,60),Enum_BAR,Enum_Hollow);
//均线MA1,MA2 MA3画线
{
MA1 = Average(Close,N1); //小周期均线
MA2 = Average(Close,N2); //大周期均线
MA3 = Average(Close,N3); //方向周期
plt3.line("MA1",MA1);//画线小周期
plt4.line("MA2",MA2);//画线大周期
plt7.line("MA3",MA3);//画线方向周期
}
// 计算真实波幅TR
if (CurrentBar == 0)
{
TR = High - Low;
}else
{
Numeric tr1 = High - Low;
Numeric tr2 = Abs(High - Close[1]);
Numeric tr3 = Abs(Low - Close[1]);
TR = Max(tr1, Max(tr2, tr3));
}
//计算ATR
atrValue = Average(TR, ATRLength);
//仓位计算
//positionSize = IntPart(totalCapital * RiskRatio / (atrValue * ContractMultiplier));
//positionSize = IIF(positionSize < 1, 1, positionSize); // 至少1手
//高低突破线计算
TPLineH=Highest(High[1],2);
TPLineL=Lowest(Low[1],2);
// 计算KDJ指标
RSV = (Close - Lowest(Low, FastLength)) / (Highest(High, FastLength) - Lowest(Low, FastLength)) * 100;
KValue = SMA(RSV, SlowLength, 1);
DValue = SMA(KValue, SmoothLength, 1);
JValue = 3 * KValue - 2 * DValue;
Commentary("kValue:"+Text(kValue)); //BAR输出K值信息
Commentary("DValue:"+Text(DValue)); //BAR输出D值信息
KDOver = CrossOver(KValue, DValue);
Commentary(" KDOver:" + IIFString(KDOver, "1", "0"));//金叉,BAR输出
KDUnder = CrossUnder(KValue,DValue);
Commentary(" KDUnder:" + IIFString(KDUnder, "1", "0"));//死叉,BAR输出
//最近一个及前一波峰波谷
SwingHigh_0=SwingHigh(1,High,M,M2); //最近的波峰
SwingLow_0=SwingLow(1,Low,M,M2); //最近的波谷
SwingHigh_1=SwingHigh(2,High,M,M2); //前1波峰
SwingLow_1=SwingLow(2,Low,M,M2); //前1波谷
Print("SwingHigh_1:"+Text(SwingHigh_1));//前1波峰控制台输出
Print("SwingLow_1:"+Text(SwingLow_1)); //前1波谷控制台输出
//画出波峰波谷
IF(SwingHigh_0>0)// && SwingHigh_0==SwingHigh_0[1])
plt8.line("SwingHigh",SwingHigh_0);//画波峰
IF(SwingLow_0>0)//&& SwingLow_0==SwingLow_0[1])
plt9.line("SwingLow",SwingLow_0);//画波谷
// 判断趋势方向
//UpTrend1= SwingLow_0 >= SwingLow_1 && High > SwingHigh_0 ; // 低点不创新低,突破前高点抬高
// DnTrend1= SwingHigh_0 <=SwingHigh_1 && Low < SwingLow_0 ; // 高点不创新高,跌破前低点
UpTrend2= MA2>MA2[1] Or MA1>=MA2 ; //MA2 向上。或20-80多方结构;
DnTrend2= MA2<MA2[1] Or MA1<MA2 ; //MA2 向下。或20-80空方结构;
UpTrend=UpTrend1 Or UpTrend2; //趋势上;
DnTrend=DnTrend1 Or DnTrend2; //趋势下;
Commentary(" UpTrend:" + IIFString(UpTrend, "1", "0"));//趋势上,BAR输出;
Commentary(" DnTrend:" + IIFString(DnTrend, "1", "0"));//趋势下,BAR输出;
}
{ //波峰波谷突破交易策略----------
// 开多条件
if (MarketPosition <>1
//&& Close[1] > MA2[1] //前K站上MA2
&& MA1[1]> MA1[2] //MA1是上升的
&& Close[1] > MA1[1] //前K站上MA1
&& Close[1] > MA3[1] //前K站上MA3
&& UpTrend[1] //趋势上
&& ( Close[1]>SwingHigh_0[1] Or CrossOver(KValue[1],DValue[1]))) //前K收盘价突破波峰 或 KDJ指标K,D金叉
{
Buy(Lots, Max(Close[1],Open));
}
// 开空条件
if (MarketPosition <>-1
//&& Close[1] < MA2[1] //前K站MA2下,
&& MA1[1] < MA1[2] //MA1是下降的
&& Close[1] < MA1[1] //前K站MA1下
&& Close[1] < MA3[1] //前K站MA3下
&& DnTrend[1] //趋势下
&& (Close[1]<SwingLow_0[1] or CrossUnder(KValue[1],DValue[1]))) //前K收盘价跌破波谷 或 KDJ指标K,D死叉
{
SellShort(Lots, Min(Close[1],Open));
}
// 多单止损止盈
if (MarketPosition == 1
&& CrossUnder(Low,SwingLow_0))
{
Sell(0, SwingLow_0);
}
// 空单止损止盈
if (MarketPosition == -1
&& CrossOver(High,SwingHigh_0))
{
BuyToCover(0, SwingHigh_0);
}
}
}
"加上KDJ指标完整代码后"——你这句话是认真的吗???
谢谢提醒。已加完整处理无效数据代码,解决了。😀👍
解决了那我就不多说了