/****************************************************************************
$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