□o□ 发表于 2011-11-30 21:19:08

KD报警求助!!!

网上看到一个思路很好的报警指标, 但是有一个问题,报不了警, 请高手帮忙看一看, 非常感谢!



以下内容为转载:





KDJ提醒器 0.5
我自己写的KDJ提醒器。
它可以设置两个时间框架(Timeframe)及KDJ指标(实际上使用的不是KDJ指标而是MT4自带的Stochastic指标)的相关参数,当KDJ在两个时间框架上同时出现低位金叉或高位死叉时,将会向你发现提示信息。在选择入场点时,KDJ出现低位金叉或高位死叉是一个非常不错的判断方法。

相关参数说明:
p_RefTimeframe1:参考时间框架1,默认值:PERIOD_M5 (即5分钟图)
p_RefTimeframe2:参数时间框架2,默认值:PERIOD_M15(即15分钟图)
p_CareCrossType:所关心的交叉点类型(1-关注金叉,-1-关注死叉,0-不关注任何交叉,相当于暂停处理),默认值:1

p_TopLimit:死叉时,KD的值必须高于这个值(即需要高位死叉)
p_BottomLimit:金叉时,KD的值必须底于这个值(即需要低位金叉)

p_Kperiod:KDJ指标的%K周期,默认值:8
p_Dperiod:KDJ指标的%D周期,默认值:5
p_Slowing:慢线周期,默认值:3

p_MessageboxAlarm:出现条件时,是否弹出消息提示对象框,默认值:true
p_SendMailAlarm:是否发邮件提示消息,默认值:false


我在中国移动可以申请一个手机邮箱,并开通了邮件到达通知功能,这样我把p_SendMailAlarm参数设置成true,于是这个“邮件提示”就变成了“短信提示”,非常好用。


源代码如下:
//+------------------------------------------------------------------+
//|                                              KDJ交叉信号告警.mq4 |
//|                                                      Jesse Loo |
//|                                                                  |
//+------------------------------------------------------------------+
//** KDJ交叉信号告警 **
//当KDJ出现指定的金叉或死叉时发出告警
//Version: 0.50
//Date: 2007.01.25
//修改记录:
#property copyright \"Jesse Loo\"
#property link      \"\"
string    EA_FLAG = \"EA_KDJ_0.50\";       //自动交易程序的标志



// **** 外部参数 ****
extern intp_RefTimeframe1    = PERIOD_M5;//参考时间框架1
extern intp_RefTimeframe2    = PERIOD_M15; //参考时间框架2

extern intp_CareCrossType    = 1;          //所关心的交叉点类型(1-关注金叉,-1-关注死叉,
                                             //0-不关注任何交叉,相当于暂停处理)

extern intp_TopLimit         = 20;         //死叉时,KDJ的值必须高于这个值
extern intp_BottomLimit      = 80;         //金叉时,KDJ的值必须底于这个值

extern intp_Kperiod          = 8;          //%K周期
extern intp_Dperiod          = 5;          //%D周期
extern intp_Slowing          = 3;          //慢线周期

extern bool p_MessageboxAlarm= true;       //弹出消息提示
extern bool p_SendMailAlarm    = false;      //发送邮件提示信息



// **** 全局变量 ****
datetime    g_dtLastCrossTime   = 0;         //前一次告警的最后一个交叉点的出现时间




//+------------------------------------------------------------------+
//| expert initialization function                                 |
//+------------------------------------------------------------------+
int init()
{
   if (GlobalVariableCheck(\"KDJCross_ForceSendMailAlarm\") &&
         MathAbs(GlobalVariableGet(\"KDJCross_ForceSendMailAlarm\")) > 0.9999)
   {
      Print(\"KDJCross_ForceSendMailAlarm = true\");
   }
   else
   {
      Print(\"KDJCross_ForceSendMailAlarm = false\");
   }

   return(0);
}



//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{

   return(0);
}


//+------------------------------------------------------------------+
//| expert start function                                          |
//+------------------------------------------------------------------+
int start()
{
   int      nRef1CrossType = 0;
   datetime dtRef1CrossTime = 0;
   
   int      nRef2CrossType = 0;
   datetime dtRef2CrossTime = 0;
   
   datetime dtLastCrossTime = 0;
   
   if (p_RefTimeframe1 > 0)
   {
      //在参考时间框架1寻找第一个交叉点
      nRef1CrossType = FindKDJCross(dtRef1CrossTime, p_RefTimeframe1, p_Kperiod, p_Dperiod, p_Slowing);      

      if (nRef1CrossType != -999 && dtRef1CrossTime >dtLastCrossTime)
      {
         dtLastCrossTime = dtRef1CrossTime;
      }
   }
   
   if (p_RefTimeframe2 > 0)
   {
      //在参考时间框架2寻找第一个交叉点
      nRef2CrossType = FindKDJCross(dtRef2CrossTime, p_RefTimeframe2, p_Kperiod, p_Dperiod, p_Slowing);

      if (nRef1CrossType != -999 && dtRef2CrossTime >dtLastCrossTime)
      {
         dtLastCrossTime = dtRef2CrossTime;
      }
   }
   
   if ((nRef1CrossType == p_CareCrossType && nRef2CrossType == 0) ||
         (nRef1CrossType == p_CareCrossType && nRef2CrossType == p_CareCrossType))
   {
      if (dtLastCrossTime > g_dtLastCrossTime)
      {
         //告警条件达到,发出告警
         string strAlarmMsg = Symbol() + \",KDJ cross \" + nRef1CrossType + \" be detected!\";
         
         Print(\"KDJ Cross Alarm: \", strAlarmMsg);
         
         bool bGlobalSendMailAlarm = false;
         if (GlobalVariableCheck(\"KDJCross_ForceSendMailAlarm\") &&
               MathAbs(GlobalVariableGet(\"KDJCross_ForceSendMailAlarm\")) > 0.9999)
         {
            bGlobalSendMailAlarm = true;
         }
      
         if (p_SendMailAlarm || bGlobalSendMailAlarm)
         {
            SendMail(\"Alarm: \" + strAlarmMsg, \"Alarm happened: \" + strAlarmMsg);
         }
         
         if (p_MessageboxAlarm)
         {
            MessageBox(strAlarmMsg, \"Alarm\");
         }
         
         
         g_dtLastCrossTime = dtLastCrossTime;
      }
   }
   
   return(0);
}

//功能:寻找KDJ指示最近的一个交叉点类型
//参数:
//dtCross - 返回交叉点的时间
//返回:
//若是金叉则返回1,若是死叉则返回-1,没有找到时(如数据不足)则返回-999
int FindKDJCross(datetime &dtCross, int nTimeframe, int nKperiod, int nDperiod, int nSlowing)
{
   int nResult = -999;
   int nCrossValue = -1;
   
   int i;
   int nBarsCount = iBars(NULL, nTimeframe) - 30;
   
   for (i = 0; i < nBarsCount; i++)
   {
      int nMain1 = iStochastic(NULL, nTimeframe, nKperiod, nDperiod, nSlowing, MODE_SMA, 0, MODE_MAIN, i);
      int nMain2 = iStochastic(NULL, nTimeframe, nKperiod, nDperiod, nSlowing, MODE_SMA, 0, MODE_MAIN, i + 1);
      
      int nSignal1 = iStochastic(NULL, nTimeframe, nKperiod, nDperiod, nSlowing, MODE_SMA, 0, MODE_SIGNAL, i);
      int nSignal2 = iStochastic(NULL, nTimeframe, nKperiod, nDperiod, nSlowing, MODE_SMA, 0, MODE_SIGNAL, i + 1);
      
      if (nMain2 = nSignal1)
      {
         //金叉
         nResult = 1;
         nCrossValue = nMain1;
         break;
      }
      else if (nMain2 >= nSignal2 && nMain1p_BottomLimit)
   {
      //金叉位置太高,需要忽略之
      nResult = -999;   
   }
   if (nResult == -1 && nCrossValue < p_TopLimit)
   {
      //死叉位置太低,需要忽略之
      nResult = -999;
   }
   
   if (nResult != -999)
   {
      dtCross = iTime(NULL, nTimeframe, i);
      
      //Print(\"In timeframe \", nTimeframe, \" Cross \", nResult, \" happened at \", TimeToStr(dtCross, TIME_DATE|TIME_MINUTES|TIME_SECONDS));
   }
      
   //没有找到交叉点
   return (nResult);
}

//+------------------------------------------------------------------+

醉卧花丛 发表于 2012-11-22 00:02:14

真好。。。。。。。。。

叫花子 发表于 2012-11-22 00:02:14

强人,佩服死了。呵呵,不错啊

dmpdc 发表于 2012-11-22 00:28:10

不是吧

fxsin8.7 发表于 2012-11-22 00:28:10

哈哈,看的人少,回一下

草比 发表于 2012-11-22 00:28:10

楼主good

做梦吧你 发表于 2012-11-22 00:28:10

我有一个EA 好坏你自己定免费的需要的话 可以发给你玩玩

2641318963 发表于 2012-11-22 00:28:10

貌似我真的很笨????哎

liulinqi05 发表于 2012-11-22 00:28:10

老大,我好崇拜你哟

越野车 发表于 2012-11-22 00:28:10

真是有你的!
页: [1] 2
查看完整版本: KD报警求助!!!