79评论

1收藏

30金币请教一个问题

avatar 一片笑语 | 6632 人阅读 | 79 人评论 | 2021-12-04

悬赏任务 30金币
这个指标首先说明有未来函数的,重新加载会变位置,主要想了解它出箭头的原理具体是什么样的,看源码涉及到EMA和RSI,懂代码的大佬麻烦解读一下,原理的代码很少

""
还没有人打赏,支持一下

评论|共 79 个

一片笑语

发表于 2021-12-4 23:07:09 | 显示全部楼层

//+------------------------------------------------------------------+
//|RK-ml-RSI_EMA_mtf v1.2 jan 22, 2011      original-RSI_EMA_MTF.mq4 |
//|                                                          Kalenzo |
//|                                      bartlomiej.gorski@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Kalenzo"
#property link      "bartlomiej.gorski@gmail.com"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Orange
#property indicator_width1 2

extern string TimeFrame        = "H4";
extern int    RsiPeriod        = 5;
extern int    MaType           = MODE_EMA;
extern int    MaPeriod         = 3;
extern bool   Interpolate      = true;
extern string arrowsIdentifier = "RsiEmaArrows";
extern color  arrowsUpColor    = Lime;
extern color  arrowsDnColor    = Red;

extern bool   alertsOn          = true;
extern bool   alertsOnCurrent   = false;
extern bool   alertsMessage     = true;
extern bool   alertsSound       = true;
extern bool   alertsEmail       = false;

double rsi[],ema[],trend[];

string indicatorFileName;
bool   calculating   = false;
bool   returningBars = false;
int    timeFrame;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   
   IndicatorBuffers(3);      
   SetIndexBuffer(0,rsi);     SetIndexLabel(0,"rsi");
   SetIndexBuffer(1,ema);     SetIndexLabel(1,"ema");
   SetIndexBuffer(2,trend);   SetIndexLabel(2,"trend");
   if (TimeFrame=="calculate")
   {
      calculating=true;
      return(0);
   }
   if (TimeFrame=="returnBars")
   {
      returningBars=true;
      return(0);
   }
   timeFrame = stringToTimeFrame(TimeFrame);
      
   indicatorFileName = WindowExpertName();
   IndicatorShortName("RK-ml-RSI_EMA_mtf v1.2 "+tf());
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
  //    deleteArrows();
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int counted_bars=IndicatorCounted();
   int i,limit;

   if(counted_bars < 0) return(-1);
   if(counted_bars>0) counted_bars--;
         limit = MathMin(Bars-counted_bars,Bars-1);
         if (returningBars)  { rsi[0] = limit+1; return(0); }
         if (timeFrame > Period()) limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,timeFrame,indicatorFileName,"returnBars",0,0)*timeFrame/Period()));

   //
   //
   //
   //
   //

     if (calculating)
     {
         for(i=0; i<limit; i++) rsi = iRSI(NULL,0,RsiPeriod,PRICE_CLOSE,i);
         for(i=0; i<limit; i++) ema = iMAOnArray(rsi,0,MaPeriod,0,MaType,i);
         return(0);
     }         
     for(i=limit; i>0; i--)
     {
         int y = iBarShift(NULL,timeFrame,Time);
            rsi   = iCustom(NULL,timeFrame,indicatorFileName,"calculate",RsiPeriod,MaType,MaPeriod,0,y);
            ema   = iCustom(NULL,timeFrame,indicatorFileName,"calculate",RsiPeriod,MaType,MaPeriod,1,y);
            
            //
            //
            //    must be done before interpolation
            //
            //
            
               trend = trend[i+1];
                  if (rsi>ema) trend= 1;
                  if (rsi<ema) trend=-1;
                  //deleteArrow(Time);
                  if (trend!=trend[i+1])
                  {
                     if (trend == 1) drawArrow(i,arrowsUpColor,233,false);
                     if (trend ==-1) drawArrow(i,arrowsDnColor,234,true);
                  }

            //
            //
            //
            //
            //
      
               if (timeFrame <= Period() || y==iBarShift(NULL,timeFrame,Time[i-1])) continue;
               if (!Interpolate) continue;

            //
            //
            //
            //
            //

            datetime time = iTime(NULL,timeFrame,y);
               for(int n = 1; i+n < Bars && Time[i+n] >= time; n++) continue;       
               double factor = 1.0 / n;
               for(int k = 1; k < n; k++)
               {
                  rsi[i+k] = k*factor*rsi[i+n] + (1.0-k*factor)*rsi;
                  ema[i+k] = k*factor*ema[i+n] + (1.0-k*factor)*ema;
               }
               
           
   }
   
   //
   //
   //
   //
   //
   
   if (alertsOn)
   {
      if (alertsOnCurrent)
           int whichBar = 0;
      else     whichBar = 1;
      if (trend[whichBar] != trend[whichBar+1])
      {
         if (trend[whichBar] == 1) doAlert("up");
         if (trend[whichBar] ==-1) doAlert("down");
      }         
   }
     
   return(0);
}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

void drawArrow(int i,color theColor,int theCode,bool up)
{
   string name = arrowsIdentifier+":"+Time;
   double gap  = 3.0*iATR(NULL,0,20,i)/4.0;   
   
      //
      //
      //
      //
      //
      
      ObjectCreate(name,OBJ_ARROW,0,Time,0);
         ObjectSet(name,OBJPROP_ARROWCODE,theCode);
         ObjectSet(name,OBJPROP_COLOR,theColor);
         if (up)
               ObjectSet(name,OBJPROP_PRICE1,High+gap);
         else  ObjectSet(name,OBJPROP_PRICE1,Low -gap);
}

//
//
//
//
//
/*
void deleteArrows()
{
   string lookFor       = arrowsIdentifier+":";
   int    lookForLength = StringLen(lookFor);
   for (int i=ObjectsTotal()-1; i>=0; i--)
   {
      string objectName = ObjectName(i);
         if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);
   }
}
void deleteArrow(datetime time)
{
   string lookFor = arrowsIdentifier+":"+time; ObjectDelete(lookFor);
}
*/
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+  
//
//
//
//
//

void doAlert(string doWhat)
{
   static string   previousAlert="nothing";
   static datetime previousTime;
   string message;
   
      if (previousAlert != doWhat || previousTime != Time[0]) {
          previousAlert  = doWhat;
          previousTime   = Time[0];

          //
          //
          //
          //
          //

          message =  StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," RSI crossed EMA ",doWhat);
             if (alertsMessage) Alert(message);
             if (alertsEmail)   SendMail(StringConcatenate(Symbol(),"RsiEma"),message);
             if (alertsSound)   PlaySound("alert2.wav");
      }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//
//
//
//
//

int stringToTimeFrame(string tfs)
{
   for(int l = StringLen(tfs)-1; l >= 0; l--)
   {
      int tchar = StringGetChar(tfs,l);
          if((tchar > 96 && tchar < 123) || (tchar > 223 && tchar < 256))
               tfs = StringSetChar(tfs, l, tchar - 32);
          else
              if(tchar > -33 && tchar < 0)
                  tfs = StringSetChar(tfs, l, tchar + 224);
   }
   int tf=0;
         if (tfs=="M1" || tfs=="1")     tf=PERIOD_M1;
         if (tfs=="M5" || tfs=="5")     tf=PERIOD_M5;
         if (tfs=="M15"|| tfs=="15")    tf=PERIOD_M15;
         if (tfs=="M30"|| tfs=="30")    tf=PERIOD_M30;
         if (tfs=="H1" || tfs=="60")    tf=PERIOD_H1;
         if (tfs=="H4" || tfs=="240")   tf=PERIOD_H4;
         if (tfs=="D1" || tfs=="1440")  tf=PERIOD_D1;
         if (tfs=="W1" || tfs=="10080") tf=PERIOD_W1;
         if (tfs=="MN" || tfs=="43200") tf=PERIOD_MN1;
         if (tf==0 || tf<Period())      tf=Period();
   return(tf);
}


string tf()
{
   switch(timeFrame)
   {
      case PERIOD_M1:  return("M(1)");
      case PERIOD_M5:  return("M(5)");
      case PERIOD_M15: return("M(15)");
      case PERIOD_M30: return("M(30)");
      case PERIOD_H1:  return("H(1)");
      case PERIOD_H4:  return("H(4)");
      case PERIOD_D1:  return("D(1)");
      case PERIOD_W1:  return("W(1)");
      case PERIOD_MN1: return("MN(1)");
      default:         return("Unknown timeframe");
   }
}

一片笑语

发表于 2021-12-4 23:09:20 | 显示全部楼层

具体源码如上

黑土谈白云

发表于 2021-12-5 20:06:30 | 显示全部楼层

就是简单的RSI和MA交叉吧

汝爱我心

发表于 2021-12-13 12:23:59 | 显示全部楼层

谢谢

小松

发表于 2021-12-14 23:09:13 | 显示全部楼层

支持下

孟相臣

发表于 2021-12-15 22:27:10 | 显示全部楼层

支持下

依然范特西

发表于 2021-12-21 22:11:40 | 显示全部楼层

不留名

发表于 2022-1-6 12:34:08 | 显示全部楼层

万恩泽

发表于 2022-1-7 19:12:44 | 显示全部楼层

顶下

您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则