//+------------------------------------------------------------------+ //| FxPnF.mq4 | //| Copyright © FXPNF, Programming by onestepremoved.com | //| http://www.onestepremoved.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008 FXPNF" #property link "onestepremoved.com" /*================================= Min Box Size settings http://www.forexfactory.com/showthread.php?t=67278&page=3 Ticker 1m 5m 10m 15m 30m 45m 1h 2h 4h 8h 1d AUDCAD 4 5 8 9 11 13 14 20 25 33 54 AUDJPY 4 6 10 12 14 18 23 27 31 43 95 AUDNZD 6 7 9 11 13 14 14 19 24 30 55 AUDUSD 3 4 6 7 9 12 12 17 20 29 63 CADJPY 5 7 13 15 17 18 22 30 33 47 93 CHFJPY 3 6 8 9 10 12 13 16 20 27 48 EURAUD 5 8 12 14 17 21 23 34 38 47 105 EURCAD 6 8 13 14 17 18 22 27 34 44 79 EURCHF 3 4 6 9 10 10 12 18 21 30 42 EURGBP 2 2 3 4 5 6 6 9 12 15 26 EURJPY 4 7 11 13 16 18 21 27 33 52 91 EURUSD 2 4 7 8 12 13 15 18 23 33 54 GBPCHF 6 8 14 16 20 23 24 38 48 60 103 GBPJPY 6 10 16 22 25 29 34 43 49 80 138 GBPUSD 3 6 8 9 14 14 17 23 27 41 75 NZDUSD 3 5 7 7 10 12 13 17 23 29 52 USDCAD 3 4 7 7 10 10 11 15 24 32 58 USDCHF 2 4 7 8 11 11 14 19 24 29 49 USDJPY 2 4 8 10 14 16 16 22 24 33 52 ========================================================*/ #property indicator_separate_window //#property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Blue #property indicator_color2 Blue extern int BoxSize = 225; extern int ReversalAmount = 3; extern bool PlotAsXO = True; extern color ColorUp = Lime; extern color ColorDown = OrangeRed; extern color SquareLimit = Black; extern int ShapeWidth = 1; double Box; double bMi[]; double bMa[]; double Min[1]; double Max[1]; int Typ[1]; int Window = 0; int Index=0; string NameWindow; void GetDefaultSettings() { int NumBars = Bars-2; int Cont = 0; double Rev = 0; double TotRev = 0; if (NumBars>500) NumBars = 500; for (int i=0; i=H2) Rev = H1-L0; if (L1>=L2) Rev = H0-L1; if (Rev>0) Cont++; TotRev += Rev; } if (Cont>0) { if (Period()!=PERIOD_MN1) TotRev = TotRev/Cont*0.64; else TotRev = TotRev/Cont*0.34; BoxSize = NormalizeDouble(TotRev,Digits)/Point; } else BoxSize = 20; return(0); } int init() { string ChartType = "0"; if (PlotAsXO) ChartType = "XO"; if (BoxSize<1) GetDefaultSettings(); NameWindow = StringConcatenate("DgP&F(",BoxSize,",",ReversalAmount,",",ChartType,") "); IndicatorShortName(NameWindow); SetIndexBuffer(0,bMa); SetIndexStyle(0,DRAW_ARROW,EMPTY,0,Blue); SetIndexArrow(0,160); SetIndexBuffer(1,bMi); SetIndexStyle(1,DRAW_ARROW,EMPTY,0,Blue); SetIndexArrow(1,160); IndicatorDigits(Digits); Box = BoxSize * Point; return(0); } int deinit() { ClrScr(); ClrScr(); ClrScr(); ClrScr(); ClrScr(); ClrScr(); ClrScr(); ClrScr(); ClrScr(); ClrScr(); ClrScr(); ClrScr(); return(0); } int start() { CalculatePointAndFigure(); Draw(Index); return(0); } void RedimBuffers(int Ty, double Mi, double Ma) { int Tam = Index+1; ArrayResize(Min,Tam); ArrayResize(Max,Tam); ArrayResize(Typ,Tam); Typ[Index] = Ty; Min[Index] = Mi; Max[Index] = Ma; return(0); } void CalculatePointAndFigure() { int Bar = Bars-1; // Ajusta buffers para serem calculados ArraySetAsSeries(Min,False); ArraySetAsSeries(Max,False); ArraySetAsSeries(Typ,False); CalculetaMode_2(); // ajusta para ser plotado corretamente ArraySetAsSeries(Min,True); ArraySetAsSeries(Max,True); ArraySetAsSeries(Typ,True); // ajusta tamanho da janela baseado no maximo e minimo da visualização.. for (Bar=0;Bar=0) ObjectDelete(NamA); if (ObjectFind(NamB)>=0) ObjectDelete(NamB); ObjectCreate(NamA,OBJ_RECTANGLE,Window,StartBar,StartPrice,EndBar,EndPrice); ObjectSet (NamA,OBJPROP_COLOR,Color); ObjectSet (NamA,OBJPROP_BACK ,True); ObjectCreate(NamB,OBJ_RECTANGLE,Window,StartBar,StartPrice,EndBar,EndPrice); ObjectSet (NamB,OBJPROP_COLOR,SquareLimit); ObjectSet (NamB,OBJPROP_BACK ,False); return(0); } void DgO(datetime StartBar, double StartPrice, datetime EndBar, double EndPrice) { string NamA = StringConcatenate(NameWindow,DoubleToStr(StartBar,0),"_",DoubleToStr(StartPrice,4)); string NamB = StringConcatenate(NamA,"_B"); string NamC = StringConcatenate(NamA,"_C"); NamA = StringConcatenate(NamA,"_A"); double MediamPrice = (StartPrice+EndPrice)/2; double Scale = 0.05 * 20 / BoxSize; if (ObjectFind(NamA)>=0) ObjectDelete(NamA); if (ObjectFind(NamB)>=0) ObjectDelete(NamB); if (ObjectFind(NamC)>=0) ObjectDelete(NamC); if (Digits>1) { ObjectCreate(NamA,OBJ_ELLIPSE,Window,StartBar,MediamPrice,EndBar,MediamPrice); ObjectSet (NamA,OBJPROP_SCALE,Scale); ObjectSet (NamA,OBJPROP_COLOR,ColorDown); ObjectSet (NamA,OBJPROP_WIDTH,ShapeWidth); ObjectSet (NamA,OBJPROP_BACK ,False); } else { ObjectCreate(NamC,OBJ_RECTANGLE,Window,StartBar,StartPrice,EndBar,EndPrice); ObjectSet (NamC,OBJPROP_COLOR,ColorDown); ObjectSet (NamC,OBJPROP_BACK ,False); } if (SquareLimit!=Black) { ObjectCreate(NamC,OBJ_RECTANGLE,Window,StartBar,StartPrice,EndBar,EndPrice); ObjectSet (NamC,OBJPROP_COLOR,SquareLimit); ObjectSet (NamC,OBJPROP_BACK ,True); } return(0); } void DgX(datetime StartBar, double StartPrice, datetime EndBar, double EndPrice) { string NamA = StringConcatenate(NameWindow,DoubleToStr(StartBar,0),"_",DoubleToStr(StartPrice,4)); string NamB = StringConcatenate(NamA,"_B"); string NamC = StringConcatenate(NamA,"_C"); NamA = StringConcatenate(NamA,"_A"); if (ObjectFind(NamA)>=0) ObjectDelete(NamA); if (ObjectFind(NamB)>=0) ObjectDelete(NamB); if (ObjectFind(NamC)>=0) ObjectDelete(NamC); ObjectCreate(NamA,OBJ_TREND,Window,StartBar,StartPrice,EndBar,EndPrice); ObjectSet (NamA,OBJPROP_COLOR,ColorUp); ObjectSet (NamA,OBJPROP_WIDTH,ShapeWidth); ObjectSet (NamA,OBJPROP_BACK ,False); ObjectSet (NamA,OBJPROP_RAY ,False); ObjectCreate(NamB,OBJ_TREND,Window,EndBar,StartPrice,StartBar,EndPrice); ObjectSet (NamB,OBJPROP_COLOR,ColorUp); ObjectSet (NamB,OBJPROP_WIDTH,ShapeWidth); ObjectSet (NamB,OBJPROP_BACK ,False); ObjectSet (NamB,OBJPROP_RAY ,False); if (SquareLimit!=Black) { ObjectCreate(NamC,OBJ_RECTANGLE,Window,StartBar,StartPrice,EndBar,EndPrice); ObjectSet (NamC,OBJPROP_COLOR,SquareLimit); ObjectSet (NamC,OBJPROP_BACK ,False); } return(0); } /*void DgText(datetime Bar, double Price, string Text, color Color) { string NamA = StringConcatenate(NameWindow,DoubleToStr(Bar,0),"_",DoubleToStr(Price,4)); string NamB = StringConcatenate(NamA,"_B"); NamA = StringConcatenate(NamA,"_A"); if (ObjectFind(NamA)>=0) ObjectDelete(NamA); if (ObjectFind(NamB)>=0) ObjectDelete(NamB); ObjectCreate(NamA,OBJ_TEXT,Window,Bar,Price); ObjectSet (NamA,OBJPROP_BACK ,True); ObjectSetText(NamA,Text,10,"Courier New",Color); return(0); } void CalculetaMode_1() { int Bar = Bars-1; // calcula P&F Index = 0; RedimBuffers(0,0,0); Min[0] = MathCeil(Low[Bar]/Box); Max[0] = MathCeil(High[Bar]/Box);//Min[0]; if (Open[Bar]>Close[Bar]) Typ[0] = 1; else Typ[0] = 0; Bar--; while (Bar>0) { double Lo = NormalizeDouble(Low[Bar] /Box,0); double Hi = NormalizeDouble(High[Bar]/Box,0); double Mi = Min[Index]; double Ma = Max[Index]; int Ty = Typ[Index]; if(Ty == 0) { if(Lo<=Mi) { Min[Index] = Lo; } else { if(Hi>=(Mi+ReversalAmount)) { Index++; RedimBuffers(1,Mi+1,Hi); } } } else { if(Hi>=Ma) { Max[Index] = Hi; } else { if(Lo<=(Ma-ReversalAmount)) { Index++; RedimBuffers(0,Lo,Ma-1); } } } Bar--; } return(0); } */ void CalculetaMode_2() { int Bar = Bars-1; //-------------------------------------- Index = 0; RedimBuffers(0,0,0); Min[0] = Box * MathCeil (Low[Bar] /Box) + Box; Max[0] = Box * MathFloor(High[Bar]/Box); Typ[0] = 0; //---------------------------------------- Bar--; while (Bar>0) { if(Typ[Index] == 0) { if(Low[Bar] <= Min[Index] - Box) { Min[Index] = Box * MathCeil(Low[Bar]/Box); } else { if(High[Bar] >= Min[Index] + ReversalAmount*Box) { Index++; RedimBuffers(1,Min[Index - 1] + Box,Box * MathCeil(High[Bar]/Box)); // MathFloor } } } else { if(High[Bar] >= Max[Index] + Box) { Max[Index] = Box * MathCeil(High[Bar]/Box); // MathFloor } else { if( Low[Bar] <= Max[Index] - ReversalAmount * Box ) { Index++; RedimBuffers(0,Box * MathCeil(Low[Bar]/Box),Max[Index - 1] - Box); } } } Bar--; } for (Bar=0;Bar<=Index;Bar++) { Min[Bar] = MathCeil(Min[Bar]/Box); Max[Bar] = MathCeil(Max[Bar]/Box); } return(0); }