Urgent: Please assist: Symbol() but it is giving me the wrong Currency Symbol it is attached to

 

Hi guys,


Please assist. I created an alert to alert on first touch of Moving average but it is alerting me on the wrong symbol. I attached it onto AUDJPY but it alerts - EMA touched on AUDCAD


DO you know why?


Below is the full code:


//+------------------------------------------------------------------+
//| MA Cross Arrows.mq4 |
//| Copyright © 2006 Scorpion@fxfisherman.com |
//+------------------------------------------------------------------+
#property copyright "FxFisherman.com"
#property link "http://www.fxfisherman.com"


//Crossed_Pips: If you want to delay until price has crossed x pips from MA, set it to x. Set to 0 for instant alert.
//MA_Type: Moving Average Type. 0 = Simple, 1 = Exponential, 2 = Smooth, 3 = Weighted
//MA_Period: Moving Average Period (bars).

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Wheat
#property indicator_color2 White
#property indicator_color3 DarkTurquoise

extern int Crossed_Pips = 0;
extern int MA_Period = 365;
extern int MA_Type = 1;
extern int Shift_Bars=0;
extern int Bars_Count= 1000;
int state;

//---- buffers
double v1[];
double v2[];
double v3[];

int AlreadyAlertedFlag = false;
int init()

{

IndicatorBuffers(3);
SetIndexArrow(0,217);
SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1);
SetIndexDrawBegin(1,MA_Period * 2);
SetIndexBuffer(0, v1);
SetIndexLabel(0,"Buy");

SetIndexArrow(1,218);
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1);
SetIndexDrawBegin(1,MA_Period * 2);
SetIndexBuffer(1, v2);
SetIndexLabel(1,"Sell");


SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1);
SetIndexDrawBegin(1,MA_Period * 2);
SetIndexBuffer(2, v3);
SetIndexLabel(2,"MA");

watermark();

return(0);
}

bool NewBar()

{

static datetime lastbar;

datetime curbar = Time[0];

if(lastbar!=curbar)

{

lastbar=curbar;

return (true);

}

else return(false);

}

int start()
{
double ma;
int previous;
int i;
int shift;
bool crossed_up, crossed_down;
int totalBars = Bars - (MA_Period * 2);

if (Bars_Count > 0 && Bars_Count <= totalBars)
{
i = Bars_Count;
}else if(totalBars <= 0 ) {
return(0);
}else{
i = totalBars;
}

while(i>=0)
{
shift = i + Shift_Bars;
ma = iMA(Symbol(), Period(), MA_Period, 0, MA_Type, PRICE_CLOSE, shift);
crossed_up = High[shift] >= (ma + (Crossed_Pips * Point));
crossed_down = Low[shift] <= (ma - (Crossed_Pips * Point));

v1[i] = NULL;
v2[i] = NULL;
v3[i] = ma;
if (crossed_up && previous != 1) {
v1[i] = ma + (Crossed_Pips * Point);
previous = 1;
}else if(crossed_down && previous != 2){
v2[i] = ma - (Crossed_Pips * Point);
previous = 2;
}

i--;
}

if(NewBar())
{
ma = iMA(Symbol(), Period(), MA_Period, 0, MA_Type, PRICE_CLOSE, 0);
if (Close[0] >= ma + (Crossed_Pips * Point) && state != 1) {
Alert("365EMA Touched " + Symbol() + " TF " + Period() + " Date " + TimeToStr(iTime(NULL, 0, 0) | 2));
SendMail("365EMA Touched " + Symbol() + " TF " + Period() + " Date " + TimeToStr(iTime(NULL, 0, 0) | 2),"H: " + iHigh(NULL, 0, 0) + " L: " + iLow(NULL, 0, 0) + " C: " + iClose(NULL, 0, 0));

}else if (Close[0] <= ma - (Crossed_Pips * Point) && state != -1) {
Alert("365EMA Touched " + Symbol() + " TF " + Period() + " Date " + TimeToStr(iTime(NULL, 0, 0) | 2));
SendMail("365EMA Touched " + Symbol() + " TF " + Period() + " Date " + TimeToStr(iTime(NULL, 0, 0) | 2),"H: " + iHigh(NULL, 0, 0) + " L: " + iLow(NULL, 0, 0) + " C: " + iClose(NULL, 0, 0));

}
}
return(0);
}

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

void watermark()
{
ObjectCreate("fxfisherman", OBJ_LABEL, 0, 0, 0);
ObjectSetText("fxfisherman", "fxfisherman.com", 11, "Lucida Handwriting", RoyalBlue);
ObjectSet("fxfisherman", OBJPROP_CORNER, 2);
ObjectSet("fxfisherman", OBJPROP_XDISTANCE, 5);
ObjectSet("fxfisherman", OBJPROP_YDISTANCE, 10);
return(0);
}

 
Anyone can assist on this error?
 

Sorry no - we're all thinking there's another copy of the indi attached to an AUDCAD chart...

-BB-

 
I found out that it actually gives the signal for the PREVIOUS signal ... I do not know why .... you all can try it out. Attach it to a 1 min chart and see - It will give the signal of the PREVIOUS signal ... weird ... I wonder why ... Anyone knows why?
 

Is there something wrong with the coding?


For example:


If I attach 1 365 EMA to it and then a 150EMA to it for the alert, it will signal the 365 without signalling the 150EMA. Only when another alert goes off, does it signal the 150EMA touch and not the latest alert ...


not sure if you understand what I mean

 
Or is there anyway to do the coding instead of using New bar so that once there is 1 alert on the indicator, the alert will stop till I reattach the indicator?
 
Anyone can assist?
 
tradertt:
Or is there anyway to do the coding instead of using New bar so that once there is 1 alert on the indicator, the alert will stop till I reattach the indicator?

That's easy:

int Start(){
  static bool disabled=false; if (disabled) return(0);
  ///...
  if (CONDITION) {
     Alert(...);
     Comment("EA DISABLED");
     disabled=true;
  }
  //...
}
 
tradertt:
I found out that it actually gives the signal for the PREVIOUS signal ... I do not know why .... you all can try it out. Attach it to a 1 min chart and see - It will give the signal of the PREVIOUS signal ... weird ... I wonder why ... Anyone knows why?

You have:

if (CONDITION1) {
  Alert(ALERT1)...
} else if (CONDITION2) {
  Alert(ALERT2)...
}

Shouldn't it be in the form:

if (CONDITION1) {
  Alert(ALERT1)...
}
if (CONDITION2) {
  Alert(ALERT2)...
}
Reason: