- //+------------------------------------------------------------------+
- //| WildersDMI_v1.mq4 |
- //| Copyright ?2007, TrendLaboratory Ltd. |
- //| http://finance.groups.yahoo.com/group/TrendLaboratory |
- //| E-mail: igorad2004@list.ru |
- //+------------------------------------------------------------------+
- #property copyright "Copyright ?2007, TrendLaboratory Ltd."
- #property link "http://finance.groups.yahoo.com/group/TrendLaboratory"
- //----
- #property indicator_separate_window
- #property indicator_buffers 4
- #property indicator_color1 LightBlue
- #property indicator_width1 2
- #property indicator_color2 Blue
- #property indicator_width2 1
- #property indicator_style2 2
- #property indicator_color3 Black
- #property indicator_width3 1
- #property indicator_style3 2
- #property indicator_color4 Orange
- #property indicator_width4 2
- #property indicator_levelcolor Yellow
- //---- input parameters
- extern int MA_Length =13; // Period of additional smoothing
- extern int DMI_Length =13; // Period of DMI
- extern int ADX_Length =14; // Period of ADX
- extern int ADXR_Length =14; // Period of ADXR
- extern int UseADX =0; // Use ADX: 0-off,1-on
- extern int UseADXR =0; // Use ADXR: 0-off,1-on
- extern double Level = 20.0;
- extern string note = "turn on Alert = true; turn off = false";
- extern bool alertsOn = true;
- extern bool alertsOnCurrent = true;
- extern bool alertsOnLevelCross = true;
- extern bool alertsOnDiPlusDiMinusCross = true;
- extern bool alertsMessage = true;
- extern bool alertsSound = true;
- extern bool alertsNotify = true;
- extern bool alertsEmail = false;
- extern string soundFile = "alert2.wav";
- //---- buffers
- double ADX[];
- double PDI[];
- double MDI[];
- double ADXR[];
- double sPDI[];
- double sMDI[];
- double STR[];
- double DX[];
- double trend[];
- double trend1[];
- //+------------------------------------------------------------------+
- //| Custom indicator initialization function |
- //+------------------------------------------------------------------+
- int init()
- {
- //---- indicators
- IndicatorBuffers(10);
- SetIndexStyle(0,DRAW_LINE);
- SetIndexBuffer(0,ADX);
- SetIndexStyle(1,DRAW_LINE,0,2);
- SetIndexBuffer(1,PDI);
- SetIndexStyle(2,DRAW_LINE,0,2);
- SetIndexBuffer(2,MDI);
- SetIndexStyle(3,DRAW_LINE);
- SetIndexBuffer(3,ADXR);
- SetIndexBuffer(4,sPDI);
- SetIndexBuffer(5,sMDI);
- SetIndexBuffer(6,STR);
- SetIndexBuffer(7,DX);
- SetIndexBuffer(8,trend);
- SetIndexBuffer(9,trend1);
- SetLevelValue(0,Level);
- //---- name for DataWindow and indicator subwindow label
- string short_name="WildersDMI("+MA_Length+","+DMI_Length+","+ADX_Length+","+ADXR_Length+")";
- IndicatorShortName(short_name);
- SetIndexLabel(0,"ADX");
- SetIndexLabel(1,"+DI");
- SetIndexLabel(2,"-DI");
- SetIndexLabel(3,"ADXR");
- //----
- SetIndexDrawBegin(0,DMI_Length+MA_Length);
- SetIndexDrawBegin(1,DMI_Length+MA_Length);
- SetIndexDrawBegin(2,DMI_Length+MA_Length);
- SetIndexDrawBegin(3,DMI_Length+MA_Length);
- SetIndexShift(3,2);
- //----
- return(0);
- }
- //+------------------------------------------------------------------+
- //| Custom indicator iteration function |
- //+------------------------------------------------------------------+
- int start()
- {
- int shift, counted_bars=IndicatorCounted();
- double alfa1=1.0/DMI_Length;
- double alfa2=1.0/ADX_Length;
- //----
- if (counted_bars < 0) return(-1);
- if(counted_bars<1)
- for(shift=1;shift<=MA_Length+DMI_Length;shift++)
- {
- PDI[Bars-shift]=0.0;MDI[Bars-shift]=0.0;ADX[Bars-shift]=0.0;
- sPDI[Bars-shift]=0.0;sMDI[Bars-shift]=0.0;DX[Bars-shift]=0.0;
- STR[Bars-shift]=0.0;ADXR[Bars-shift]=0.0;
- }
- shift=Bars-MA_Length-DMI_Length-1;
- if(counted_bars>=DMI_Length+MA_Length) shift=Bars-counted_bars-1;
- while(shift>=0)
- {
- double AvgHigh =iMA(NULL,0,MA_Length,0,1,PRICE_HIGH,shift);
- double AvgHigh1=iMA(NULL,0,MA_Length,0,1,PRICE_HIGH,shift+1);
- double AvgLow =iMA(NULL,0,MA_Length,0,1,PRICE_LOW,shift);
- double AvgLow1 =iMA(NULL,0,MA_Length,0,1,PRICE_LOW,shift+1);
- double AvgClose1= iMA(NULL,0,MA_Length,0,1,PRICE_CLOSE,shift+1);
- //----
- double Bulls=0.5*(MathAbs(AvgHigh-AvgHigh1)+(AvgHigh-AvgHigh1));
- double Bears=0.5*(MathAbs(AvgLow1-AvgLow)+(AvgLow1-AvgLow));
- if (Bulls > Bears) Bears=0;
- else
- if (Bulls < Bears) Bulls=0;
- else
- if (Bulls==Bears) {Bulls=0;Bears=0;}
- //----
- sPDI[shift]=sPDI[shift+1] + alfa1 * (Bulls - sPDI[shift+1]);
- sMDI[shift]=sMDI[shift+1] + alfa1 * (Bears - sMDI[shift+1]);
- //----
- double TR=MathMax(AvgHigh-AvgLow,AvgHigh-AvgClose1);
- STR[shift] =STR[shift+1] + alfa1 * (TR - STR[shift+1]);
- if(STR[shift]>0 )
- {
- PDI[shift]=100*sPDI[shift]/STR[shift];
- MDI[shift]=100*sMDI[shift]/STR[shift];
- }
- if(UseADX > 0)
- {
- if((PDI[shift] + MDI[shift])>0)
- DX[shift]=100*MathAbs(PDI[shift] - MDI[shift])/(PDI[shift] + MDI[shift]);
- else DX[shift]=0;
- //----
- ADX[shift]=ADX[shift+1] + alfa2 *(DX[shift] - ADX[shift+1]);
- if(UseADXR >0) ADXR[shift]=0.5*(ADX[shift] + ADX[shift+ADXR_Length]);
- }
- trend[shift] = 0;
- trend1[shift] = trend1[shift+1];
- if (ADX[shift] > Level) trend[shift] = 1;
- if (ADX[shift] < Level) trend[shift] =-1;
- if (PDI[shift] > MDI[shift]) trend1[shift] = 1;
- if (PDI[shift] < MDI[shift]) trend1[shift] =-1;
- shift--;
- }
-
- //
- //
- //
- //
- //
-
- if (alertsOn)
- {
- if (alertsOnCurrent)
- int whichBar = 0;
- else whichBar = 1;
-
- //
- //
- //
- //
- //
-
- static datetime time1 = 0;
- static string mess1 = "";
- if (alertsOnLevelCross && trend[whichBar] != trend[whichBar+1])
- {
- if (trend[whichBar] == 1) doAlert(time1,mess1,whichBar," up");
- if (trend[whichBar] ==-1) doAlert(time1,mess1,whichBar," down");
- }
- static datetime time2 = 0;
- static string mess2 = "";
- if (alertsOnDiPlusDiMinusCross && trend1[whichBar] != trend1[whichBar+1])
- {
- if (trend1[whichBar] == 1) doAlert(time2,mess2,whichBar," DMI UP ");
- if (trend1[whichBar] ==-1) doAlert(time2,mess2,whichBar," DMI DOWN");
- }
- }
- return(0);
- }
- //
- //
- //
- //
- //
- void doAlert(datetime& previousTime, string& previousAlert, int forBar, string doWhat)
- {
- string message;
-
- if (previousAlert != doWhat || previousTime != Time[forBar]) {
- previousAlert = doWhat;
- previousTime = Time[forBar];
- //
- //
- //
- //
- //
- message = StringConcatenate(AccountNumber()," - ",Symbol()," at ",TimeToStr(TimeLocal(),TIME_SECONDS)," ",doWhat);
- if (alertsMessage) Alert(message);
- if (alertsEmail) SendMail(StringConcatenate(Symbol()," "),message);
- if (alertsNotify) SendNotification(message);
- if (alertsSound) PlaySound(soundFile);
- }
- }
-
复制代码
ADX_WildersDMI_v1.02 alerts.mq4
|