Code: Select all
//------------------------------------------------------------------
//------------------------------------------------------------------
#property copyright ""
#property link ""
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 LimeGreen
#property indicator_color2 PaleVioletRed
#property indicator_width1 2
#property indicator_width2 2
#property indicator_level1 0
//
//
//
//
//
extern ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT;
extern double BoxPeriod = 6.5;
extern bool alertsOn = true;
extern bool alertsOnCurrent = true;
extern bool alertsMessage = true;
extern bool alertsSound = false;
extern bool alertsNotify = true;
extern bool alertsEmail = true;
extern bool ShowLines = false;
extern string LinesIdentifier = "XOLines1";
extern color LinesColorForUp = LimeGreen;
extern color LinesColorForDown = Red;
extern ENUM_LINE_STYLE LinesStyle = STYLE_DOT;
//
//
//
//
//
double Hi[];
double Lo[];
double no[];
double kr[];
double trend[];
//
//
//
//
//
string indicatorFileName;
bool returnBars;
//------------------------------------------------------------------
//
//------------------------------------------------------------------
int init()
{
IndicatorBuffers(5);
SetIndexBuffer(0,kr); SetIndexStyle(0,DRAW_HISTOGRAM); SetIndexLabel(0,"XO Up");
SetIndexBuffer(1,no); SetIndexStyle(1,DRAW_HISTOGRAM); SetIndexLabel(1,"XO Down");
SetIndexBuffer(2,Hi);
SetIndexBuffer(3,Lo);
SetIndexBuffer(4,trend);
//
//
//
//
//
indicatorFileName = WindowExpertName();
returnBars = (TimeFrame==-99);
TimeFrame = MathMax(TimeFrame,_Period);
//
//
//
//
//
IndicatorShortName(timeFrameToString(TimeFrame)+" XO ("+DoubleToStr(BoxPeriod,2)+")");
return(0);
}
//
//
//
//
//
int deinit()
{
int lookForLength = StringLen(LinesIdentifier);
for (int i=ObjectsTotal(); i>=0; i--)
{
string name = ObjectName(i);
if (StringSubstr(name,0,lookForLength)==LinesIdentifier) ObjectDelete(name);
}
return(0);
}
//------------------------------------------------------------------
//
//------------------------------------------------------------------
int start()
{
int counted_bars=IndicatorCounted();
if(counted_bars<0) return(-1);
if(counted_bars>0) counted_bars--;
int limit=MathMin(Bars-counted_bars,Bars-1);
if (returnBars) { kr[0] = limit+1; return(0); }
//
//
//
//
//
if (TimeFrame == Period())
{
double pipMultiplier = 1; if(Digits==3 || Digits==5) pipMultiplier = 10;
for(int i=limit; i>=0; i--)
{
if (i>=(Bars-2)) { Hi[i+1]=Close[i]; Lo[i+1]=Close[i]; continue; }
double cur = Close[i];
Hi[i] = Hi[i+1];
Lo[i] = Lo[i+1];
no[i] = no[i+1];
kr[i] = kr[i+1];
trend[i] = trend[i+1];
if (cur > (Hi[i]+BoxPeriod*Point*pipMultiplier))
{
Hi[i] = cur;
Lo[i] = cur-BoxPeriod*Point*pipMultiplier;
kr[i] = kr[i+1]+1;
no[i] = 0;
trend[i] = 1;
}
if (cur < (Lo[i]-BoxPeriod*Point*pipMultiplier))
{
Lo[i] = cur;
Hi[i] = cur+BoxPeriod*Point*pipMultiplier;
no[i] = no[i+1]-1;
kr[i] = 0;
trend[i] = -1;
}
if (ShowLines)
{
deleteLine(i);
if (trend[i]!=trend[i+1])
if (trend[i]==1)
drawLine(i,LinesColorForUp);
else drawLine(i,LinesColorForDown);
}
}
manageAlerts();
return(0);
}
//
//
//
//
//
limit = MathMax(limit,MathMin(Bars-1,iCustom(NULL,TimeFrame,indicatorFileName,-99,0,0)*TimeFrame/Period()));
for (i=limit;i>=0;i--)
{
int y = iBarShift(NULL,TimeFrame,Time[i]);
kr[i] = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,BoxPeriod,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsNotify,alertsEmail,false,0,y);
no[i] = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,BoxPeriod,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsNotify,alertsEmail,false,1,y);
trend[i] = iCustom(NULL,TimeFrame,indicatorFileName,PERIOD_CURRENT,BoxPeriod,alertsOn,alertsOnCurrent,alertsMessage,alertsSound,alertsNotify,alertsEmail,false,4,y);
if (ShowLines)
{
deleteLine(i);
if (trend[i]!=trend[i+1])
if (trend[i]==1)
drawLine(i,LinesColorForUp);
else drawLine(i,LinesColorForDown);
}
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//
//
//
//
//
void manageAlerts()
{
if (alertsOn)
{
if (alertsOnCurrent)
int whichBar = 0;
else whichBar = 1;
if (trend[whichBar] != trend[whichBar+1])
{
if (trend[whichBar] == 1) doAlert(whichBar,"up");
if (trend[whichBar] ==-1) doAlert(whichBar,"down");
}
}
}
//
//
//
//
//
void doAlert(int forBar, string doWhat)
{
static string previousAlert="nothing";
static datetime previousTime;
string message;
if (previousAlert != doWhat || previousTime != Time[forBar]) {
previousAlert = doWhat;
previousTime = Time[forBar];
//
//
//
//
//
message = StringConcatenate(timeFrameToString(_Period)+" "+Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," XO trend changed to ",doWhat);
if (alertsMessage) Alert(message);
if (alertsNotify) SendNotification(StringConcatenate(Symbol(), Period() ," XO " +" "+message));
if (alertsEmail) SendMail(StringConcatenate(Symbol(),"XO "),message);
if (alertsSound) PlaySound("alert2.wav");
}
}
//+-------------------------------------------------------------------
//|
//+-------------------------------------------------------------------
//
//
//
//
//
string sTfTable[] = {"M1","M5","M15","M30","H1","H4","D1","W1","MN"};
int iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};
string timeFrameToString(int tf)
{
for (int i=ArraySize(iTfTable)-1; i>=0; i--)
if (tf==iTfTable[i]) return(sTfTable[i]);
return("");
}
//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//
void deleteLine(int i)
{
ObjectDelete(LinesIdentifier+":"+Time[i]);
}
void drawLine(int i, color theColor)
{
string name = LinesIdentifier+":"+Time[i];
if (ObjectFind(name)<0)
ObjectCreate(name,OBJ_VLINE,0,Time[i],0);
ObjectSet(name,OBJPROP_COLOR,theColor);
ObjectSet(name,OBJPROP_BACK,true);
ObjectSet(name,OBJPROP_STYLE,LinesStyle);[img][/img]
I call its timeframe variable in parameter because I want to use its timeframe function .
But in real running ,it has false signals .I run with 1DAY timeframe in 1HR chart .
In up signal ,all buy and Down signal all sell.
But sell also open in up signals.vise versa.
Why it happen.
Can someone help me.
It up and down histogram also has value in zero line.
but I call as
if( xxoup >0 && xxodn == 0 ) return(buy);
I not still understand why it produce false signal.
Please suggest me.What is problem .
I like this indicator to catch whole trend .So I need to get solution.