Indicators Used
Miscellaneous
1
Views
0
Downloads
0
Favorites
3MACross_AlertWarnSigOnlyNoShift_v1
//+------------------------------------------------------------------+
//| MA_Cross_3MACross_AlertWarnSig |
//| 2008forextsd mladen |
//| Copyright © 1999-2007, MetaQuotes Software Corp. |
//| http://www.metaquotes.ru |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
//----
#property indicator_chart_window
#property indicator_buffers 4
//----
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_color4 Gold
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
//----
extern int FasterMA =5;
extern int FasterMode =1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int MediumMA =13;
extern int MediumMode =1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern int SlowerMA =34;
extern int SlowerMode =1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma
extern bool crossesOnCurrent=true;
extern bool alertsOn =true;
extern bool alertsMessage =true;
extern bool alertsSound =false;
extern bool alertsEmail =false;
extern string MA_Shift ="all MA_Shift = 0";
extern string MA_Mode="SMA0 EMA1 SMMA2 LWMA3";
//----
double CrossUp[];
double CrossDown[];
double CrossWUp[];
double CrossWDown[];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
SetIndexBuffer(0, CrossUp); SetIndexStyle(0, DRAW_ARROW); SetIndexArrow(0, 233);
SetIndexBuffer(1, CrossDown); SetIndexStyle(1, DRAW_ARROW); SetIndexArrow(1, 234);
SetIndexBuffer(2, CrossWUp); SetIndexStyle(2, DRAW_ARROW); SetIndexArrow(2, 233);
SetIndexBuffer(3, CrossWDown); SetIndexStyle(3, DRAW_ARROW); SetIndexArrow(3, 234);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int i;
double fasterMAnow, fasterMAprevious, fasterMAafter;
double mediumMAnow, mediumMAprevious, mediumMAafter;
double slowerMAnow, slowerMAprevious, slowerMAafter;
//----
int counted_bars = IndicatorCounted();
if(counted_bars < 0) return(-1);
if(counted_bars > 0) counted_bars--;
int limit = Bars - counted_bars;
if(counted_bars==0) limit-=1+9;
//----
for(i=limit; i >=0; i--)
{
double Range=0.0;
for(int counter=i ;counter<=i+9;counter++) Range+=MathAbs(High[counter]-Low[counter]);
Range/=10;
//----
fasterMAnow =iMA(NULL, 0, FasterMA, 0,FasterMode, PRICE_CLOSE, i);
fasterMAprevious=iMA(NULL, 0, FasterMA, 0,FasterMode, PRICE_CLOSE, i+1);
mediumMAnow =iMA(NULL, 0, MediumMA, 0,MediumMode, PRICE_CLOSE, i);
mediumMAprevious=iMA(NULL, 0, MediumMA, 0,MediumMode, PRICE_CLOSE, i+1);
slowerMAnow =iMA(NULL, 0, SlowerMA, 0,SlowerMode, PRICE_CLOSE, i);
slowerMAprevious=iMA(NULL, 0, SlowerMA, 0,SlowerMode, PRICE_CLOSE, i+1);
//avoid current bar if not allowed to check crosses on current (i==0)
if (crossesOnCurrent==false && i==0) continue;
//----
int crossID=0;
double curr;
double prev;
double point;
while(true)
{
curr=fasterMAnow - mediumMAnow;
prev=fasterMAprevious - mediumMAprevious;
point=(fasterMAnow + fasterMAprevious)/2;
if (curr*prev<=0) { crossID=1; break; }
curr=fasterMAnow - slowerMAnow;
prev=fasterMAprevious - slowerMAprevious;
if (curr*prev<=0) { crossID=2; break; }
curr=mediumMAnow - slowerMAnow;
prev=mediumMAprevious - slowerMAprevious;
point=(mediumMAnow + mediumMAprevious)/2;
if (curr*prev<=0) { crossID=3; break; }
break;
}
// the interesting thing is the direction of the crossing
// which MA is the primary and which one the secondary
// if you do not know that you can not determine the "direction"
// of the cross
CrossUp[i] =EMPTY_VALUE;
CrossDown[i] =EMPTY_VALUE;
CrossWUp[i] =EMPTY_VALUE;
CrossWDown[i]=EMPTY_VALUE;
if (crossID>0)
{
if (alertsOn)
if ((i==0 && crossesOnCurrent==true) || (i==1 && crossesOnCurrent==false))
{
switch(crossID)
{
case 1:
if(curr>0) doAlert(" 3MACross: Fast MA crossed Medium MA UP");
else doAlert(" 3MACross: Fast MA crossed Medium MA DOWN");
break;
case 2:
if(curr>0) doAlert(" 3MACross: Fast MA crossed Slow MA UP");
else doAlert(" 3MACross: Fast MA crossed Slow MA DOWN");
break;
case 3:
if(curr>0) doAlert(" 3MACross: Medium MA crossed Slow MA UP");
else doAlert(" 3MACross: Medium MA crossed Slow MA DOWN");
break;
}
}
//----
if (i==0)
{
if (curr>0)
CrossWUp[i] =point - Range*0.5;
else CrossWDown[i]=point + Range*0.5;
}
else
{
if (curr>0)
CrossUp[i] =point - Range*0.5;
else CrossDown[i]=point + Range*0.5;
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void doAlert(string doWhat)
{
static string previousAlert="nothing";
static datetime previousTime;
string message;
//----
if (previousAlert!=doWhat || previousTime!=Time[0])
{
previousAlert =doWhat;
previousTime =Time[0];
// if time needed :
// message = StringConcatenate(Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," @",Bid," ", doWhat);
message= StringConcatenate(Symbol()," at ",Bid," ", doWhat);
if (alertsMessage) Alert(message);
if (alertsEmail) SendMail(StringConcatenate(Symbol()," 3MACross:"," M",Period()),message);
if (alertsSound) PlaySound("alert2.wav");
}
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---