MessageBox()

 

I need some help. Somehow I can't display one simple message box.

 if((Open[0] <  (sum/MA_Period) && Low[0] > (sum/MA_Period))  || (Open[0] > (sum/MA_Period) && Low[0] < (sum/MA_Period))){
       MessageBox("Pass Average", "Windown Tittle")

The rest of the moving average file is kept the same. Is it because this is a custom indicator so it can't display it? If so, how can i do it? Thanks guy in advance.

P/S: i'm still new to C++ so pls be easy on me.

//+------------------------------------------------------------------+
//|                                        Custom Moving Average.mq4 |
//|                      Copyright ゥ 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright ゥ 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int MA_Period=13;
extern int MA_Shift=0;
extern int MA_Method=0;
//---- indicator buffers
double ExtMapBuffer[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   int    draw_begin;
   string short_name;
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexShift(0,MA_Shift);
   
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   if(MA_Period<2) MA_Period=13;
   draw_begin=MA_Period-1;
//---- indicator short name
   switch(MA_Method)
     {
      case 1 : short_name="EMA(";  draw_begin=0; break;
      case 2 : short_name="SMMA("; break;
      case 3 : short_name="LWMA("; break;
      default :
         MA_Method=0;
         short_name="SMA(";
     }
   IndicatorShortName(short_name+MA_Period+")");
   SetIndexDrawBegin(0,draw_begin);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if(Bars<=MA_Period) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
   if (ExtCountedBars>0) ExtCountedBars--;
//----
   switch(MA_Method)
     {
      case 0 : sma();  break;
      case 1 : ema();  break;
      case 2 : smma(); break;
      case 3 : lwma();
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+
//| Simple Moving Average                                            |
//+------------------------------------------------------------------+
void sma()
  {
   double sum=0;
   int    i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
   if(pos<MA_Period) pos=MA_Period;
   for(i=1;i<MA_Period;i++,pos--)
      sum+=Close[pos];
//---- main calculation loop
   while(pos>=0)
     {
      sum+=Close[pos];
      ExtMapBuffer[pos]=sum/MA_Period;
      
      
      if((Open[0] <  (sum/MA_Period) && Low[0] > (sum/MA_Period))  || (Open[0] > (sum/MA_Period) && Low[0] < (sum/MA_Period))){
       MessageBox("Pass Average", "Windown Tittle");
}


           sum-=Close[pos+MA_Period-1];
           pos--;
     }
//---- zero initial bars
   if(ExtCountedBars<1)
      for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
  }
//+------------------------------------------------------------------+
//| Exponential Moving Average                                       |
//+------------------------------------------------------------------+
void ema()
  {
   double pr=2.0/(MA_Period+1);
   int    pos=Bars-2;
   if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
//---- main calculation loop
   while(pos>=0)
     {
      if(pos==Bars-2) ExtMapBuffer[pos+1]=Close[pos+1];
      ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
           pos--;
     }
  }
//+------------------------------------------------------------------+
//| Smoothed Moving Average                                          |
//+------------------------------------------------------------------+
void smma()
  {
   double sum=0;
   int    i,k,pos=Bars-ExtCountedBars+1;
//---- main calculation loop
   pos=Bars-MA_Period;
   if(pos>Bars-ExtCountedBars) pos=Bars-ExtCountedBars;
   while(pos>=0)
     {
      if(pos==Bars-MA_Period)
        {
         //---- initial accumulation
         for(i=0,k=pos;i<MA_Period;i++,k++)
           {
            sum+=Close[k];
            //---- zero initial bars
            ExtMapBuffer[k]=0;
           }
        }
      else sum=ExtMapBuffer[pos+1]*(MA_Period-1)+Close[pos];
      ExtMapBuffer[pos]=sum/MA_Period;
           pos--;
     }
  }
//+------------------------------------------------------------------+
//| Linear Weighted Moving Average                                   |
//+------------------------------------------------------------------+
void lwma()
  {
   double sum=0.0,lsum=0.0;
   double price;
   int    i,weight=0,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
   if(pos<MA_Period) pos=MA_Period;
   for(i=1;i<=MA_Period;i++,pos--)
     {
      price=Close[pos];
      sum+=price*i;
      lsum+=price;
      weight+=i;
     }
//---- main calculation loop
   pos++;
   i=pos+MA_Period;
   while(pos>=0)
     {
      ExtMapBuffer[pos]=sum/weight;
      if(pos==0) break;
      pos--;
      i--;
      price=Close[pos];
      sum=sum-lsum+price*MA_Period;
      lsum-=Close[i];
      lsum+=price;
     }
//---- zero initial bars
   if(ExtCountedBars<1)
      for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
  }
//+------------------------------------------------------------------+
 
Some commands are ignored in indicators, because they could stop the indicators' thread. Try this command in a script or EA.
 
I tried it in script and yet still doesn't work.
 
nguye235:
I tried it in script and yet still doesn't work.

Then you have a bug in your code.
 
if((Open[0] <  (sum/MA_Period) && Low[0] > (sum/MA_Period))  || (Open[0] > (sum/MA_Period) && Low[0] < (sum/MA_Period))){
       MessageBox("Pass Average", "Windown Tittle")

Did you check to be sure it is possible for Open[0] to be less than the MA at the same time as Low[0] is bigger ? Think about it ...

 
int MessageBox( string text=NULL, string caption=NULL, int flags=EMPTY)
The MessageBox function creates, displays, and operates message box. The message box contains an application-defined message and header, as well as a random combination of predefined icons and push buttons. If the function succeeds, the returned value is one of the MessageBox return code values.
The function cannot be called from custom indicators since they are executed within interface thread and may not decelerate it.
 
GumRai: The function cannot be called from custom indicators since they are executed within interface thread and may not decelerate it.
Nor can it be called in scripts and EAs from the init() function (same reason)
 
WHRoeder:
Nor can it be called in scripts and EAs from the init() function (same reason)

That surprises me as I have used MessageBox in the init()function of EAs and it has worked as I expected.
 
WHRoeder:
Nor can it be called in scripts and EAs from the init() function (same reason)

This is not true. RTFM :-D

Scripts and experts work in their own thread. Custom indicators work in the main interface thread. If a custom indicator has been called with the iCustom() function, this indicator works in the thread of the program that has called it. Library (imported) functions work in the calling program thread, as well.

 
angevoyageur: This is not true. RTFM :-D

I Thought I had:

Message box waits for a user response and returns one of the return codes

Init() must return within 2.5 seconds.

Therefor message box can not be used in init.

Rereading it deinit() and start() when IsStopped, must return withing 2.5 seconds. Not init(). So I stand corrected.

 

Hi,

I am really sorry as I don't know if this is the right thread to post or no... 

I am trying to show message every time with alert when candlestick pattern is found but it shows once only when I test the code.

Code is:

if(op2>cl2 && op1<cl1 && op2<cl1)

         {

            Alert(EnumToString(TimeFrame(i))," Bullish Engulfing pattern",TimeToString(tim));

            MessageBox("CANDLESTICK PATTERN FOUND"," Pattern Alert");

       }

Any help is really appreciated.

Thanks.

Reason: