//+------------------------------------------------------------------+ //| Williams’ Percent Range.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- #property indicator_separate_window #property indicator_minimum -100 #property indicator_maximum 0 #property indicator_buffers 1 #property indicator_color1 DodgerBlue //---- input parameters extern int ExtWPRPeriod = 11; extern string TypeMethode_ = "0-Close, 1-High, 2-Low"; extern int TypeMethode = 0; //---- buffers double ExtWPRBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string sShortName; //---- indicator buffer mapping SetIndexBuffer(0, ExtWPRBuffer); //---- indicator line SetIndexStyle(0, DRAW_LINE, STYLE_DOT); //---- name for DataWindow and indicator subwindow label sShortName="%R(" + ExtWPRPeriod + ")"; IndicatorShortName(sShortName); SetIndexLabel(0, sShortName); //---- first values aren't drawn SetIndexDrawBegin(0, ExtWPRPeriod); //---- return(0); } //+------------------------------------------------------------------+ //| Williams’ Percent Range | //+------------------------------------------------------------------+ int start() { switch(TypeMethode) { case 0 : mClose(); break; case 1 : mHigh(); break; case 2 : mLow(); } //---- return(0); } void mClose() { int i, nLimit, nCountedBars; //---- insufficient data if(Bars <= ExtWPRPeriod) return(0); //---- bars count that does not changed after last indicator launch. nCountedBars = IndicatorCounted(); //----Williams’ Percent Range calculation i = Bars - ExtWPRPeriod - 1; if(nCountedBars > ExtWPRPeriod) i = Bars - nCountedBars - 1; while(i >= 0) { double dMaxHigh = High[Highest(NULL, 0, MODE_HIGH, ExtWPRPeriod, i)]; double dMinLow = Low[Lowest(NULL, 0, MODE_LOW, ExtWPRPeriod, i)]; if(!CompareDouble((dMaxHigh - dMinLow), 0.0)) ExtWPRBuffer[i] = -100*(dMaxHigh - Close[i]) / (dMaxHigh - dMinLow); i--; } } void mHigh() { int i, nLimit, nCountedBars; //---- insufficient data if(Bars <= ExtWPRPeriod) return(0); //---- bars count that does not changed after last indicator launch. nCountedBars = IndicatorCounted(); //----Williams’ Percent Range calculation i = Bars - ExtWPRPeriod - 1; if(nCountedBars > ExtWPRPeriod) i = Bars - nCountedBars - 1; while(i >= 0) { double dMaxHigh = High[Highest(NULL, 0, MODE_HIGH, ExtWPRPeriod, i)]; double dMinLow = Low[Lowest(NULL, 0, MODE_LOW, ExtWPRPeriod, i)]; if(!CompareDouble((dMaxHigh - dMinLow), 0.0)) ExtWPRBuffer[i] = -100*(dMaxHigh - High[i]) / (dMaxHigh - dMinLow); i--; } } void mLow() { int i, nLimit, nCountedBars; //---- insufficient data if(Bars <= ExtWPRPeriod) return(0); //---- bars count that does not changed after last indicator launch. nCountedBars = IndicatorCounted(); //----Williams’ Percent Range calculation i = Bars - ExtWPRPeriod - 1; if(nCountedBars > ExtWPRPeriod) i = Bars - nCountedBars - 1; while(i >= 0) { double dMaxHigh = High[Highest(NULL, 0, MODE_HIGH, ExtWPRPeriod, i)]; double dMinLow = Low[Lowest(NULL, 0, MODE_LOW, ExtWPRPeriod, i)]; if(!CompareDouble((dMaxHigh - dMinLow), 0.0)) ExtWPRBuffer[i] = -100*(dMaxHigh - Low[i]) / (dMaxHigh - dMinLow); i--; } } //+------------------------------------------------------------------+ //| Ôóíêöèÿ ñðàíåíèÿ äâóõ âåùåñòâåííûõ ÷èñåë. | //+------------------------------------------------------------------+ bool CompareDouble(double Number1, double Number2) { bool Compare = NormalizeDouble(Number1 - Number2, 8) == 0; return(Compare); } //+------------------------------------------------------------------+