Author: Copyright (c) 2014 Alex Stoliarchuk
0 Views
0 Downloads
0 Favorites
EWM
/****************************************************************************
$Id: EWM.mq4 1438 2015-03-19 15:27:50Z alex $
****************************************************************************/
#property copyright "Copyright (c) 2014 Alex Stoliarchuk"
#property link      "http://alex100.com"
#property version     "$Revision: 1438 $"
#property strict
#property indicator_chart_window

#define CountLevels 12
#define TF_MN1 OBJ_PERIOD_M1|OBJ_PERIOD_M5|OBJ_PERIOD_M15|OBJ_PERIOD_M30|OBJ_PERIOD_H1|OBJ_PERIOD_H4|OBJ_PERIOD_D1|OBJ_PERIOD_W1|OBJ_PERIOD_MN1
#define TF_W1 OBJ_PERIOD_M1|OBJ_PERIOD_M5|OBJ_PERIOD_M15|OBJ_PERIOD_M30|OBJ_PERIOD_H1|OBJ_PERIOD_H4|OBJ_PERIOD_D1|OBJ_PERIOD_W1
#define TF_D1 OBJ_PERIOD_M1|OBJ_PERIOD_M5|OBJ_PERIOD_M15|OBJ_PERIOD_M30|OBJ_PERIOD_H1|OBJ_PERIOD_H4|OBJ_PERIOD_D1
#define TF_H4 OBJ_PERIOD_M1|OBJ_PERIOD_M5|OBJ_PERIOD_M15|OBJ_PERIOD_M30|OBJ_PERIOD_H1|OBJ_PERIOD_H4
#define TF_H1 OBJ_PERIOD_M1|OBJ_PERIOD_M5|OBJ_PERIOD_M15|OBJ_PERIOD_M30|OBJ_PERIOD_H1
#define TF_M30 OBJ_PERIOD_M1|OBJ_PERIOD_M5|OBJ_PERIOD_M15|OBJ_PERIOD_M30
#define TF_M15 OBJ_PERIOD_M1|OBJ_PERIOD_M5|OBJ_PERIOD_M15
#define TF_M5 OBJ_PERIOD_M1|OBJ_PERIOD_M5
#define TF_M1 OBJ_PERIOD_M1

string Imp[CountLevels][21] = {
   "[I]","[II]","[III]","[IV]","[V]","[VI]","[VII]","[VIII]","[IX]","[X]","[XI]","[XII]","[XIII]","[XIV]","[XV]","[XVI]","[XVII]","[XVIII]","[XIX]","[XX]","[XXI]",
   "(I)","(II)","(III)","(IV)","(V)","(VI)","(VII)","(VIII)","(IX)","(X)","(XI)","(XII)","(XIII)","(XIV)","(XV)","(XVI)","(XVII)","(XVIII)","(XIX)","(XX)","(XXI)",
   "I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII","XIII","XIV","XV","XVI","XVII","XVIII","XIX","XX","XXI",
   "[1]","[2]","[3]","[4]","[5]","[6]","[7]","[8]","[9]","[10]","[11]","[12]","[13]","[14]","[15]","[16]","[17]","[18]","[19]","[20]","[21]",
   "(1)","(2)","(3)","(4)","(5)","(6)","[7]","[8]","[9]","[10]","(11)","(12)","(13)","(14)","(15)","(16)","[17]","[18]","[19]","[20]","[21]",
   "1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21",
   "[i]","[ii]","[iii]","[iv]","[v]","[vi]","[vii]","[viii]","[ix]","[x]","[xi]","[xii]","[xiii]","[xiv]","[xv]","[xvi]","[xvii]","[xviii]","[xix]","[xx]","[xxi]",
   "(i)","(ii)","(iii)","(iv)","(v)","(vi)","(vii)","(viii)","(ix)","(x)","(xi)","(xii)","(xiii)","(xiv)","(xv)","(xvi)","(xvii)","(xviii)","(xix)","(xx)","(xxi)",
   "i","ii","iii","iv","v","vi","vii","viii","ix","x","xi","xii","xiii","xiv","xv","xvi","xvii","xviii","xix","xx","xxi",
   "[1]","[2]","[3]","[4]","[5]","[6]","[7]","[8]","[9]","[10]","[11]","[12]","[13]","[14]","[15]","[16]","[17]","[18]","[19]","[20]","[21]",
   "(1)","(2)","(3)","(4)","(5)","(6)","[7]","[8]","[9]","[10]","(11)","(12)","(13)","(14)","(15)","(16)","[17]","[18]","[19]","[20]","[21]",
   "1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21"
};
string Cor[CountLevels][5] = {
   "[a]","[b]","[c]","[d]","[e]",
   "(a)","(b)","(c)","(d)","(e)",
   "a","b","c","d","e",
   "[A]","[B]","[C]","[D]","[E]",
   "(A)","(B)","(C)","(D)","(E)",
   "A","B","C","D","E",
   "[a]","[b]","[c]","[d]","[e]",
   "(a)","(b)","(c)","(d)","(e)",
   "a","b","c","d","e",
   "[A]","[B]","[C]","[D]","[E]",
   "(A)","(B)","(C)","(D)","(E)",
   "A","B","C","D","E"
};
string CorW[CountLevels][5] = {
   "[w]","[x]","[y]","[xx]","[z]",
   "(w)","(x)","(y)","(xx)","(z)",
   "w","x","y","xx","z",
   "[W]","[X]","[Y]","[XX]","[Z]",
   "(W)","(X)","(Y)","(XX)","(Z)",
   "W","X","Y","XX","Z",
   "[w]","[x]","[y]","[xx]","[z]",
   "(w)","(x)","(y)","(xx)","(z)",
   "w","x","y","xx","z",
   "[W]","[X]","[Y]","[XX]","[Z]",
   "(W)","(X)","(Y)","(XX)","(Z)",
   "W","X","Y","XX","Z"
};
color Colors[CountLevels] = {Magenta,Aqua,Red,Maroon,Green,Blue,DarkOrange,BlueViolet,DodgerBlue,Turquoise,RoyalBlue,SlateBlue};
int Level=4;
int TIMEFRAMES=0;

long MouseX=0,MouseY=0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
bool CreateLabel(string Name, int X, int Y, string Text)
  {
   if (ObjectCreate(0,Name,OBJ_LABEL,0,0,0)) {
     ObjectSetInteger(0,Name,OBJPROP_ANCHOR,ANCHOR_CENTER);
     ObjectSetInteger(0,Name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
     ObjectSetInteger(0,Name,OBJPROP_XDISTANCE,X);
     ObjectSetInteger(0,Name,OBJPROP_YDISTANCE,Y);
     ObjectSetString(0,Name,OBJPROP_TEXT,Text);
     ObjectSetInteger(0,Name,OBJPROP_SELECTABLE,false);
     ObjectSetInteger(0,Name,OBJPROP_HIDDEN,true);
     ObjectSetInteger(0,Name,OBJPROP_FONTSIZE,10);
   } else {
     Print(__FUNCTION__,": Error create label!:",GetLastError());
     return(false);
   }
   return(true);
  }

bool CreateText(string Name, int X, int Y, string Text, color Color)
  {
   int   sw=0;
   datetime dt=0;
   double   p=0;
   if (ChartXYToTimePrice(0,X,Y,sw,dt,p) && ObjectCreate(0,Name,OBJ_TEXT,sw,dt,p)) {
     ObjectSetInteger(0,Name,OBJPROP_ANCHOR,ANCHOR_CENTER);
     ObjectSetString(0,Name,OBJPROP_TEXT,Text);
     ObjectSetInteger(0,Name,OBJPROP_SELECTED,true);
     ObjectSetInteger(0,Name,OBJPROP_FONTSIZE,10);
     ObjectSetInteger(0,Name,OBJPROP_COLOR,Color);
     ObjectSetInteger(0,Name,OBJPROP_TIMEFRAMES,TIMEFRAMES);
   } else {
     Print(__FUNCTION__,": Error create text!:",GetLastError());
     return(false);
   }
   return(true);
  }

void UnselectAll()
  {
    int CountObjects=ObjectsTotal();
    for(int i=0;i<=CountObjects-1;i++) {
      string Name=ObjectName(i);
      ObjectSetInteger(0,Name,OBJPROP_SELECTED,false);
    }
  }

string ObjectNameXY(long X,long Y)
  {
    string ON="";
    int CountObjects=ObjectsTotal();
    long D2=-1,dX=0,dY=0;
    int XO=0,YO=0;
    for(int i=0;i<=CountObjects-1;i++) {
      string Name=ObjectName(i);
      int Type=ObjectType(Name);
      switch(Type) {
        case OBJ_LABEL:
          ObjectSetInteger(0,Name,OBJPROP_CORNER,CORNER_LEFT_UPPER);
          XO=(int)ObjectGetInteger(0,Name,OBJPROP_XDISTANCE);
          YO=(int)ObjectGetInteger(0,Name,OBJPROP_YDISTANCE);
          break;
        case OBJ_TEXT: {
          double P=ObjectGetDouble(0,Name,OBJPROP_PRICE);
          long   T=ObjectGetInteger(0,Name,OBJPROP_TIME);
          ChartTimePriceToXY(0,0,T,P,XO,YO);
          break;
        }
        default: continue;
      }
      dX=XO-X;
      dY=YO-Y;
      long DO2=dX*dX+dY*dY;
      if (DO2<D2 || D2==-1) {
        D2=DO2;
        ON=Name;
      }
    }
    return(ON);
  }

bool CreateImp()
  {
   UnselectAll();
   string Name="EWMI"+IntegerToString(Level,2,'0')+IntegerToString(TimeLocal(),12,'0');
   CreateText(Name+"0",250,30,Imp[Level][0],Colors[Level]);
   CreateText(Name+"1",270,30,Imp[Level][1],Colors[Level]);
   CreateText(Name+"2",290,30,Imp[Level][2],Colors[Level]);
   CreateText(Name+"3",310,30,Imp[Level][3],Colors[Level]);
   CreateText(Name+"4",330,30,Imp[Level][4],Colors[Level]);
   return(true);
  }

bool CreateCor()
  {
   UnselectAll();
   string Name="EWMA"+IntegerToString(Level,2,'0')+IntegerToString(TimeLocal(),12,'0');
   CreateText(Name+"0",370,30,Cor[Level][0],Colors[Level]);
   CreateText(Name+"1",390,30,Cor[Level][1],Colors[Level]);
   CreateText(Name+"2",410,30,Cor[Level][2],Colors[Level]);
   CreateText(Name+"3",430,30,Cor[Level][3],Colors[Level]);
   CreateText(Name+"4",450,30,Cor[Level][4],Colors[Level]);
   return(true);
  }

bool CreateCorW()
  {
   UnselectAll();
   string Name="EWMW"+IntegerToString(Level,2,'0')+IntegerToString(TimeLocal(),12,'0');
   CreateText(Name+"0",490,30,CorW[Level][0],Colors[Level]);
   CreateText(Name+"1",510,30,CorW[Level][1],Colors[Level]);
   CreateText(Name+"2",530,30,CorW[Level][2],Colors[Level]);
   CreateText(Name+"3",550,30,CorW[Level][3],Colors[Level]);
   CreateText(Name+"4",570,30,CorW[Level][4],Colors[Level]);
   return(true);
  }

void CreateNewText(string OwnerName,int Delta=1)
  {
   int XO=0,YO=0;
   if (ObjectType(OwnerName)!=OBJ_TEXT) { return; }
   string Type=StringSubstr(OwnerName,3,1);
   int L=(int)StringToInteger(StringSubstr(OwnerName,4,2));
   double P=ObjectGetDouble(0,OwnerName,OBJPROP_PRICE);
   long   T=ObjectGetInteger(0,OwnerName,OBJPROP_TIME);
   ChartTimePriceToXY(0,0,T,P,XO,YO);
   int N=(int)StringToInteger(StringSubstr(OwnerName,18))+Delta;
   if (Type=="I") {
     if (N>=ArrayRange(Imp,1) || N<0) {return;}
     string Name=StringSubstr(OwnerName,0,18)+IntegerToString(N);
     CreateText(Name,XO+20,YO,Imp[L][N],Colors[L]);
   } else if (Type=="A") {
     if (N>=ArrayRange(Cor,1) || N<0) {return;}
     string Name=StringSubstr(OwnerName,0,18)+IntegerToString(N);
     CreateText(Name,XO+20,YO,Cor[L][N],Colors[L]);
   } else if (Type=="W") {
     if (N>=ArrayRange(CorW,1) || N<0) {return;}
     string Name=StringSubstr(OwnerName,0,18)+IntegerToString(N);
     CreateText(Name,XO+20,YO,CorW[L][N],Colors[L]);
   }
  }

string GetTextLabel(string &a[][])
  {
    string S="";
    for (int i=0; i<5; i++) {
      S+=a[Level][i]+" ";
    }
    return(S);
  }

void SetLevelText(string Name,int L,string &a[][])
  {
    if (L<0) {
      L=0;
    } else if (L>=CountLevels) {
      L=CountLevels-1;
    }
    string NewName=StringSubstr(Name,0,4)+IntegerToString(L,2,'0')+StringSubstr(Name,6);
    string Type=StringSubstr(Name,3,1);
    int Count=0;
    if (Type=="I") {
      Count=ArrayRange(Imp,1);
    } else {
      Count=5;
    }
    for (int N=0; N<Count; N++) {
      string SN=IntegerToString(N);
      ObjectSetString(0,Name+SN,OBJPROP_TEXT,a[L][N]);
      ObjectSetInteger(0,Name+SN,OBJPROP_COLOR,Colors[L]);
      ObjectSetString(0,Name+SN,OBJPROP_NAME,NewName+SN);
    }
  }

void SetLevel(int L, string ON="")
  {
    if (ON=="" || ON=="EWMImp" || ON=="EWMCor" || ON=="EWMCorW") {
      if (L<0) {
        L=0;
      } else if (L>=CountLevels) {
        L=CountLevels-1;
      }
      Level=L;
      ObjectSetString(0,"EWMImp",OBJPROP_TEXT,GetTextLabel(Imp));
      ObjectSetInteger(0,"EWMImp",OBJPROP_COLOR,Colors[L]);
      ObjectSetString(0,"EWMCor",OBJPROP_TEXT,GetTextLabel(Cor));
      ObjectSetInteger(0,"EWMCor",OBJPROP_COLOR,Colors[L]);
      ObjectSetString(0,"EWMCorW",OBJPROP_TEXT,GetTextLabel(CorW));
      ObjectSetInteger(0,"EWMCorW",OBJPROP_COLOR,Colors[L]);
    } else if (StringSubstr(ON,0,3)=="EWM"){
      string Name=StringSubstr(ON,0,18);
      int LL=(int)StringToInteger(StringSubstr(ON,4,2));
      LL+=L-Level;
      string Type=StringSubstr(ON,3,1);
      if (Type=="I") {
        SetLevelText(Name,LL,Imp);
      } else if (Type=="A") {
        SetLevelText(Name,LL,Cor);
      } else if (Type=="W") {
        SetLevelText(Name,LL,CorW);
      }
    }
  }

void ChangeSelectLevel(string ON)
  {
    if (ObjectType(ON)!=OBJ_TEXT) { return; }
    bool Sel=ObjectGetInteger(0,ON,OBJPROP_SELECTED);
    string Name=StringSubstr(ON,0,18);
    string Type=StringSubstr(ON,3,1);
    int Count=0;
    if (Type=="I") {
      Count=ArrayRange(Imp,1);
    } else {
      Count=5;
    }
    for (int N=0; N<Count; N++) {
      ObjectSetInteger(0,Name+IntegerToString(N),OBJPROP_SELECTED,!Sel);
    }
  }

void SetTimeFrames(string ON)
  {
    if (ObjectType(ON)!=OBJ_TEXT) { return; }
    string Name=StringSubstr(ON,0,18);
    string Type=StringSubstr(ON,3,1);
    int Count=0;
    if (Type=="I") {
      Count=ArrayRange(Imp,1);
    } else {
      Count=5;
    }
    for (int N=0; N<Count; N++) {
      ObjectSetInteger(0,Name+IntegerToString(N),OBJPROP_TIMEFRAMES,TIMEFRAMES);
    }
  }


int OnInit()
  {
//--- indicator buffers mapping
   Print("$Id: EWM.mq4 1438 2015-03-19 15:27:50Z alex $");
   switch(Period()) {
     case PERIOD_MN1:
       Level=2;
       TIMEFRAMES=TF_MN1;
       break;
     case PERIOD_W1:
       Level=3;
       TIMEFRAMES=TF_MN1;
       break;
     case PERIOD_D1:
       Level=4;
       TIMEFRAMES=TF_W1;
       break;
     case PERIOD_H4:
       Level=5;
       TIMEFRAMES=TF_D1;
       break;
     case PERIOD_H1:
       Level=6;
       TIMEFRAMES=TF_H4;
       break;
     case PERIOD_M30:
       Level=7;
       TIMEFRAMES=TF_H1;
       break;
     case PERIOD_M15:
       Level=8;
       TIMEFRAMES=TF_M30;
       break;
     case PERIOD_M5:
       Level=9;
       TIMEFRAMES=TF_M15;
       break;
     case PERIOD_M1:
       Level=10;
       TIMEFRAMES=TF_M5;
       break;
   }
   if (!CreateLabel("EWMImp",300,6," ")) {
      Print("EWMImp not create");
   }
   if (!CreateLabel("EWMCor",410,6," ")) {
      Print("EWMCor not create");
   }
   if (!CreateLabel("EWMCorW",530,6," ")) {
      Print("EWMCorW not create");
   }
   
   SetLevel(Level);
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);

   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"EWMImp");
   ObjectDelete(0,"EWMCor");
   ObjectDelete(0,"EWMCorW");
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   switch(id) {
    case CHARTEVENT_MOUSE_MOVE:
     MouseX=lparam;
     MouseY=(long)dparam;
     break;
    case CHARTEVENT_KEYDOWN:
#ifdef _DEBUG
     Print("lparam:",lparam);
     Print("dparam:",dparam);
     Print("sparam:",sparam);
#endif
     switch((int)lparam) {
       case 221:// ]
         SetLevel(Level-1,ObjectNameXY(MouseX,MouseY));
         break;
       case 219:// [
         SetLevel(Level+1,ObjectNameXY(MouseX,MouseY));
         break;
       case 45:// Insert
         ChangeSelectLevel(ObjectNameXY(MouseX,MouseY));
         break;
       case 78:// n
         CreateNewText(ObjectNameXY(MouseX,MouseY));
         break;
       case 80:// p
         CreateNewText(ObjectNameXY(MouseX,MouseY),-1);
         break;
       case 84:// t
         SetTimeFrames(ObjectNameXY(MouseX,MouseY));
         break;
     }
     break;
    case CHARTEVENT_OBJECT_CLICK:
#ifdef _DEBUG
     Print("CHARTEVENT_OBJECT_CLICK");
     Print("lparam:",lparam);
     Print("dparam:",dparam);
     Print("sparam:",sparam);
#endif
     if (sparam=="EWMImp") {
       CreateImp();
     }
     if (sparam=="EWMCor") {
       CreateCor();
     }
     if (sparam=="EWMCorW") {
       CreateCorW();
     }
     break;
   }
  }
//+------------------------------------------------------------------+

Comments