外汇指标
EmacRectangle
回复:0  浏览:906
  • 楼主admin 圈主
  • 2019-05-05 05:06
GBPUSDH1.png

  1. //+-------------------------------------------------------------------+
  2. //|                                                EmacRectangle.mq4  |
  3. //|                                             3EMA Cross Rectangle  |
  4. //+-------------------------------------------------------------------+

  5. #property      indicator_chart_window
  6. #property      indicator_buffers 2

  7. #property      indicator_color1  clrLime
  8. #property      indicator_width1  2
  9. #property      indicator_color2  clrMagenta
  10. #property      indicator_width2  2

  11. extern int     EMA1                                = 3;
  12. extern int     EMA2                                = 21;
  13. extern int     EMA3                                = 63;
  14. extern double  arrowDistance                       = 0.0003;
  15. extern color   upRectColor                         = clrYellow;
  16. extern color   dnRectColor                         = clrDodgerBlue;
  17. extern color   touchRectColor                      = clrDarkGray;
  18. //---
  19. extern double  rectHigh                            = 0.0001;
  20. extern int     rectDays                            = 3;   
  21. extern int     bars_limit                          = 2000;  
  22. extern bool    showRectangle                       = true;                  
  23.       
  24. double upArrow[];
  25. double dnArrow[];
  26. double prev2EMA1, prev2EMA2, prev2EMA3;
  27. double prevEMA1, prevEMA2, prevEMA3;
  28. double curEMA1, curEMA2, curEMA3;
  29. double prevOpenPrc, prevClosePrc, prevLowPrc, prevHighPrc;
  30. string objRectName;
  31. string rectArray[];   
  32. string indiName                                    = "Emac";
  33. int    rectValidity                                = 0;  
  34. int    arrayMaxAmounts                             = 99999;
  35. int    arrayCurAmount                              = 0;
  36. int    arrayLastAmount                             = 0;

  37. //+------------------------------------------------------------------+
  38. //| INIT()                                                           |
  39. //+------------------------------------------------------------------+
  40. int init()  {
  41.    if (Period() != PERIOD_H1) {
  42.       alert("Use only [url=home.php?mod=space&uid=73392]@[/url] TF: H1");
  43.       return(0);
  44.    }
  45.    ArrayResize(rectArray,arrayMaxAmounts,arrayMaxAmounts);
  46.    IndicatorBuffers(2);
  47.    SetIndexBuffer(0,upArrow);
  48.    SetIndexBuffer(1,dnArrow);
  49.    SetIndexStyle(0,DRAW_ARROW);
  50.    SetIndexStyle(1,DRAW_ARROW);
  51.    SetIndexArrow(0,233);
  52.    SetIndexArrow(1,234);
  53.    SetIndexEmptyValue(0,0.0);
  54.    SetIndexEmptyValue(1,0.0);
  55.    SetIndexLabel(0,"Up");
  56.    SetIndexLabel(1,"Dn");
  57.    return(0);
  58. }

  59. //+------------------------------------------------------------------+
  60. //| DEINIT()                                                         |
  61. //+------------------------------------------------------------------+
  62. int deinit() {
  63.   int k=0;
  64.   while (k<ObjectsTotal())   {
  65.     string objname = ObjectName(k);
  66.     if (StringSubstr(objname,0,StringLen("Emac")) == "Emac")  
  67.       ObjectDelete(objname);
  68.     else
  69.       k++;
  70.   }   
  71.   return(0);
  72. }

  73. //+------------------------------------------------------------------+
  74. //| START()                                                          |
  75. //+------------------------------------------------------------------+
  76. int start() {
  77.    if (Period() != PERIOD_H1) {
  78.       alert("Use only @ TF: H1");
  79.       return(0);
  80.    }
  81.    int limit,i,k;
  82.    int counted_bars=IndicatorCounted();
  83.    //---- last counted bar will be recounted
  84.    if(counted_bars>0) counted_bars--;
  85.    limit=Bars-counted_bars;
  86.    //---
  87.    if (limit>bars_limit-1 && bars_limit!=0) limit=bars_limit-1;
  88.    if (Bars<EMA1 || Bars<EMA2 || Bars<EMA3 || (bars_limit>0 && bars_limit<EMA1) || (bars_limit>0 && bars_limit<EMA2) || (bars_limit>0 && bars_limit<EMA3))   {
  89.       alert("Adjust limit settings or put more bars on your chart!");
  90.       return(0);
  91.    }
  92.    //---
  93.    for (i=0; i<limit; i++)    {
  94.       prev2EMA1      = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+2);
  95.       prev2EMA2      = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+2);
  96.       prev2EMA3      = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+2);
  97.       prevEMA1       = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+1);
  98.       prevEMA2       = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+1);
  99.       prevEMA3       = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+1);
  100.       curEMA1        = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);
  101.       curEMA2        = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);
  102.       curEMA3        = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i);
  103.       prevOpenPrc    = iOpen(NULL,0,i+1);
  104.       prevClosePrc   = iClose(NULL,0,i+1);
  105.       prevLowPrc     = iLow(NULL,0,i+1);
  106.       prevHighPrc    = iHigh(NULL,0,i+1);
  107.       rectValidity   = rectDays*86400;
  108.          
  109.       if ( (prev2EMA1<prev2EMA2)&&(prevEMA1>=prevEMA2)&&(curEMA1>curEMA2)&&(prevEMA2>=prevEMA3)&&(curEMA2>curEMA3) ) {  // up
  110.          upArrow[i+1] = prevLowPrc - arrowDistance;
  111.          if (showRectangle == true) {
  112.             //-----------------------  Draw Rectangle ----------------------
  113.             objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time[i+1],0));
  114.             if (ObjectFind(objRectName) == -1)    {    // not exists   
  115.                ObjectCreate(objRectName, OBJ_RECTANGLE, 0,Time[i+1],prevLowPrc,Time[i+1]+rectValidity,prevLowPrc+rectHigh);
  116.                ObjectSet(objRectName, OBJPROP_COLOR, upRectColor);
  117.                ObjectSet(objRectName, OBJPROP_WIDTH, 0);
  118.                ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);
  119.                //--- put information to Array ---
  120.                arrayCurAmount             = ArraySize(rectArray);
  121.                rectArray[arrayCurAmount]  = StringConcatenate(objRectName,"$up$",Time[i+1],"$",prevClosePrc,"$0");  // 0=new, not yet touched
  122.       
  123.             }   // if
  124.          } // if
  125.       } // if
  126.          
  127.       if ( (prev2EMA1>prev2EMA2)&&(prevEMA1<=prevEMA2)&&(curEMA1<curEMA2)&&(prevEMA2<=prevEMA3)&&(curEMA2<curEMA3) ) {  // down
  128.          dnArrow[i+1] = prevHighPrc + arrowDistance;
  129.          if (showRectangle == true) {
  130.             //-----------------------  Draw Rectangle ----------------------
  131.             objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time[i+1],0));
  132.             if (ObjectFind(objRectName) == -1)    {    // not exists   
  133.                ObjectCreate(objRectName, OBJ_RECTANGLE, 0, Time[i+1],prevHighPrc,Time[i+1]+rectValidity,prevHighPrc-rectHigh);
  134.                ObjectSet(objRectName, OBJPROP_COLOR, dnRectColor);
  135.                ObjectSet(objRectName, OBJPROP_WIDTH, 0);
  136.                ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);
  137.                //--- put information to Array ---
  138.                arrayCurAmount             = ArraySize(rectArray);
  139.                rectArray[arrayCurAmount]  = StringConcatenate(objRectName,"$dn$",Time[i+1],"$",prevClosePrc,"$0");  // 0=new, not yet touched
  140.       
  141.             } // if  
  142.          } // if
  143.       } // if
  144.    }  // for  
  145.       
  146.    //-----------------------  Edit Rectangle, change time2 & color, if price touched ----------------------  
  147.    
  148.       
  149.    return(0);
  150. } // start


  151. //+------------------------------------------------------------------+
  152. void DelObjects(string id)   {
  153.    int ot1=ObjectsTotal();
  154.    while(ot1>=0)   {
  155.       if (StringFind(ObjectName(ot1),id,0)>-1)    {
  156.          ObjectDelete(ObjectName(ot1));
  157.       }
  158.       ot1--;
  159.    }
  160.    return;
  161. }   
  162.       
  163. //+------------------------------------------------------------------+
  164. string FuncPeriodToStr(int thePeriod) {  
  165.    switch(thePeriod)  {
  166.       case 1: return("M1");
  167.       case 5: return("M5");
  168.       case 15: return("M15");
  169.       case 30: return("M30");
  170.       case 60: return("H1");
  171.       case 240: return("H4");
  172.       case 1440: return("D1");
  173.       case 10080: return("W1");
  174.       case 43200: return("MN1");
  175.       default: return("MN1");
  176.    }
  177. }

  178. //+------------------------------------------------------------------+