请教如何实现" KD交叉报警后10个周期内不再报警"
想要实现的功能:
1. 当MACD的双线都在0轴以上时, KD的双线在20以下交叉(即双线的值相等)时报警.
2. 当MACD的双线都在0轴以下时,KD的双线在80以上交叉(即双线的值相等)时报警.
由于KD的双线的值随价格的变化, 有时会在高位或者低位有很多次相等值的出现,如果实现在第一次相等报警后, 10个周期内都不再报警的功能呢(如果用在5分钟图就是10个5分钟周期,用在1小时图就是10个1小时周期)? 请高人指点一下,我刚学程序不久, 下面是我编写的, 请帮我修改呀, 谢谢了!
#property indicator_chart_window
//---- input parameters
extern int MACD_Fast=25;
extern int MACD_Slow=50;
extern int MACD_Signal=9;
extern int KD_KPeriod=9;
extern int KD_DPeriod=3;
extern int KD_Slowing=5;
extern int KD_UpLimit=80;
extern int KD_LowLimit=20;
int Alert_Mark=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Comment("KD Alert");
//----
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
double a=iMACD(NULL,0,MACD_Fast,MACD_Slow,MACD_Signal,PRICE_CLOSE,MODE_MAIN,0);
double b=iMACD(NULL,0,MACD_Fast,MACD_Slow,MACD_Signal,PRICE_CLOSE,MODE_SIGNAL,0);
double x=iStochastic(NULL,0,KD_KPeriod,KD_DPeriod,KD_Slowing,MODE_SMA,0,MODE_MAIN,0);
double y=iStochastic(NULL,0,KD_KPeriod,KD_DPeriod,KD_Slowing,MODE_SMA,0,MODE_SIGNAL,0);
if (a>=0 && b>=0 && xKD_UpLimit && y>KD_UpLimit && x==y && Alert_Mark==0)
{
Alert(Symbol()," ",Period(),": KD Crossed for Short");
Alert_Mark=1;
}
return(0);
}
//+------------------------------------------------------------------+
发表于:2008-06-10 03:15只看该作者
2楼
创建一个自定义变量,例如:Alert_Mark
当报警时,令Alert_Mark=Time[0]记下此时的K线的时间
假设我们需要在一次报警后n根K线之内都不再报警
加一个报警条件 Time[0] - Alert_Mark > n*Period()*60 就可以了
这是俺的想法
解释一下:
Time[0] - Alert_Mark 即现在的K线时间与上次报警K线的时间差(秒数)
Period()是图表周期,即一根K线的时长(分钟数)。例:在1小时图上Period()=60,在15分钟图上Period()=15等
[ 本帖最后由 踏浪 于 2008-6-10 11:18 编辑 ]
3楼
非常感谢啊, 我回去试试看, 有需要的地方再向你请教啊!



韬客社区www.talkfx.co
4楼
请帮我看看,哪个地方错了,还是报警不了:(
#property indicator_chart_window
//---- input parameters
extern int MACD_Fast=25;
extern int MACD_Slow=50;
extern int MACD_Signal=9;
extern int KD_KPeriod=9;
extern int KD_DPeriod=3;
extern int KD_Slowing=5;
extern int KD_UpLimit=80;
extern int KD_LowLimit=20;
int Alert_Mark1=0;
int Alert_Mark2=0;
datetime Alert_Time1;
datetime Alert_Time2;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Comment("KD Alert");
//----
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
double a=iMACD(NULL,0,MACD_Fast,MACD_Slow,MACD_Signal,PRICE_CLOSE,MODE_MAIN,0);
double b=iMACD(NULL,0,MACD_Fast,MACD_Slow,MACD_Signal,PRICE_CLOSE,MODE_SIGNAL,0);
double x=iStochastic(NULL,0,KD_KPeriod,KD_DPeriod,KD_Slowing,MODE_SMA,0,MODE_MAIN,0);
double y=iStochastic(NULL,0,KD_KPeriod,KD_DPeriod,KD_Slowing,MODE_SMA,0,MODE_SIGNAL,0);
if (a>=0 && b>=0 && x10) Alert_Mark1=0;
}
if (a<=0 && b<=0 && x>KD_UpLimit && y>KD_UpLimit && x==y && Alert_Mark2==0)
{
Alert(Symbol()," ",Period(),": KD Crossed for Short");
Alert_Mark2=1;
Alert_Time2=Time[0];
if (((Time[0]-Alert_Time2)/(Period()*60))>10) Alert_Mark2=0;
}
return(0);
}
//+------------------------------------------------------------------+
韬客社区www.talkfx.co
发表于:2008-06-10 14:05只看该作者
5楼
略
......
datetime Alert_Mark=0;
......
略
int start()
{
double a=iMACD(NULL,0,MACD_Fast,MACD_Slow,MACD_Signal,PRICE_CLOSE,MODE_MAIN,0);
double b=iMACD(NULL,0,MACD_Fast,MACD_Slow,MACD_Signal,PRICE_CLOSE,MODE_SIGNAL,0);
double x=iStochastic(NULL,0,KD_KPeriod,KD_DPeriod,KD_Slowing,MODE_SMA,0,MODE_MAIN,0);
double y=iStochastic(NULL,0,KD_KPeriod,KD_DPeriod,KD_Slowing,MODE_SMA,0,MODE_SIGNAL,0);
if (a>=0 && b>=0 && x 10*Period()*60 )
{
Alert(Symbol()," ",Period(),": KD Crossed for Long");
Alert_Mark=Time[0];
}
if (a<=0 && b<=0 && x>KD_UpLimit && y>KD_UpLimit && x==y && (Time[0]-Alert_Mark) > 10*Period()*60)
{
Alert(Symbol()," ",Period(),": KD Crossed for Short");
Alert_Mark=Time[0];
}
return(0);
}
6楼
这样表达的话,好象是在第一次报警条件出来以后的10周期后再报警呀?
韬客社区www.talkfx.co
发表于:2008-06-10 15:11只看该作者
7楼
发表于:2010-03-11 06:41只看该作者
8楼
:) 第一次报警条件出来以后的10周期后再报警呀?
韬客社区www.talkfx.co