//+------------------------------------------------------------------+ //| ChartOnChart.mq5 | //| Copyright 2016 prostotrader | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016 prostotrader" #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 5 #property indicator_plots 1 // input string SecSymb="RTS-12.16"; //Отображаемый символ input bool Match=true; //Точное совпадение свечей по времени input color LineColor = clrWhite; //Цвет линии input color BullColor = clrGreen; //Цвет бычьей свечи input color BearColor = clrRed; //Цвет медвежьей свечи //--- plot Label1 #property indicator_label1 "" #property indicator_type1 DRAW_CANDLES #property indicator_color1 clrWhite, clrGreen,clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- Levels #property indicator_level1 0 #property indicator_levelwidth 1 #property indicator_levelstyle STYLE_DOT //--- индикаторные буферы double Buffer1[]; double Buffer2[]; double Buffer3[]; double Buffer4[]; double LastBuffer[]; // double att_cnt; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { att_cnt = 1; if(!SymbolSelect(SecSymb,true)) { Alert("Не правильно выбран символ "+SecSymb); return(INIT_FAILED); } int digits=int(SymbolInfoInteger(SecSymb,SYMBOL_DIGITS)); IndicatorSetInteger(INDICATOR_DIGITS,digits); IndicatorSetString(INDICATOR_SHORTNAME,SecSymb); SetIndexBuffer(0,Buffer1,INDICATOR_DATA); SetIndexBuffer(1,Buffer2,INDICATOR_DATA); SetIndexBuffer(2,Buffer3,INDICATOR_DATA); SetIndexBuffer(3,Buffer4,INDICATOR_DATA); SetIndexBuffer(4,LastBuffer,INDICATOR_CALCULATIONS); //--- ArraySetAsSeries(Buffer1,true); ArraySetAsSeries(Buffer2,true); ArraySetAsSeries(Buffer3,true); ArraySetAsSeries(Buffer4,true); ArraySetAsSeries(LastBuffer,true); //--- PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,LineColor); PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,BullColor); PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,BearColor); //--- IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrYellow); PlotIndexSetString(0,PLOT_LABEL," Open;"+" High;"+" Low;"+" Close"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { ArraySetAsSeries(time,true); MqlRates rates[]; if(prev_calculated==0) { ArrayInitialize(Buffer1,EMPTY_VALUE); ArrayInitialize(Buffer2,EMPTY_VALUE); ArrayInitialize(Buffer3,EMPTY_VALUE); ArrayInitialize(Buffer4,EMPTY_VALUE); ArrayInitialize(LastBuffer,EMPTY_VALUE); //--- int attempts=0; int result=0; int a_cnt=1000; //--- делаем 1000 попыток получить таймсерию while((attempts0) break; for(int i=0; i0) { int mem_pos=result; ArraySetAsSeries(rates,true); if(Match) { for(int i=rates_total-1;i>=0;i--) { int is_done=false; for(int j=mem_pos-1;j>=0;j--) { if(time[i]==rates[j].time) { mem_pos=j; Buffer1[i] = rates[j].open; Buffer2[i] = rates[j].high; Buffer3[i] = rates[j].low; Buffer4[i] = rates[j].close; is_done=true; break; } } if(!is_done) { Buffer1[i] = EMPTY_VALUE; Buffer2[i] = EMPTY_VALUE; Buffer3[i] = EMPTY_VALUE; Buffer4[i] = EMPTY_VALUE; } } } else { for(int i=result-1;i>=0;i--) { Buffer1[i] = rates[i].open; Buffer2[i] = rates[i].high; Buffer3[i] = rates[i].low; Buffer4[i] = rates[i].close; } } } else { if(att_cnt == 5) { Alert("Данные по символу "+SecSymb+" не скопированы! Перегрузите индикатор."); } else { att_cnt++; return(0); } } } else { int diff = rates_total - prev_calculated; if(diff>0) { for(int i=diff-1; i>0; i++) { Buffer1[i] = Buffer1[i+1]; Buffer2[i] = Buffer2[i+1]; Buffer3[i] = Buffer3[i+1]; Buffer4[i] = Buffer4[i+1]; } Buffer1[0]= EMPTY_VALUE; Buffer2[0] = EMPTY_VALUE; Buffer3[0] = EMPTY_VALUE; Buffer4[0] = EMPTY_VALUE; } } if(CopyRates(SecSymb,Period(),0,1,rates)==1) { if(time[0]==rates[0].time) { Buffer1[0]= rates[0].open; Buffer2[0] = rates[0].high; Buffer3[0] = rates[0].low; Buffer4[0] = rates[0].close; } } else { int attempts = 0; int a_cnt=10; int result =0; while((attempts0) break; for(int i=0; i<100;i++) { result=1; result=0; } attempts++; } if(result>0) { if(time[0]==rates[0].time) { Buffer1[0]= rates[0].open; Buffer2[0] = rates[0].high; Buffer3[0] = rates[0].low; Buffer4[0] = rates[0].close; } } else { Alert("Данные тика не скопированы!"); } } double s_last=SymbolInfoDouble(SecSymb,SYMBOL_LAST); IndicatorSetDouble(INDICATOR_LEVELVALUE,s_last); LastBuffer[0]=s_last; //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+