//+------------------------------------------------------------------+ //| DealsLent.mq5 | //| Copyright 2016-2018, prostotrader | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016-2018, prostotrader" #property link "https://www.mql5.com" #property version "1.04" #define on_call -111 //Отрицательное число для вызова функции OnCalculate // (данные не могут быть в отрицательном диаппозоне) //--- #property indicator_separate_window #property indicator_buffers 4 #property indicator_plots 4 //--- plot Label1 #property indicator_label1 "Sell" #property indicator_type1 DRAW_HISTOGRAM #property indicator_color1 clrLightPink #property indicator_style1 STYLE_SOLID #property indicator_width1 5 //--- plot Label2 #property indicator_label2 "Sell_vol" #property indicator_type2 DRAW_HISTOGRAM #property indicator_color2 clrRed #property indicator_style2 STYLE_SOLID #property indicator_width2 5 //--- plot Label3 #property indicator_label3 "Buy" #property indicator_type3 DRAW_HISTOGRAM #property indicator_color3 clrLightSkyBlue #property indicator_style3 STYLE_SOLID #property indicator_width3 5 //--- plot Label4 #property indicator_label4 "Buy_vol" #property indicator_type4 DRAW_HISTOGRAM #property indicator_color4 clrBlue #property indicator_style4 STYLE_SOLID #property indicator_width4 5 //--- indicator buffers double SellBuffer[]; double BuyBuffer[]; double SellVol[]; double BuyVol[]; ulong sell_all; ulong buy_all; ulong sell_all_vol; ulong buy_all_vol; ulong start_time; ulong last_tick_time; int event_cnt; int mem_bars; bool is_book; MqlTick ticks[]; // //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { sell_all = 0; buy_all = 0; sell_all_vol = 0; buy_all_vol = 0; event_cnt=0; is_book = MarketBookAdd(Symbol()); //--- Set buffers IndicatorSetInteger(INDICATOR_DIGITS,0); IndicatorSetString(INDICATOR_SHORTNAME,"DealsLent"); //---Set buffers SetIndexBuffer(0,SellBuffer,INDICATOR_DATA); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); ArraySetAsSeries(SellBuffer,true); SetIndexBuffer(1,SellVol,INDICATOR_DATA); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); ArraySetAsSeries(SellVol,true); SetIndexBuffer(2,BuyBuffer,INDICATOR_DATA); PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE); ArraySetAsSeries(BuyBuffer,true); SetIndexBuffer(3,BuyVol,INDICATOR_DATA); PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE); ArraySetAsSeries(BuyVol,true); //---Set objects int window=ChartWindowFind(ChartID(),"DealsLent"); ObjectCreate(ChartID(),"Dl_label_1",OBJ_LABEL,window,0,0); ObjectCreate(ChartID(),"Dl_label_2",OBJ_LABEL,window,0,0); ObjectCreate(ChartID(),"Dl_label_3",OBJ_LABEL,window,0,0); ObjectCreate(ChartID(),"Dl_label_4",OBJ_LABEL,window,0,0); ObjectSetInteger(ChartID(),"Dl_label_1",OBJPROP_YDISTANCE,30); ObjectSetInteger(ChartID(),"Dl_label_1",OBJPROP_XDISTANCE,0); ObjectSetInteger(ChartID(),"Dl_label_2",OBJPROP_YDISTANCE,60); ObjectSetInteger(ChartID(),"Dl_label_2",OBJPROP_XDISTANCE,0); ObjectSetInteger(ChartID(),"Dl_label_3",OBJPROP_YDISTANCE,15); ObjectSetInteger(ChartID(),"Dl_label_3",OBJPROP_XDISTANCE,0); ObjectSetInteger(ChartID(),"Dl_label_4",OBJPROP_YDISTANCE,45); ObjectSetInteger(ChartID(),"Dl_label_4",OBJPROP_XDISTANCE,0); ObjectSetInteger(ChartID(),"Dl_label_1",OBJPROP_COLOR,clrLightPink); ObjectSetInteger(ChartID(),"Dl_label_2",OBJPROP_COLOR,clrLightSkyBlue); ObjectSetInteger(ChartID(),"Dl_label_3",OBJPROP_COLOR,clrLightPink); ObjectSetInteger(ChartID(),"Dl_label_4",OBJPROP_COLOR,clrLightSkyBlue); ObjectSetString(ChartID(),"Dl_label_1",OBJPROP_TEXT,"Сум. объём Sell: 0"); ObjectSetString(ChartID(),"Dl_label_2",OBJPROP_TEXT,"Сум. объём Buy: 0"); ObjectSetString(ChartID(),"Dl_label_3",OBJPROP_TEXT,"Сум. кол-во Sell: 0"); ObjectSetString(ChartID(),"Dl_label_4",OBJPROP_TEXT,"Сум. кол-во Buy: 0"); //--- PlotIndexSetInteger(0,PLOT_SHOW_DATA,false); PlotIndexSetInteger(1,PLOT_SHOW_DATA,false); PlotIndexSetInteger(2,PLOT_SHOW_DATA,false); PlotIndexSetInteger(3,PLOT_SHOW_DATA,false); ChartRedraw(ChartID()); if(CopyTicks(Symbol(), ticks, COPY_TICKS_TRADE, 0, 1) == 1) { last_tick_time = ticks[0].time_msc; start_time = GetMicrosecondCount(); mem_bars = Bars(Symbol(), PERIOD_CURRENT); } else return(INIT_FAILED); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(is_book == true) MarketBookRelease(Symbol()); ObjectDelete(ChartID(),"Dl_label_1"); ObjectDelete(ChartID(),"Dl_label_2"); ObjectDelete(ChartID(),"Dl_label_3"); ObjectDelete(ChartID(),"Dl_label_4"); if(reason==REASON_INITFAILED) { int window=ChartWindowFind(); ChartIndicatorDelete(ChartID(),window,"DealsLent"); } } //+------------------------------------------------------------------+ //| Custom indicator On book event function | //+------------------------------------------------------------------+ void OnBookEvent(const string &symbol) { if(symbol==Symbol()) { double price[]; OnCalculate(event_cnt,event_cnt,on_call,price); //Вызов функции для обработки данных } } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ void GetData(double& s_data, double& b_data, double& s_vol, double& b_vol) { s_data = 0; b_data = 0; s_vol = 0; b_vol = 0; ulong delta_time = ulong(MathAbs(double(GetMicrosecondCount() - start_time))); int result = CopyTicksRange(Symbol(), ticks, COPY_TICKS_TRADE, last_tick_time, last_tick_time + delta_time); if(result > 0) { for(int i = 0; i < result; i++) { if((ticks[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL) { s_data++; s_vol += double(ticks[i].volume); } else if((ticks[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) { b_data++; b_vol += double(ticks[i].volume); } } last_tick_time = ticks[0].time_msc + 1; start_time = GetMicrosecondCount(); } } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { if(prev_calculated==0) { ArrayInitialize(SellBuffer,EMPTY_VALUE); ArrayInitialize(BuyBuffer,EMPTY_VALUE); ArrayInitialize(SellVol,EMPTY_VALUE); ArrayInitialize(BuyVol,EMPTY_VALUE); } else { int cur_bars = Bars(Symbol(), PERIOD_CURRENT); if(cur_bars < 10) return(prev_calculated); if((begin != on_call) && (mem_bars != cur_bars)) { mem_bars = cur_bars; sell_all = 0; buy_all = 0; sell_all_vol = 0; buy_all_vol = 0; SellBuffer[1] = EMPTY_VALUE; SellVol[2] = EMPTY_VALUE; BuyBuffer[3] = EMPTY_VALUE; BuyVol[4] = EMPTY_VALUE; } double sell_data, buy_data, sell_vol, buy_vol; GetData(sell_data, buy_data, sell_vol, buy_vol); if(sell_data > 0.0) { SellBuffer[0] = sell_data; sell_all += ulong(sell_data); } if(sell_vol > 0.0) { SellVol[1] = sell_vol; sell_all_vol += ulong(sell_vol); } if(buy_data > 0.0) { BuyBuffer[2] = buy_data; buy_all += ulong(buy_data); } if(buy_vol > 0.0) { BuyVol[3] = buy_vol; buy_all_vol += ulong(buy_vol); } } ObjectSetString(ChartID(),"Dl_label_1",OBJPROP_TEXT,"Сум. объём Sell: " + string(sell_all_vol)); ObjectSetString(ChartID(),"Dl_label_2",OBJPROP_TEXT,"Сум. объём Buy: " + string(buy_all_vol)); ObjectSetString(ChartID(),"Dl_label_3",OBJPROP_TEXT,"Сум. кол-во Sell: " + string(sell_all)); ObjectSetString(ChartID(),"Dl_label_4",OBJPROP_TEXT,"Сум. кол-во Buy: " + string(buy_all)); ChartRedraw(ChartID()); event_cnt=rates_total; //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+