📅 财经日历 📊 实时波动 📈 大盘云图 📶 行情走势 🆚 投机情绪 🚀 今日热点

    30金币请教一个问题

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

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

    举报

     

    回答|共 81 个

    一片笑语 LV4

    发表于 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");
       }
    }

    一片笑语 LV4

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

    具体源码如上

    黑土谈白云 LV3

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

    就是简单的RSI和MA交叉吧

    汝爱我心 LV2

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

    谢谢

    小松 LV1

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

    支持下

    孟相臣 LV4

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

    支持下

    万恩泽 LV1

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

    顶下

    押切澈 LV1

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

    支持下

    画爱 LV1

    发表于 2022-1-17 23:34:01 | 显示全部楼层

    顶下
    您需要登录后才可以回帖 登录 | 注册

    提醒: 禁止引战、谩骂、灌水内容

    微信二维码

    有问题联系客服