How to set alert for 3 consecutive candles and not just one

 

Hey everyone, I'm recently getting into coding and for the most I've been things to work fine. I've gotten the email alert to work and send me an email when one Heiken Ashi candle closes above or below the other. What I want to get it to do is instead of email me when a new candle comes, I want it to look at the previous two candles. So the first candle closes, the second candle closes higher than the first and if then the third candle closes higher than the third it'll send me an alert at the close of the third candle, (vice versa for short candles). I've search through the articles here as well as google and I couldn't come up with anything (I've also tried a lot of trial and error).


If anyone can point me in the right direction I'd appreciate it, here is what I have so far;


bool Crossed (double haOpen, double haClose )
{

static string last_direction = "";
string current_direction = "";

if(haOpen<=haClose) current_direction = "LONG";
if(haOpen>haClose) current_direction = "SHORT";


I want it to send me an alert Long when there are three consecutive long candles and vice versa for short.


Thanks for any help!

 

There are lots of ways to code what you want. Here is one way.


if(Close[2]>Close[3] && Close[1]>Close[2])

{

.....your launch code goes here

}




Cheers

 
Or maybe this will help:

if (High[0]>High[1]&&High[1]<High[2]&&Low[0]>Low[1]&&Low[1]<Low[2]) BuyOp=true;
 
Thanks for the great help, it's working perfectly now, is there a way possible to set it up to read multiple pairs?
 
ReaperKK:
Thanks for the great help, it's working perfectly now, is there a way possible to set it up to read multiple pairs?

Yes. Checkout the iClose() function.

https://docs.mql4.com/series/iClose

 

Thanks form the link, from reading it would I use it in the double command ie. (double iclose) or in the if command ie if(iclose)?


Thanks for all the help so far.

 

Structure your code the same as you did in the first example I gave you. And, of course, use the proper parameters for iClose(....) as shown in the documentation.


Any time you create a variable that get price data assigned to it, the variable name must be declared as a "double"


raft

 
I tried the parameter example as shown in the documentation for iClose but I can't seem to get it working, is there some more information that I would be able to find about the iClose feature?
 
It might help if you include your code snippet so we can see what you are actually writting. It could be an error with the grammer or punctuation, etc. It could even be the type of document you chose to create (EA, Indicator, etc).
 
//+------------------------------------------------------------------+
//| Heiken Ashi.mq4 |
//| Copyright c 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
//| For Heiken Ashi we recommend next chart settings ( press F8 or |
//| select on menu 'Charts'->'Properties...'): |
//| - On 'Color' Tab select 'Black' for 'Line Graph' |
//| - On 'Common' Tab disable 'Chart on Foreground' checkbox and |
//| select 'Line Chart' radiobutton |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 White
#property indicator_color3 Red
#property indicator_color4 White
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 3
#property indicator_width4 3

extern bool EmailON = true;

//----
extern color color1 = Red;
extern color color2 = White;
extern color color3 = Red;
extern color color4 = White;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//|------------------------------------------------------------------|
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_HISTOGRAM, 0, 1, color1);
SetIndexBuffer(0, ExtMapBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM, 0, 1, color2);
SetIndexBuffer(1, ExtMapBuffer2);
SetIndexStyle(2,DRAW_HISTOGRAM, 0, 3, color3);
SetIndexBuffer(2, ExtMapBuffer3);
SetIndexStyle(3,DRAW_HISTOGRAM, 0, 3, color4);
SetIndexBuffer(3, ExtMapBuffer4);
//----
SetIndexDrawBegin(0,10);
SetIndexDrawBegin(1,10);
SetIndexDrawBegin(2,10);
SetIndexDrawBegin(3,10);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexBuffer(2,ExtMapBuffer3);
SetIndexBuffer(3,ExtMapBuffer4);
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
return(0);
}
bool Crossed (double haOpen, double haClose )
{

static string last_direction = "";
string current_direction = "";

if(Close[2]>Close[3] && Close[1]>Close[2]) current_direction = "LONG";

if(Close[2]<Close[3] && Close[1]<Close[2]) current_direction = "SHORT";

if(current_direction == "LONG" || current_direction == "SHORT")
{
if(AlertON) SendMail ( "Heiken Ashi current direction "+current_direction+" ",Symbol() );
last_direction = current_direction;
return (true);
}
else
{
return (false);

}

//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
double haOpen, haHigh, haLow, haClose;
if(Bars<=10) return(0);
ExtCountedBars=IndicatorCounted();
//---- check for possible errors
if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
if (ExtCountedBars>0) ExtCountedBars--;
int pos=Bars-ExtCountedBars-1;
while(pos>=0)
{
haOpen=(ExtMapBuffer3[pos+1]+ExtMapBuffer4[pos+1])/2;
haClose=(Open[pos]+High[pos]+Low[pos]+Close[pos])/4;
haHigh=MathMax(High[pos], MathMax(haOpen, haClose));
haLow=MathMin(Low[pos], MathMin(haOpen, haClose));
if (haOpen<haClose)
{
ExtMapBuffer1[pos]=haLow;
ExtMapBuffer2[pos]=haHigh;
}
else
{
ExtMapBuffer1[pos]=haHigh;
ExtMapBuffer2[pos]=haLow;
}
ExtMapBuffer3[pos]=haOpen;
ExtMapBuffer4[pos]=haClose;
pos--;
}


Print(Crossed (ExtMapBuffer1[0],ExtMapBuffer2[0]));
//----
return(0);
}

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




I basically looked at a few scripts and wanted to build it so it shoots me an email, any help or some more documentation will be greatly appreciated.

 
Well I finished it and got it working, all though my only issue is that when the criteria is met it sends an alert, but it keeps sending an alert with every following tick, any suggestions? I searched the forum for one bar only but couldn't find anything, can anyone steer me in the right direction. Thanks a lot.
Reason: