//+------------------------------------------------------------------+ //| CME_FUTURES_VOLUME.mq4 | //| Copyright © 2012–2013, Financial Arsenal LTD | //| http://www.arsenal-forex.ru/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2012–2013, Financial Arsenal LTD" #property link "http://www.arsenal-forex.ru/" //+------------------------------------------------------------------+ #import "user32.dll" int RegisterWindowMessageA(string lpString); int SetTimer(int hWnd,int nIDEvent,int uElapse,int& lpTimerFunc[]); bool KillTimer(int hWnd,int uIDEvent); #import "kernel32.dll" int GetModuleHandleA(string lpModuleName); int GetProcAddress(int hModule,string lpProcName); #import //+------------------------------------------------------------------+ #property indicator_separate_window #property indicator_buffers 8 #property indicator_color4 Silver #property indicator_color5 Silver #property indicator_color6 DodgerBlue #property indicator_color7 Crimson #property indicator_color8 LimeGreen #property indicator_level1 0 #property indicator_levelcolor Silver //+------------------------------------------------------------------+ //| Extern Variables | //+------------------------------------------------------------------+ extern bool Show_Volumes_or_Delta = true ; extern bool SelectMarketDeptBar = false ; extern bool ShowLevels_of_Breakdown = false; //+------------------------------------------------------------------+ //| Defines & Global variavles | //+------------------------------------------------------------------+ #define empty EMPTY_VALUE #define iName "CME FUTURES VOLUME" #define lLong "Long_Breakdown_Level" #define lShort "Short_Breakdown_Level" #define hvNm "MD_SHIFT" //+------------------------------------------------------------------+ bool gDemo = false; bool gOwn = false; bool Detalied = true; //---- int TimerId=666; int gFiles = 0; int gMdShift = 0; int gVscale = 1; int gDelay = 0; int MarketDeptBarShift = 1; string txt; string Symbols[14]={"AUDUSD","CADUSD","CHFUSD","EURUSD","EURGBP","EURJPY","GBPUSD","NZDUSD","USDJPY","USDCAD","USDCHF","6EM3","6EU3","6EZ3"}; //---- string inarr[15000]; int buff[108000][4]; int stack[1000][2]; //--- buffers double volu[]; double vold[]; double long[]; double short[]; double delta[]; double ext_long[]; double ext_short[]; double ext_delta[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void init(){int i,ii; //---- indicators SetIndexStyle(0,DRAW_NONE); SetIndexStyle(1,DRAW_NONE); SetIndexStyle(2,DRAW_NONE); SetIndexStyle(3,DRAW_HISTOGRAM); SetIndexStyle(4,DRAW_HISTOGRAM); SetIndexStyle(5,DRAW_HISTOGRAM); SetIndexStyle(6,DRAW_HISTOGRAM); SetIndexStyle(7,DRAW_HISTOGRAM); //---- SetIndexBuffer(0,ext_long); SetIndexBuffer(1,ext_short); SetIndexBuffer(2,ext_delta); SetIndexBuffer(3,volu); SetIndexBuffer(4,vold); SetIndexBuffer(5,long); SetIndexBuffer(6,short); SetIndexBuffer(7,delta); //---- SetIndexEmptyValue(0,0.0); SetIndexEmptyValue(1,0.0); SetIndexEmptyValue(2,0.0); SetIndexEmptyValue(3,0.0); SetIndexEmptyValue(4,0.0); SetIndexEmptyValue(5,0.0); SetIndexEmptyValue(6,0.0); SetIndexEmptyValue(7,0.0); //---- SetIndexLabel(0,""); SetIndexLabel(1,""); SetIndexLabel(2,""); SetIndexLabel(3,"Volume / 2"); SetIndexLabel(4,"Volume / 2 "); SetIndexLabel(5,"Long Volume"); SetIndexLabel(6,"Short Volume"); SetIndexLabel(7,"Volume Delta"); //---- IndicatorDigits(0); IndicatorShortName(iName); //---- gFiles = CheckDataFiles(); if(MarketDeptBarShift<1){MarketDeptBarShift=1;} gMdShift = MarketDeptBarShift; if(SelectMarketDeptBar){gMdShift = GetMarketDeptBar(MarketDeptBarShift);}else{gMdShift=0;} SetMyTimer(100); if(!gOwn){SelectMarketDeptBar=true;} //---- return;} //+------------------------------------------------------------------+ void deinit(){ for(int i=ObjectsTotal()-1;i>=0;i--){ string nm = ObjectName(i); if(StringFind(nm,"ftlevel")>=0){ObjectDelete(nm);} if(StringFind(nm,"arrow_")>=0){ObjectDelete(nm);} } DelText(); if(UninitializeReason()!=REASON_CHARTCHANGE){ ObjectDelete(hvNm); ObjectDelete(lLong); ObjectDelete(lShort); KillMyTimer(); } return;} //+------------------------------------------------------------------+ void start(){string fsy,lsy,sy = Symbol(); if(!IsSymbol(sy)){Comment("Not yet futures for this symbol.");return;}// если нет фьючерса по этому символу выходим. //---- int width = GetChartScale(); SetIndexStyle(3,DRAW_HISTOGRAM,EMPTY,width); SetIndexStyle(4,DRAW_HISTOGRAM,EMPTY,width); SetIndexStyle(5,DRAW_HISTOGRAM,EMPTY,width); SetIndexStyle(6,DRAW_HISTOGRAM,EMPTY,width); SetIndexStyle(7,DRAW_HISTOGRAM,EMPTY,width); //---- static int pretime=0,prebars=0,lvol=0; static double prerp = 0; static bool s_l; int i, ii=0, x, y, counted = IndicatorCounted(); if (counted > 0) counted--; int limit = Bars - counted; int per = Period(); int pos = StringFind(Symbol(),"f"); gDelay = 0; //----Приводим символ к корню if(gDemo){ fsy = "df"+sy; lsy = "df"+sy+"_L"; if(pos<0){ Comment("You do not have such features in this version."); return; } }else{ fsy = "f"+sy; lsy = "f"+sy+"_L"; } if(pos>=0&&pos<2){sy = Symbol();} //---- if(!gOwn){ fsy = Symbol(); lsy = Symbol(); } //---- int maxvol[4]; int pper = PERIOD_M1; int DG = MarketInfo(sy,MODE_DIGITS); double PT = MarketInfo(sy,MODE_POINT); if(DG==3||DG==5){DG--;PT*=10;} double op_f = iOpen(lsy,per,0); double fbid = MarketInfo(fsy,MODE_BID); double op_p = iOpen(sy,per,0); double bid = NormalizeDouble(MarketInfo(sy,MODE_BID),DG); double shf = (op_p-op_f); int optm = iTime(fsy,per,0); int sm = 100 + MathRound(bid-op_p); int l_s = 2;// 0=long, 1=short, 2=long/short/2 int asz = ArrayRange(buff,0); int fvol; double shift; //-------------------Полный перерасчет всего индикатора производим при----------------------------------+ if((limit > 3 && prebars != Bars)|| // при полном пересчете, или появлении новых баов GetMarketDeptBar(MarketDeptBarShift)!=gMdShift|| // Или изменении положения маркера исследуемого бара gVscale != VertAutoScale()|| // Или изменении вертикальной шкалы (gMdShift==0 && NewM1Bar())){ // Или если бар нулевой, то с приходом новой минутки. //----локальные объявления ii = 0; prebars = Bars; gMdShift = GetMarketDeptBar(MarketDeptBarShift); gVscale = VertAutoScale(); //----Очистка массивов ArrayInitialize(stack,0); DelText(); //----Расчет индикатора с нуля int preii=-1; for(x=0;x PERIOD_M1) if(ii == gMdShift){// на выбранном баре собираем стакан из файла double fm1_oppr = iOpen(fsy,PERIOD_M1,iBarShift(fsy,PERIOD_M1,buff[i][0])); double fcp_oppr = iOpen(fsy,Period(),iBarShift(fsy,Period(),buff[i][0])); int cp_shift = 500+(NormalizeDouble(fm1_oppr-fcp_oppr,DG)/PT)+(buff[i][1]-100); stack[cp_shift][0] += buff[i][2]; stack[cp_shift][1] += buff[i][3]; } //---- if(ii==y){ if(maxvol[2] < buff[i][2]){ maxvol[0] = buff[i][1]; maxvol[2] = buff[i][2]; } if(maxvol[3] < buff[i][3]){ maxvol[1] = buff[i][1]; maxvol[3] = buff[i][3]; } }else{ //SetMaxPrices(ii,maxvol); y = ii; maxvol[0] = buff[i][1]; maxvol[1] = buff[i][1]; maxvol[2] = buff[i][2]; maxvol[3] = buff[i][3]; } //---- long[ii] += buff[i][2]; short[ii]-= buff[i][3]; delta[ii] = long[ii]+short[ii];//buff[i][2]-buff[i][3]; } } x=ii+1; for(i=1;i<=x;i++){//дыры в файле восстанавливаем за счет прямых объемов ластов if(long[i]==0&&short[i]==0){ ii = iBarShift(lsy,Period(),Time[i]-gDelay,true); if(ii<0){continue;} fvol = iVolume(lsy,Period(),ii); volu[i] = fvol/2; vold[i] = -fvol/2; } } for(i=x;i0){ //----Опредеяем пределы стакана int b_summ,s_summ,max=0,min=1000; double b_max=0,s_max=0; int bm_i=0,bm_s=0,sm_i=0,sm_s=0; for(i=0;i<1000;i++){ if((i-500)%gVscale == 0){ if(b_summ!=0||s_summ!=0){ if(min > i){min = i;} if(max < i){max = i;} } if(b_summ > bm_s){ bm_s = b_summ; bm_i = i; } if(s_summ > sm_s){ sm_s = s_summ; sm_i = i; } b_summ = stack[i][0]; s_summ = stack[i][1]; }else{ b_summ += stack[i][0]; s_summ += stack[i][1]; } } shift = 0;//iOpen(fsy,per,gMdShift)-iOpen(sy,per,gMdShift); Comment(shift); double p_min = shift + iOpen(Symbol(),Period(),gMdShift) + (min-(501+gVscale)) * PT; // нижняя цена коробки double p_max = shift + iOpen(Symbol(),Period(),gMdShift) + (max-(500-gVscale*2)) * PT; // верхняя цена коробки double cls_p = shift + iOpen(Symbol(),Period(),gMdShift) + (max-(501-gVscale)) * PT; // разделитель заголовка double bmv_p = shift + iOpen(Symbol(),Period(),gMdShift) + ((bm_i-500)-gVscale/2) * PT; // цена максимального кластера покупок double smv_p = shift + iOpen(Symbol(),Period(),gMdShift) + ((sm_i-500)-gVscale/2) * PT; // цена макс кластера продаж if(min!=1000&&max!=0){ SetMarketDept(p_min,p_max,cls_p,bmv_p,smv_p,gVscale); } //----Выборка и показ стакана for(i=0;i<1000;i++){ if((i-500)%gVscale == 0){ double prpr = shift + iOpen(Symbol(),Period(),gMdShift) + (i-500) * PT; if(min <= i && max >= i){SetLevel(prpr,s_summ,b_summ);} b_summ = stack[i][0]; s_summ = stack[i][1]; }else{ b_summ += stack[i][0]; s_summ += stack[i][1]; } } } } //-----------------------------Обработка нулевого бара----------------------------------------------------------------+ if(gOwn){ fvol = iVolume(lsy,PERIOD_M1,0);//Comment(iVolume(lsy,Period(),0)); int dvol = fvol - lvol; if(dvol<0){dvol = fvol;} int curr_sft = 500+(NormalizeDouble(iClose(fsy,Period(),0)-iOpen(fsy,Period(),0),DG)/PT); double fask = MarketInfo(fsy,MODE_ASK); double last = MarketInfo(lsy,MODE_BID); if(dvol!=0){ if(last>=fask){// приписываем к лонгам long[0]+=dvol; stack[curr_sft][0]+=dvol; }else if(last<=fbid){// приписываем к шортам short[0]-=dvol; stack[curr_sft][1]+=dvol; }else{// делим на половину лонг\шорт if(dvol%2==0){ long[0]+=(dvol/2); short[0]-=(dvol/2); stack[curr_sft][0]+=dvol/2; stack[curr_sft][1]+=dvol/2; }else{ if(s_l){ long[0]+=((dvol/2)+(dvol%2)); short[0]-=(dvol/2); stack[curr_sft][0]+=(dvol/2+dvol%2); stack[curr_sft][1]+=dvol/2; s_l = false; }else{ long[0]+=(dvol/2); short[0]-=((dvol/2)+(dvol%2)); stack[curr_sft][1]+=(dvol/2+dvol%2); stack[curr_sft][0]+=dvol/2; s_l = true; } } } delta[0] = long[0]+short[0]; } lvol = fvol; } //----Показ стакана текущего бара if(gMdShift==0){ b_summ=0;s_summ=0;max=0;min=1000; b_max=0;s_max=0; bm_i=0;bm_s=0;sm_i=0;sm_s=0; for(i=0;i<1000;i++){ if((i-500)%gVscale == 0){ if(b_summ!=0||s_summ!=0){ if(min > i){min = i;} if(max < i){max = i;} } if(b_summ > bm_s){ bm_s = b_summ; bm_i = i; } if(s_summ > sm_s){ sm_s = s_summ; sm_i = i; } b_summ = stack[i][0]; s_summ = stack[i][1]; }else{ b_summ += stack[i][0]; s_summ += stack[i][1]; } } shift = iOpen(sy,per,0)-iOpen(fsy,per,0); p_min = shift + iOpen(Symbol(),Period(),gMdShift) + (min-(501+gVscale)) * PT; // нижняя цена коробки p_max = shift + iOpen(Symbol(),Period(),gMdShift) + (max-(500-gVscale*2)) * PT; // верхняя цена коробки cls_p = shift + iOpen(Symbol(),Period(),gMdShift) + (max-(501-gVscale)) * PT; // разделитель заголовка bmv_p = shift + iOpen(Symbol(),Period(),gMdShift) + ((bm_i-500)-gVscale/2) * PT; // цена максимального кластера покупок smv_p = shift + iOpen(Symbol(),Period(),gMdShift) + ((sm_i-500)-gVscale/2) * PT; // цена макс кластера продаж if(min!=1000&&max!=0){ SetMarketDept(p_min,p_max,cls_p,bmv_p,smv_p,gVscale); } //----Выборка и показ стакана for(i=0;i<1000;i++){ if((i-500)%gVscale == 0){ prpr = shift + iOpen(Symbol(),Period(),gMdShift) + (i-500) * PT; if(min <= i && max >= i){SetLevel(prpr,s_summ,b_summ);} b_summ = stack[i][0]; s_summ = stack[i][1]; }else{ b_summ += stack[i][0]; s_summ += stack[i][1]; } } } //----Пишем значения буферов во внешние int max_vol = 10; ii=0; if(!gOwn){ii=1;} for(i=ii;i max_vol){max_vol = ext_long[i];}} } CheckLevels(max_vol,width,gVscale,limit,ext_long,ext_short); //----общие----------------- CheckMDBox(GetChartScale()); SetLevels(max_vol); WindowRedraw(); //---- return;} //+------------------------------------------------------------------+ //| Description : Ставит и коректирует значки на пробитом баре | //+------------------------------------------------------------------+ void CheckLevels(int start,int hscale,int scale,int limit, double long[], double short[]){int i,ii,sz,hsz;double pr;string nm,gp = "arrow_"; if(!ShowLevels_of_Breakdown){return;} if(ObjectFind(lLong)<0){SetLevels(start);} int max = ObjectGet(lLong ,OBJPROP_PRICE1); if(max < 0){ObjectSet(lLong,OBJPROP_PRICE1,1);} if(ObjectFind(lShort)<0){SetLevels(start);} int min = ObjectGet(lShort,OBJPROP_PRICE1); if(min > 0){ObjectSet(lShort,OBJPROP_PRICE1,-1);} switch(hscale){ case 0 : hsz = 0; break; case 1 : hsz = 0; break; case 2 : hsz = 1; break; case 3 : hsz = 2; break; case 6 : hsz = 3; break; default : hsz = 5; break; } for(i=0;i max && max > 0){ sz = long[i]/max; pr = High[i] + (20*scale+((12*sz)*scale))*Point; ObjectCreate(nm,OBJ_ARROW,0,0,0); ObjectSet(nm,OBJPROP_ARROWCODE,108); ObjectSet(nm,OBJPROP_PRICE1,pr); ObjectSet(nm,OBJPROP_TIME1,Time[i]); ObjectSet(nm,OBJPROP_WIDTH,sz*hsz); ObjectSet(nm,OBJPROP_STYLE,0); ObjectSet(nm,OBJPROP_COLOR,indicator_color6); ObjectSet(nm,OBJPROP_BACK,true); }else{ ObjectDelete(nm); } nm = gp+"svol+"+Time[i]; if(short[i] < min && min < 0){ sz = short[i]/min; pr = Low[i] + (((2*sz)*scale)-10*scale)*Point; ObjectCreate(nm,OBJ_ARROW,0,0,0); ObjectSet(nm,OBJPROP_ARROWCODE,108); ObjectSet(nm,OBJPROP_PRICE1,pr); ObjectSet(nm,OBJPROP_TIME1,Time[i]); ObjectSet(nm,OBJPROP_WIDTH,sz*hsz); ObjectSet(nm,OBJPROP_STYLE,0); ObjectSet(nm,OBJPROP_COLOR,indicator_color7); ObjectSet(nm,OBJPROP_BACK,true); }else{ ObjectDelete(nm); } } return; } //+------------------------------------------------------------------+ //| Description : Возвращает номер бара вертикальной оп. линиии | //+------------------------------------------------------------------+ int GetMarketDeptBar(int md_start){int i,tm;string nm = hvNm; if(!SelectMarketDeptBar){ObjectDelete(hvNm);return(0);} if(ObjectFind(nm)<0){ ObjectCreate(nm,OBJ_VLINE,0,0,0); ObjectSet(nm,OBJPROP_TIME1,Time[md_start]); ObjectSet(nm,OBJPROP_WIDTH,1); ObjectSet(nm,OBJPROP_STYLE,1); ObjectSet(nm,OBJPROP_COLOR,DarkViolet); ObjectSet(nm,OBJPROP_BACK,true); ObjectSetText(nm,"Select Bar for Show his Market Dept",7,"Arial",White); return(md_start); }else{ i = iBarShift(Symbol(),Period(),ObjectGet(nm,OBJPROP_TIME1)); if(!gOwn){ if(i<1){ i=1; ObjectSet(nm,OBJPROP_TIME1,Time[1]); } }else{ if(gDemo){ } } if(i<=0){ ObjectDelete(hvNm); SelectMarketDeptBar = false; return(0); } return(i); } } //+------------------------------------------------------------------+ //| Description : Устанавливает опорные линии порога показа объема | //+------------------------------------------------------------------+ void SetLevels(int start){int hwd;string nm;if(!ShowLevels_of_Breakdown){return;} hwd = WindowFind(iName); nm = lLong; if(ObjectFind(nm)!=hwd){ ObjectCreate(nm,OBJ_HLINE,hwd,0,0); ObjectSet(nm,OBJPROP_PRICE1,start/2); ObjectSet(nm,OBJPROP_COLOR,Silver); ObjectSet(nm,OBJPROP_STYLE,2); ObjectSet(nm,OBJPROP_WIDTH,1); ObjectSet(nm,OBJPROP_BACK,false); ObjectSetText(nm,nm,7,"Arial",White); } nm = lShort; if(ObjectFind(nm)!=hwd){ ObjectCreate(nm,OBJ_HLINE,hwd,0,0); ObjectSet(nm,OBJPROP_PRICE1,-start/2); ObjectSet(nm,OBJPROP_COLOR,Silver); ObjectSet(nm,OBJPROP_STYLE,2); ObjectSet(nm,OBJPROP_WIDTH,1); ObjectSet(nm,OBJPROP_BACK,false); ObjectSetText(nm,nm,7,"Arial",White); } return; } //+------------------------------------------------------------------+ //| Description : Удаляет стакан с чарта | //+------------------------------------------------------------------+ void DelText(){ for(int i=ObjectsTotal()-1;i>=0;i--){ string nm = ObjectName(i); if(StringFind(nm,"step_")>=0){ObjectDelete(nm);} if(StringFind(nm,"MARKET_DEPT")>=0){ObjectDelete(nm);} } WindowRedraw(); return; } //+------------------------------------------------------------------+ //| Function :int GetWindowHigh([0])| //| Copyright © 2010, XrustSolution. | //| mail: xrustx@gmail.com | //+------------------------------------------------------------------+ //| Description : Возвращает размер чарта по вертикали (пиксели)| //+------------------------------------------------------------------+ int window[4]; #import "user32.dll" int GetWindowDC(int h); bool GetClientRect(int hWnd,int& Pos[4]); bool GetWindowRect(int h, int& pos[4]); int PostMessageA(int hWnd,int Msg,int wParam,string lParam); int ReleaseDC(int hWnd,int hDC); #import #import "gdi32.dll" int GetPixel(int hDC, int x, int y); #import //+------------------------------------------------------------------+ int GetWindowHigh(int wnd=0){int i,x=0,y=0;int window[4]; double up,dn,pr,pPoint; int whd = WindowHandle(Symbol(),Period()); GetClientRect(whd,window); int high = window[3]-window[1]; int hDC = GetWindowDC(whd); int col = GetPixel(hDC, 4, 4);// left side for(i=5;i=wnd){ if(x==0){i-=6;} i-=y; break; }else{ x++; y=i+3; } } } ReleaseDC(whd,hDC); return(i); } //+------------------------------------------------------------------+ //| Description : Создает стакан на чарте | //+------------------------------------------------------------------+ void SetMarketDept(double min,double max,double cls,double bvp,double svp,int clst){string nm = "_MARKET_DEPT";int sft = Period()*GetChartScale(); ObjectCreate(nm,OBJ_RECTANGLE,0,0,0,0,0); ObjectSet(nm,OBJPROP_PRICE1,min); ObjectSet(nm,OBJPROP_PRICE2,max); ObjectSet(nm,OBJPROP_TIME1,Time[0]+sft*12); ObjectSet(nm,OBJPROP_TIME2,Time[0]+sft*16); ObjectSet(nm,OBJPROP_COLOR,DarkSlateGray); ObjectSet(nm,OBJPROP_BACK,true); ObjectSet(nm,OBJPROP_STYLE,0); ObjectSet(nm,OBJPROP_WIDTH,1); nm = "MARKET_DEPT"; ObjectCreate(nm,OBJ_RECTANGLE,0,0,0,0,0); ObjectSet(nm,OBJPROP_PRICE1,min); ObjectSet(nm,OBJPROP_PRICE2,max); ObjectSet(nm,OBJPROP_TIME1,Time[0]+sft*12); ObjectSet(nm,OBJPROP_TIME2,Time[0]+sft*16); ObjectSet(nm,OBJPROP_COLOR,SlateGray); ObjectSet(nm,OBJPROP_BACK,false); ObjectSet(nm,OBJPROP_STYLE,0); ObjectSet(nm,OBJPROP_WIDTH,1); nm = "sMARKET_DEPT"; ObjectCreate(nm,OBJ_RECTANGLE,0,0,0,0,0); ObjectSet(nm,OBJPROP_PRICE1,cls); ObjectSet(nm,OBJPROP_PRICE2,max); ObjectSet(nm,OBJPROP_TIME1,Time[0]+sft*12); ObjectSet(nm,OBJPROP_TIME2,Time[0]+sft*16); ObjectSet(nm,OBJPROP_COLOR,SlateGray); ObjectSet(nm,OBJPROP_BACK,false); ObjectSet(nm,OBJPROP_STYLE,0); ObjectSet(nm,OBJPROP_WIDTH,1); nm = "xMARKET_DEPT"; ObjectCreate(nm,OBJ_TEXT,0,0,0,0,0); if(Show_Volumes_or_Delta){ ObjectSetText(nm,"Volumes. Cluster sz = "+DoubleToStr(clst,0)+" pt.",8,"Arial narrow",White); }else{ ObjectSetText(nm,"Delta. Cluster sz = "+DoubleToStr(clst,0)+" pt.",8,"Arial",White); } ObjectSet(nm,OBJPROP_PRICE1,max); ObjectSet(nm,OBJPROP_TIME1,Time[0]+sft*14); ObjectSet(nm,OBJPROP_COLOR,White); int v_time = ObjectGet(hvNm,OBJPROP_TIME1); if(v_time == 0){v_time = Time[0];} nm = "step_long_vol"; ObjectCreate(nm,OBJ_ARROW,0,0,0); ObjectSet(nm,OBJPROP_ARROWCODE,6); ObjectSet(nm,OBJPROP_TIME1,v_time); ObjectSet(nm,OBJPROP_PRICE1,bvp); ObjectSet(nm,OBJPROP_WIDTH,1); ObjectSet(nm,OBJPROP_COLOR,indicator_color6); ObjectSet(nm,OBJPROP_STYLE,0); ObjectSet(nm,OBJPROP_BACK,false); ObjectSetText(nm,"Longs cluster max Volume",8,"Tahoma",White); nm = "step_short_vol"; ObjectCreate(nm,OBJ_ARROW,0,0,0); ObjectSet(nm,OBJPROP_ARROWCODE,5); ObjectSet(nm,OBJPROP_TIME1,v_time); ObjectSet(nm,OBJPROP_PRICE1,svp); ObjectSet(nm,OBJPROP_WIDTH,1); ObjectSet(nm,OBJPROP_COLOR,indicator_color7); ObjectSet(nm,OBJPROP_STYLE,0); ObjectSet(nm,OBJPROP_BACK,false); ObjectSetText(nm,"Shorts cluster max Volume",8,"Tahoma",White); return; } //+------------------------------------------------------------------+ //| Description : Возвращает размер чарта по вертикали (масштаб)| //+------------------------------------------------------------------+ int VertAutoScale(){ int pipforwin = (WindowPriceMax()-WindowPriceMin())/Point; int vertscale = pipforwin/GetWindowHigh(); vertscale++; return(vertscale); } //+------------------------------------------------------------------+ //| Description : Кооректирует положение и размер стакана | //+------------------------------------------------------------------+ void CheckMDBox(int scale){int i,ii,h_sft,l_sft,r_sft;string nm,pre = "step_"; //---Определяем множители для разного масштаба графика switch(scale){ case 0: h_sft = 30; break; case 1: h_sft = 16; break; case 2: h_sft = 8; break; case 3: h_sft = 4; break; case 6: h_sft = 2; break; default: h_sft = 1; break; } //---Определяем множители для разной ширины графика int tm_lbox, tm_rbox, tm_left, tm_center, tm_rigth, mno = Period()*60; r_sft = (WindowBarsPerChart()-WindowFirstVisibleBar()); if(r_sft<=h_sft*4){ ii = WindowFirstVisibleBar()-h_sft*4; r_sft = 0; tm_rbox = Time[ii]; tm_lbox = Time[ii+h_sft*4]; tm_rigth = Time[ii+h_sft]; tm_center = Time[ii+h_sft*2]; tm_left = Time[ii+h_sft*3]; }else{ ii = 0; r_sft*=mno; tm_rbox = r_sft + Time[ii]; tm_lbox = r_sft + Time[ii]-(h_sft*4*mno); tm_rigth = r_sft + Time[ii]-(h_sft*mno); tm_center = r_sft + Time[ii]-(h_sft*2*mno); tm_left = r_sft + Time[ii]-(h_sft*3*mno); } //---Корректируем положение стакана for(i=ObjectsTotal()-1;i>=0;i--){ nm = ObjectName(i); if(StringFind(nm,pre+"prc_")>=0){ ObjectSet(nm,OBJPROP_TIME1,tm_center);//цены (середина) continue; } if(StringFind(nm,pre+"srt_")>=0){ ObjectSet(nm,OBJPROP_TIME1,tm_left);// левые цифры //if(StringFind(nm,"delta")>=0){ObjectSet(nm,OBJPROP_TIME1,tm_lbox);} continue; } if(StringFind(nm,pre+"lng_")>=0){ ObjectSet(nm,OBJPROP_TIME1,tm_rigth);// правые цифры //if(StringFind(nm,"delta")>=0){ObjectSet(nm,OBJPROP_TIME1,tm_rbox);} continue; } if(StringFind(nm,"MARKET_DEPT")>=0){ ObjectSet(nm,OBJPROP_TIME1,tm_rbox);// правый край бокса ObjectSet(nm,OBJPROP_TIME2,tm_lbox);// левый край бокса } if(StringFind(nm,"xMARKET_DEPT")>=0){ ObjectSet(nm,OBJPROP_TIME1,tm_center); continue; } } return; } //+------------------------------------------------------------------+ //| Description : Заполняет стакан T&S данными | //+------------------------------------------------------------------+ void SetLevel(double pr,int vl,int vs){string nm,gp = "step_";int clr;double pt = Point*5;int sft = Period()*GetChartScale(); int clr_s = Gray,clr_l = Gray,clr_p = Gray; if(pr - Bid> pt){ clr = Coral; if(vl==0){clr=Gray;} }else if(Bid - pr > pt){ clr = DodgerBlue; if(vl==0){clr=Gray;} }else{ clr = GreenYellow; } if(vl!=0){clr_l = Coral;} if(vs!=0){clr_s = DodgerBlue;} if(vl!=0||vs!=0){ clr_p = White; if(vl>vs){clr_p = Coral;} if(vlvs){clr_p = Coral;} if(vl0){if(ovl!=vl){ObjectSet(nm,OBJPROP_COLOR,LightPink);}} nm = gp+"lng_"+DoubleToStr(pr,Digits-1); ovl = StrToInteger(ObjectDescription(nm)); ObjectCreate(nm,OBJ_TEXT,0,0,0,0,0); ObjectSetText(nm,DoubleToStr(vs,0),7,"Arial",clr_s); ObjectSet(nm,OBJPROP_PRICE1,pr); ObjectSet(nm,OBJPROP_TIME1,Time[0]+sft*16); ObjectSet(nm,OBJPROP_COLOR,clr_s); if(ovl>0){if(ovl!=vs){ObjectSet(nm,OBJPROP_COLOR,LightSkyBlue);}} }else{ if(vl-vs>0){// Short Side nm = gp+"srt_"+DoubleToStr(pr,Digits-1); ovl = StrToInteger(ObjectDescription(nm)); ObjectCreate(nm,OBJ_TEXT,0,0,0,0,0); ObjectSetText(nm,DoubleToStr(vl-vs,0),7,"Arial",White); ObjectSet(nm,OBJPROP_PRICE1,pr); ObjectSet(nm,OBJPROP_TIME1,Time[0]+sft*12); ObjectSet(nm,OBJPROP_COLOR,clr_l); if(ovl>0){ if(ovl<(vl-vs)){ ObjectSetText(nm,DoubleToStr(vl-vs,0),7,"Arial",Pink); }else if(ovl>(vl-vs)){ ObjectSetText(nm,DoubleToStr(vl-vs,0),6,"Arial",Red); } } nm = gp+"lng_"+DoubleToStr(pr,Digits-1); ObjectDelete(nm); } if(vs-vl>0){// Long side nm = gp+"lng_"+DoubleToStr(pr,Digits-1); ovl = StrToInteger(ObjectDescription(nm)); ObjectCreate(nm,OBJ_TEXT,0,0,0,0,0); ObjectSetText(nm,DoubleToStr(vs-vl,0),7,"Arial",Yellow); ObjectSet(nm,OBJPROP_PRICE1,pr); ObjectSet(nm,OBJPROP_TIME1,Time[0]+sft*16); ObjectSet(nm,OBJPROP_COLOR,clr_s); if(ovl>0){ if(ovl<(vs-vl)){ ObjectSetText(nm,DoubleToStr(vs-vl,0),7,"Arial",LightSkyBlue); }else if(ovl>(vs-vl)){ ObjectSetText(nm,DoubleToStr(vs-vl,0),6,"Arial",Blue); } } nm = gp+"srt_"+DoubleToStr(pr,Digits-1); ObjectDelete(nm); } } return; } //+------------------------------------------------------------------+ //|Description:Определяет наличие инструментов фьючерсов в терминале | //+------------------------------------------------------------------+ int CheckDataFiles(){int i,ii,sz,hd,tm,bars;string sy,prom,dtm,fn,sys[1000];bool real,demo,have,gvcr; sz = SymbolsList(sys,false); real = false; demo = false; have = false; gvcr = false; gDemo= true; sy = Symbol(); hd = WindowHandle(Symbol(),Period()); //---- if(StringFind(sy,"df")==0){sy = StringSubstr(sy,1);}// приводим задержанный символ к реальному if(StringFind(sy,"f") < 0){sy = "f"+sy;}// если символ не фьючерс, то приводим к реальному //----Проверяем список инструментов (обзор рынка) на наличие фьючерсов for(i=0;i=0){ Print("Please check futures symbols in \"Market watch\", Not have any futures sumbols, system halted."); gOwn = true; return(0); } for(i=0;i=0){have = true; break;} } if(!have){return(0);} if(StringFind(AccountCompany(),"Financial Arsenal")<0){ gOwn = false; Print("To view the futures volumes in real time please open a trading account Financial Arsenal Ltd."); Print("Now you avaible only rights to view the historical data from the downloaded files that you download."); } } if(real||have){demo=false;gDemo=false;} //----Проверяем глобалку на предмет предварительной записи fn = "PreSymbol"+hd; for(i=GlobalVariablesTotal()-1;i>=0;i--){ prom = GlobalVariableName(i); tm = GlobalVariableGet(prom); if(StringFind(prom,fn)>=0){ //----Приводим символ к корню sy = Symbol(); ii = StringFind(sy,"f"); if(ii>=0){sy = StringSubstr(sy,ii+1);} ii = StringFind(sy,"_L"); if(ii> 0){sy = StringSubstr(sy,0,ii);} if(StringFind(prom,sy)>=0){// если символ тот же prom = StringSubstr(prom,StringLen(fn));// обрезаем имя prom = StringSubstr(prom,StringLen(sy));// обрезаем имя ii = StrToInteger(prom);// количество файлов if(ii!=0){// если все порядок с количеством файлов if(tm == iTime(Symbol(),PERIOD_W1,0)){// если не сменилась неделя return(ii); } } } } } // во всех остальных случаях GlobalVariableDel(prom);// удаляем старую глобалку gvcr = true;// даем указание создать новую //---- for(i=0;i<100;i++){// подтягиваем историю RefreshRates(); iBars(Symbol(),Period()); if(iBars(Symbol(),PERIOD_W1)>0){break;} } //----Приводим символ к корню sy = Symbol(); ii = StringFind(sy,"f"); if(ii>=0){sy = StringSubstr(sy,ii+1);} ii = StringFind(sy,"_L"); if(ii> 0){sy = StringSubstr(sy,0,ii);} //---- ii=0; if(!demo){// если реал for(i=0;i=0){sy = StringSubstr(sy,ii+1);} ii = StringFind(sy,"_L"); if(ii> 0){sy = StringSubstr(sy,0,ii);} //---- bool have = false; for(i=0;i=0){ have = true; sy = Symbols[i]; break; } } if(!have){return(0);} //---- fn = dtm+"_f"+sy+".vol"; if(gDemo){fn = dtm+"_df"+sy+".vol";} hd = FileOpen(fn,FILE_BIN|FILE_READ); if(hd<1){Print("Data file is not found.");return(0);} sz = FileSize(hd); ArrayResize(buff,sz); ii = FileReadArray(hd,buff,0,sz); FileClose(hd); ArrayResize(buff,ii/4); return(ii/4); } //+------------------------------------------------------------------+ //| Description : Возвращает набор сиволов из окна "обзор рынка"| //| Copyright © 2009, Ilnur | //+------------------------------------------------------------------+ int SymbolsList(string &Symbols[], bool Selected) { string SymbolsFileName; int Offset, SymbolsNumber; if(Selected) SymbolsFileName = "symbols.sel"; else SymbolsFileName = "symbols.raw"; int hFile = FileOpenHistory(SymbolsFileName, FILE_BIN|FILE_READ); if(hFile < 0) return(-1); if(Selected) { SymbolsNumber = (FileSize(hFile) - 4) / 128; Offset = 116; } else { SymbolsNumber = FileSize(hFile) / 1936; Offset = 1924; } ArrayResize(Symbols, SymbolsNumber); if(Selected) FileSeek(hFile, 4, SEEK_SET); for(int i = 0; i < SymbolsNumber; i++){ Symbols[i] = FileReadString(hFile, 12); FileSeek(hFile, Offset, SEEK_CUR); } FileClose(hFile); return(SymbolsNumber); } //+------------------------------------------------------------------+ //| Description : Ищет алиасы символов фьючерсов | //+------------------------------------------------------------------+ bool IsSymbol(string &sy){int i; for(i=0;i=0){sy=Symbols[i];return(true);}} return(false); } //+------------------------------------------------------------------+ //| Description : Создает системный таймер | //| Copyright © 2013, Nav.Alexey | //| alemail@yandex.ru | //+------------------------------------------------------------------+ int SetMyTimer(int Interval){int TimerId =WindowHandle(Symbol(),Period()); int hWnd= WindowHandle(Symbol(),Period()); int MT4InternMsg= RegisterWindowMessageA("MetaTrader4_Internal_Message"); int PostMsgAddr= GetProcAddress(GetModuleHandleA("user32.dll"),"PostMessageA"); if (PostMsgAddr==0 || hWnd==0) return(0); // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010; int value[]={ 0x55, 0x8B,0xEC, 0x6A,01, 0x6A,02, 0x68,0000, 0x68,0000, 0xB8,0000, 0xFF,0xD0, 0x5D, 0xC2,0x10 }; int len[]= { 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 4, 1, 4, 1, 1, 1, 1, 2 }; value[8]=MT4InternMsg; value[10]=hWnd; value[12]=PostMsgAddr; static int TimerCode[7]; ArrayInitialize(TimerCode,0); int byte=0; for (int i=0; i>(8*j)&0xFF<<(byte%4*8); return ( SetTimer(hWnd, TimerId, Interval, TimerCode) ); } //+------------------------------------------------------------------+ //| Description : Удаляет системный таймер | //| Copyright © 2013, Nav.Alexey | //| alemail@yandex.ru | //+------------------------------------------------------------------+ bool KillMyTimer(){return( KillTimer(WindowHandle(Symbol(),Period()), WindowHandle(Symbol(),Period())) );} //+------------------------------------------------------------------+ //| Description : Флаг нового бара минутного ТФ| //+------------------------------------------------------------------+ bool NewM1Bar(){static int pretm; if(iTime(Symbol(),PERIOD_M1,0)!=pretm){ pretm = iTime(Symbol(),PERIOD_M1,0);//Print("dfkgj"); return(true); } /*if(Time[0]!=pretm){ pretm = Time[0]; Print("sdfgjksdflgj"); return(true); }*/ return(false); } //+------------------------------------------------------------------+ //| Description: Возвращает ширину свечи по масштабу чарта | //+------------------------------------------------------------------+ #import "user32.dll" bool GetWindowRect(int h, int& pos[4]); #import //+------------------------------------------------------------------+ int GetChartScale(){ int h = WindowHandle(Symbol(), Period()); int rect[4]; if(h==0) return(1); GetWindowRect(h, rect); int wW = rect[2] - rect[0]; // ширина окна int bpc = WindowBarsPerChart(); if(bpc==0) return(1); int scale = MathFloor((wW-48)/bpc); switch(scale){ case 1 : return(0); case 2 : return(1); case 4 : return(2); case 8 : return(3); case 16 : return(6); case 32 : return(12); default : return(12); } return(1); } //+------------------------------------------------------------------+