//+------------------------------------------------------------------+
//| Peak n Valley.mq4 |
//| Copyright © 2014, Gold_Specialist |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Gold_Specialist"
#property description "Peak-Valley"
#property version "1.00"
#property show_inputs
//---- script parameters
input int PeakValley_Period=24;
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
double PeakBuffer[],ValleyBuffer[];
double FastShift=NormalizeDouble((PeakValley_Period/3),0);
double PVDomain=PeakValley_Period*5;
int i;
int TotalBar=Bars-PVDomain;
ArrayResize(PeakBuffer,TotalBar);
ArrayResize(ValleyBuffer,TotalBar);
for(i=0; i<TotalBar; i++)
{
PeakBuffer[i]=peak_function(i,PeakValley_Period,FastShift,PVDomain);
ValleyBuffer[i]=valley_function(i,PeakValley_Period,FastShift,PVDomain);
}
Sleep(50);
}
//+------------------------------------------------------------------+
//====================================================================
// calculate peak
double peak_function(int i,int PeriodPV,int ShiftFast,int DomainPV)
{
double Peak=0;
int bsPeak=0;
for(int pw=i+ShiftFast;pw<=i+DomainPV;pw++)
if(iHigh(NULL,0,pw)>=High[iHighest(NULL,0,MODE_HIGH,ShiftFast,pw-ShiftFast)])
{
if(iHigh(NULL,0,pw)>=High[iHighest(NULL,0,MODE_HIGH,ShiftFast,pw+1)])
{
for(int Apw=pw-ShiftFast;Apw>=pw-(PeriodPV-ShiftFast);Apw--)
if(iHigh(NULL,0,pw)==High[iHighest(NULL,0,MODE_HIGH,PeriodPV,Apw)])
{
Peak=iHigh(NULL,0,pw);
bsPeak=pw;
if(ObjectFind(0,"Peak Period: "+IntegerToString(PeakValley_Period)+" Time: "+TimeToStr(iTime(NULL,0,pw),TIME_DATE|TIME_MINUTES))==-1)
{
string objPeak = "Peak Period: "+IntegerToString(PeakValley_Period)+" Time: "+TimeToStr(iTime(NULL,0,pw),TIME_DATE|TIME_MINUTES);
ObjectCreate(objPeak, OBJ_ARROW, 0, iTime(NULL,0,pw), iHigh(NULL,0,pw));
ObjectSet(objPeak, OBJPROP_COLOR, clrBlue);
ObjectSet(objPeak, OBJPROP_ARROWCODE, 117);
ObjectSet(objPeak, OBJPROP_WIDTH, 1);
ObjectSet(objPeak, OBJPROP_BACK, true);
}
break;
}
if(bsPeak>0)break;else continue;
}
}
return(Peak);
}
//====================================================================
// calculate valley
double valley_function(int i,int PeriodPV,int ShiftFast,int DomainPV)
{
double Valley=0;
int bsValley=0;
for(int vw=i+ShiftFast;vw<=i+DomainPV;vw++)
if(iLow(NULL,0,vw)<=Low[iLowest(NULL,0,MODE_LOW,ShiftFast,vw-ShiftFast)])
{
if(iLow(NULL,0,vw)<=Low[iLowest(NULL,0,MODE_LOW,ShiftFast,vw+1)])
{
for(int Avw=vw-ShiftFast;Avw>=vw-(PeriodPV-ShiftFast);Avw--)
if(iLow(NULL,0,vw)==Low[iLowest(NULL,0,MODE_LOW,PeriodPV,Avw)])
{
Valley=iLow(NULL,0,vw);
bsValley=vw;
if(ObjectFind(0,"Valley Period: "+IntegerToString(PeakValley_Period)+" Time: "+TimeToStr(iTime(NULL,0,vw),TIME_DATE|TIME_MINUTES))==-1)
{
string objValley = "Valley Period: "+IntegerToString(PeakValley_Period)+" Time: "+TimeToStr(iTime(NULL,0,vw),TIME_DATE|TIME_MINUTES);
ObjectCreate(objValley, OBJ_ARROW, 0, iTime(NULL,0,vw), iLow(NULL,0,vw));
ObjectSet(objValley, OBJPROP_COLOR, clrRed);
ObjectSet(objValley, OBJPROP_ARROWCODE, 117);
ObjectSet(objValley, OBJPROP_WIDTH, 1);
ObjectSet(objValley, OBJPROP_BACK, true);
}
break;
}
if(bsValley>0)break;else continue;
}
}
return(Valley);
}
Comments