//+------------------------------------------------------------------+ //| Skewness_v1.mq4 | //| Copyright © 2009, Akif TOKUZ | //| akifusenet@gmail.com | //| 11.08.2009: v1=>Initial release | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2009, Akif TOKUZ" #property link "akifusenet@gmail.com" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red //Skew #property indicator_width1 1 //---- input parameters extern datetime StartDate=D'2009.08.06 00:00'; extern datetime EndDate=D'2009.08.07 00:00'; //---- buffers double Skew[]; double PVP[]; double VWAP[]; double Hist[]; datetime OpenTime = 0; // To check if we have a new bar int items; // numbers of items inside volume histogram int Bars_Back = 0; // Shows the starting bar for given date double SD; // standart deviation // Finds the bar number for the given date int FindStartIndex(datetime startDate) { for (int i=Bars-1; i>=0; i--) { if (Time[i]>=StartDate) return (i); } return( 0); } int init() { //---- indicators IndicatorBuffers(3); SetIndexStyle(0,DRAW_LINE); SetIndexLabel(0,"Skew"); SetIndexBuffer(0,Skew); SetIndexStyle(1,DRAW_NONE); SetIndexLabel(1,"PVP"); SetIndexBuffer(1,PVP); SetIndexStyle(2,DRAW_NONE); SetIndexLabel(2,"VWAP"); SetIndexBuffer(2,VWAP); string short_name="Skewness"; IndicatorShortName(short_name); return(0); } int start() { double TotalVolume=0; double TotalPV=0; int n; if (OpenTime != Open[0]) { Bars_Back=FindStartIndex(StartDate); OpenTime = Open[0]; double max = High[iHighest( NULL , 0, MODE_HIGH, Bars_Back, 0)]; double min = Low[ iLowest( NULL , 0, MODE_LOW, Bars_Back, 0)]; items = MathRound((max - min) / Point); ArrayResize(Hist, items); ArrayInitialize(Hist, 0); TotalVolume=0; TotalPV=0; for (int i = Bars_Back; i >= 1; i--) { if (Time[i]<EndDate) // Only calculate if we didnt reach the end date { double t1 = Low[i], t2 = Open[i], t3 = Close[i], t4 = High[i]; if (t2 > t3) {t3 = Open[i]; t2 = Close[i];} double totalRange = 2*(t4 - t1) - t3 + t2; if (totalRange != 0.0) { for (double Price_i = t1; Price_i <= t4; Price_i += Point) { n = MathRound((Price_i - min) / Point); if (t1 <= Price_i && Price_i < t2) { Hist[n] += MathRound(Volume[i]*2*(t2-t1)/totalRange); } if (t2 <= Price_i && Price_i <= t3) { Hist[n] += MathRound(Volume[i]*(t3-t2)/totalRange); } if (t3 < Price_i && Price_i <= t4) { Hist[n] += MathRound(Volume[i]*2*(t4-t3)/totalRange); } }//for }else { // Check if all values are equal to each other n = MathRound((t3 - min) / Point); Hist[n] += Volume[i]; }//if // use H+L+C/3 as average price TotalPV+=Volume[i]*((Low[i]+High[i]+Close[i])/3); TotalVolume+=Volume[i]; if (i==Bars_Back) PVP[i]=Close[i]; else PVP[i]=min+ArrayMaximum(Hist)*Point; if (i==Bars_Back) VWAP[i]=Close[i]; else VWAP[i]=TotalPV/TotalVolume; SD=0; for (int k = Bars_Back; k >= i; k--) { double avg=(High[k]+Close[k]+Low[k])/3; double diff=avg-VWAP[i]; SD+=(Volume[k]/TotalVolume)*(diff*diff); } SD=MathSqrt(SD); Skew[i]=(VWAP[i]-PVP[i])/SD; }//if for checking end date }//for BARS BACK }//MAIN IF BAR START return(0); } int deinit() { return(0); }
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains open prices of each bar
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar
Series array that contains tick volumes of each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Implements a curve of type DRAW_NONE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: