//+------------------------------------------------------------------+ //| Volum_Up_Dw_05.mq4 | //+------------------------------------------------------------------+ #property copyright "Inkov Evgeni ew123@mail.ru" #property link "+7-918-600-11-33" //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Black #property indicator_width1 1 //..................................... extern int Min_bar_VL=10; //..................................... double ExtBuffer0[]; double ExtBuffer1[]; //..................................... datetime time_max_Bars_1; string VL="VL"; datetime pred_time_VL,Time_VL; //+------------------------------------------------------------------+ int init() { IndicatorBuffers(2); SetIndexBuffer(0,ExtBuffer0); SetIndexBuffer(1,ExtBuffer1); SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_NONE); IndicatorDigits(0); SetIndexEmptyValue(0,EMPTY_VALUE); SetIndexEmptyValue(1,0); ArrayInitialize(ExtBuffer0,EMPTY_VALUE); ArrayInitialize(ExtBuffer1,0); IndicatorShortName("Volum_Up_Dw"); ust_VL(); return(0); } //+------------------------------------------------------------------+ int deinit() { if (UninitializeReason()==REASON_REMOVE)ObjectDelete(VL); return(0); } //+------------------------------------------------------------------+ int start() { ust_VL(); pred_time_VL=Time_VL; if (pred_time_VL==0 || pred_time_VL!=Time_VL) { ArrayInitialize(ExtBuffer0,EMPTY_VALUE); ArrayInitialize(ExtBuffer1,0); } int bar_VL=MathMin(iBarShift(Symbol(),0,Time_VL),Bars-1); //------------------------------ int vol_dw,vol_up,i; time_max_Bars_1=iTime(Symbol(),1,iBars(Symbol(),1)-1); //------------------------------ for(i=0; i<=bar_VL; i++) { vol_dw=Opred_Vol_dw_M1(i); if (vol_dw<0)vol_dw=Opred_Vol_dw(i); vol_up=Volume[i]-vol_dw; ExtBuffer1[i]=vol_dw; } //------------------------------ for(i=bar_VL; i>=0; i--) { if (i==bar_VL) ExtBuffer0[i]=Volume[i]-2*ExtBuffer1[i]; else ExtBuffer0[i]=ExtBuffer0[i+1]+Volume[i]-2*ExtBuffer1[i]; } //------------------------------ return(0); } //+------------------------------------------------------------------+ void ust_VL() { if (Min_bar_VL==0) { if (ObjectFind(VL)<0)ObjectCreate(VL,OBJ_VLINE, 0, Time[10], 0); Time_VL=ObjectGet(VL, OBJPROP_TIME1); } else { Time_VL=Time[Min_bar_VL]; ObjectDelete(VL); } } //+------------------------------------------------------------------+ int Opred_Vol_dw_M1(int n) { datetime time1_bar, time2_bar; int bar1, bar2; double v,v1,co,hl; time1_bar=Time[n]; if (time1_bar0) time2_bar=Time[n-1]; else time2_bar=TimeCurrent(); // поиск первого бара (более раннего) bar1 = iBarShift(Symbol(),1,time1_bar); datetime time1=iTime(Symbol(),1,bar1); if (time1>time2_bar || time1>time1_bar+Period()*60)return(-1); bar1 = -1; while (bar1<0) { if (time1_bar>time2_bar)return(-1); bar1 = iBarShift(Symbol(),1,time1_bar,true); time1_bar+=60; } if (n>0) { time2_bar=Time[n-1]; bar2 = iBarShift(Symbol(),1,time2_bar); datetime time2=iTime(Symbol(),1,bar2); if (time2time2_bar+Period()*60)return(-1); bar2=-1; // поиск второго бара while (bar2<0) { time2_bar-=60; if (time2_bar=bar2) || (n==0 && i==0);i--) { sled=iTime(Symbol(), 0, i+1); if (sled==0) { h=iHigh(Symbol(),1,i); l=iLow (Symbol(),1,i); o=iOpen(Symbol(),1,i); } else { h=MathMax(iHigh(Symbol(),1,i),iClose(Symbol(),1,i+1)); l=MathMin(iLow (Symbol(),1,i),iClose(Symbol(),1,i+1)); o=iClose(Symbol(),1,i+1); } hl = h - l; if (hl==0)continue; co = iClose(Symbol(),1,i) - o; if (co>0) v1=iVolume(Symbol(),1,i)*(hl-co)/(2*hl-co); else if (co<0) v1=iVolume(Symbol(),1,i)*hl/(2*hl+co); else v1=iVolume(Symbol(),1,i)/2.0; v1=MathRound(v1); v += v1; } return(v); } //---------------------------------------- int Opred_Vol_dw(int n) { double v,h,l,o; datetime sled=iTime(Symbol(), 0, n+1); if (sled==0) { h=High [n]; l=Low [n]; o=Open[n]; } else { h=MathMax(High[n],Close[n+1]); l=MathMin(Low [n],Close[n+1]); o=Close[n+1]; } double hl = h - l; if (hl==0)return(0); double co = Close[n] - o; if (co>0) v=Volume[n]*(hl-co)/(2*hl-co); else if (co<0) v=Volume[n]*hl/(2*hl+co); else v=Volume[n]/2.0; v=MathRound(v); return(v); } //----------------------------------------