admin 发表于 2018-1-19 15:01:50

EmacRectangle



//+-------------------------------------------------------------------+
//|                                                EmacRectangle.mq4|
//|                                             3EMA Cross Rectangle|
//+-------------------------------------------------------------------+

#property      indicator_chart_window
#property      indicator_buffers 2

#property      indicator_color1clrLime
#property      indicator_width12
#property      indicator_color2clrMagenta
#property      indicator_width22

extern int   EMA1                              = 3;
extern int   EMA2                              = 21;
extern int   EMA3                              = 63;
extern doublearrowDistance                     = 0.0003;
extern color   upRectColor                         = clrYellow;
extern color   dnRectColor                         = clrDodgerBlue;
extern color   touchRectColor                      = clrDarkGray;
//---
extern doublerectHigh                            = 0.0001;
extern int   rectDays                            = 3;   
extern int   bars_limit                        = 2000;
extern bool    showRectangle                     = true;                  
      
double upArrow[];
double dnArrow[];
double prev2EMA1, prev2EMA2, prev2EMA3;
double prevEMA1, prevEMA2, prevEMA3;
double curEMA1, curEMA2, curEMA3;
double prevOpenPrc, prevClosePrc, prevLowPrc, prevHighPrc;
string objRectName;
string rectArray[];   
string indiName                                    = "Emac";
int    rectValidity                              = 0;
int    arrayMaxAmounts                           = 99999;
int    arrayCurAmount                              = 0;
int    arrayLastAmount                           = 0;

//+------------------------------------------------------------------+
//| INIT()                                                         |
//+------------------------------------------------------------------+
int init(){
   if (Period() != PERIOD_H1) {
      Alert("Use only @ TF: H1");
      return(0);
   }
   ArrayResize(rectArray,arrayMaxAmounts,arrayMaxAmounts);
   IndicatorBuffers(2);
   SetIndexBuffer(0,upArrow);
   SetIndexBuffer(1,dnArrow);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(0,233);
   SetIndexArrow(1,234);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexLabel(0,"Up");
   SetIndexLabel(1,"Dn");
   return(0);
}

//+------------------------------------------------------------------+
//| DEINIT()                                                         |
//+------------------------------------------------------------------+
int deinit() {
int k=0;
while (k<ObjectsTotal())   {
    string objname = ObjectName(k);
    if (StringSubstr(objname,0,StringLen("Emac")) == "Emac")
      ObjectDelete(objname);
    else
      k++;
}   
return(0);
}

//+------------------------------------------------------------------+
//| START()                                                          |
//+------------------------------------------------------------------+
int start() {
   if (Period() != PERIOD_H1) {
      Alert("Use only @ TF: H1");
      return(0);
   }
   int limit,i,k;
   int counted_bars=IndicatorCounted();
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   //---
   if (limit>bars_limit-1 && bars_limit!=0) limit=bars_limit-1;
   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))   {
      Alert("Adjust limit settings or put more bars on your chart!");
      return(0);
   }
   //---
   for (i=0; i<limit; i++)    {
      prev2EMA1      = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+2);
      prev2EMA2      = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+2);
      prev2EMA3      = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+2);
      prevEMA1       = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i+1);
      prevEMA2       = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i+1);
      prevEMA3       = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i+1);
      curEMA1      = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);
      curEMA2      = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);
      curEMA3      = iMA(NULL,0,EMA3,0,MODE_EMA,PRICE_CLOSE,i);
      prevOpenPrc    = iOpen(NULL,0,i+1);
      prevClosePrc   = iClose(NULL,0,i+1);
      prevLowPrc   = iLow(NULL,0,i+1);
      prevHighPrc    = iHigh(NULL,0,i+1);
      rectValidity   = rectDays*86400;
         
      if ( (prev2EMA1<prev2EMA2)&&(prevEMA1>=prevEMA2)&&(curEMA1>curEMA2)&&(prevEMA2>=prevEMA3)&&(curEMA2>curEMA3) ) {// up
         upArrow = prevLowPrc - arrowDistance;
         if (showRectangle == true) {
            //-----------------------Draw Rectangle ----------------------
            objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));
            if (ObjectFind(objRectName) == -1)    {    // not exists   
               ObjectCreate(objRectName, OBJ_RECTANGLE, 0,Time,prevLowPrc,Time+rectValidity,prevLowPrc+rectHigh);
               ObjectSet(objRectName, OBJPROP_COLOR, upRectColor);
               ObjectSet(objRectName, OBJPROP_WIDTH, 0);
               ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);
               //--- put information to Array ---
               arrayCurAmount             = ArraySize(rectArray);
               rectArray= StringConcatenate(objRectName,"$up$",Time,"$",prevClosePrc,"$0");// 0=new, not yet touched
      
            }   // if
         } // if
      } // if
         
      if ( (prev2EMA1>prev2EMA2)&&(prevEMA1<=prevEMA2)&&(curEMA1<curEMA2)&&(prevEMA2<=prevEMA3)&&(curEMA2<curEMA3) ) {// down
         dnArrow = prevHighPrc + arrowDistance;
         if (showRectangle == true) {
            //-----------------------Draw Rectangle ----------------------
            objRectName = StringConcatenate(indiName,"_",FuncPeriodToStr(Period()),"_",DoubleToStr(Time,0));
            if (ObjectFind(objRectName) == -1)    {    // not exists   
               ObjectCreate(objRectName, OBJ_RECTANGLE, 0, Time,prevHighPrc,Time+rectValidity,prevHighPrc-rectHigh);
               ObjectSet(objRectName, OBJPROP_COLOR, dnRectColor);
               ObjectSet(objRectName, OBJPROP_WIDTH, 0);
               ObjectSet(objRectName, OBJPROP_STYLE, STYLE_SOLID);
               //--- put information to Array ---
               arrayCurAmount             = ArraySize(rectArray);
               rectArray= StringConcatenate(objRectName,"$dn$",Time,"$",prevClosePrc,"$0");// 0=new, not yet touched
      
            } // if
         } // if
      } // if
   }// for
      
   //-----------------------Edit Rectangle, change time2 & color, if price touched ----------------------
   /***************************
   if (showRectangle == true) {
      arrayLastAmount = ArraySize(rectArray);
      for (k=0; k<arrayLastAmount; k++) {// get every element of Array
         string sep = "$";
         ushort u_sep;
         string result[];               // new array to get strings
         
         u_sep = StringGetCharacter(sep,0);
         int n = StringSplit(rectArray,u_sep,result);
      
         //--- get rectangle price1, compare to ask/bid price
         //--- if rectangle is touched, change time2 & rectangle color
         
         double askPrc = MarketInfo(Symbol(),MODE_ASK);
         double bidPrc = MarketInfo(Symbol(),MODE_BID);
         
         if () {
            for (i=0; i<limit; i++){   // redraw if price touched
               //--- first, delete object
               
               
               //--- then recreate object with new properties
            
            
            } // for
         } // if
      }// for
   } // if
   ********************************/
      
   return(0);
} // start


//+------------------------------------------------------------------+
void DelObjects(string id)   {
   int ot1=ObjectsTotal();
   while(ot1>=0)   {
      if (StringFind(ObjectName(ot1),id,0)>-1)    {
         ObjectDelete(ObjectName(ot1));
      }
      ot1--;
   }
   return;
}   
      
//+------------------------------------------------------------------+
string FuncPeriodToStr(int thePeriod) {
   switch(thePeriod){
      case 1: return("M1");
      case 5: return("M5");
      case 15: return("M15");
      case 30: return("M30");
      case 60: return("H1");
      case 240: return("H4");
      case 1440: return("D1");
      case 10080: return("W1");
      case 43200: return("MN1");
      default: return("MN1");
   }
}

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



传奇 发表于 2020-7-18 21:10:06

学习了,不错

92469com 发表于 2020-7-31 15:57:36

谢谢楼主分享

李禹霏 发表于 2020-11-12 12:09:15

{:1_186:}

gf0402 发表于 2021-7-23 11:12:32

{:1_181:}

除非各部分 发表于 2021-7-31 20:09:07

顶下

wyrcjmlp 发表于 2021-8-6 13:25:25

谢谢
页: [1]
查看完整版本: EmacRectangle