Seconds Chart

[Deleted]  
//+------------------------------------------------------------------+
//|                                                  еСекундичка.mq5 |
//+------------------------------------------------------------------+

#property copyright "Copyright 2018, МегаКурец Software Corp."
#property strict

//+------------------------------------------------------------------+

input int Секунди = 5;
input int БройБарове = 200;
input bool ОтделнаГрафика = true;
input string Шаблон = "muh_template.tpl";

//+------------------------------------------------------------------+

class КСекундичка {
 private:
   ulong             ч_заводска_история_от;
   ulong             ч_заводска_история_до;
   datetime          ч_секундовска_история_от;
   datetime          ч_секундовска_история_до;
   ulong             ч_заводско_риъл_тайм_последен;
   ulong             ч_секундовско_риъл_тайм_последен;
   datetime          ч_изначалният_момент;
   datetime          ч_баш_изначалният_момент;
   ulong             ч_изначалният_момент_мсек;
   int               ч_история_брой_тикове;
   bool              ч_история_готова;
   string            ч_име_символъ;
   int               ч_секунди;
   int               ч_барове_изначално;
   int               ч_барове_впоследствие;

   long              ч_графикчките[];
   MqlTick           ч_заводски_тикове_история[];
   MqlRates          ч_секундовски_котировки_история[];

   MqlTick           ч_заводски_тикове_риъл_тайм[];
   MqlTick           ч_секундовски_тикове_риъл_тайм[];
   MqlRates          ч_секундовски_котировки_история_риъл_тайм[];

   void              СъздаванеСекундовскиятСимволъ();
   void              ОпределянеОтДо();
   void              ПреизчисляванеРетроспективно();
   void              ЗаводскиСтаватСекундовски();
   void              ЗатварянеВсичкотоГрафика();
   void              ТриенеСекундовскиятСимволъ();

 public:
                     КСекундичка(int секунди, int брой_свещи);
                    ~КСекундичка();

   void              ОтпарянеГрафика(bool истинска_графика, string шаблон);
   void              КопиранеТиковеОнТаймер();
   void              КопиранеТиковеОнТик();

};

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
КСекундичка::КСекундичка(int секунди,
      int брой_барове) {
   Print("Конструктивна дейнсот по секундичката.");
   ч_секунди=секунди;
   ч_барове_изначално=(int)fmax(брой_барове,3);
   ч_барове_впоследствие=0;
   ч_заводско_риъл_тайм_последен=0;
   ч_секундовско_риъл_тайм_последен=0;
   ч_име_символъ=Symbol()+"."+IntegerToString(ч_секунди)+"секунди";
   СъздаванеСекундовскиятСимволъ();
   ОпределянеОтДо();
   ArrayResize(ч_секундовски_котировки_история,ч_барове_изначално,ч_барове_изначално);
   Print("Първоначално копиране.");
   ч_история_брой_тикове=CopyTicksRange(_Symbol,ч_заводски_тикове_история,COPY_TICKS_ALL,ч_заводска_история_от,ч_заводска_история_до);
   ЗаводскиСтаватСекундовски();
   ч_история_готова=false;
   EventSetTimer(3);
   ArrayResize(ч_графикчките,0,10);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
КСекундичка::~КСекундичка() {
   Print("Деструктивна дейнсот по секундичката.");
   ЗатварянеВсичкотоГрафика();
   ТриенеСекундовскиятСимволъ();
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void КСекундичка::СъздаванеСекундовскиятСимволъ() {
   if(!SymbolSelect(ч_име_символъ,true)) {
      if(!CustomSymbolCreate(ч_име_символъ)) Print("Символът секундовският не можа да бъде създаден.");
      if(!CustomSymbolSetInteger(ч_име_символъ,SYMBOL_DIGITS,SymbolInfoInteger(Symbol(),SYMBOL_DIGITS))) Print("Ами сега?");
      if(!SymbolSelect(ч_име_символъ,true)) Print("Символът секундовският не можа да бъде избран.");
      else Print("Секундовският символ съществува.");
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void КСекундичка::ОпределянеОтДо() {
   Print("Определяне От-До.");
   ч_баш_изначалният_момент=TimeCurrent();
   ч_изначалният_момент=(ч_баш_изначалният_момент/60)*60;
   ч_изначалният_момент_мсек=ulong(ч_изначалният_момент*1000);
   ч_секундовска_история_до=ч_баш_изначалният_момент;
   ч_заводска_история_до=ч_баш_изначалният_момент*1000;
   ч_секундовска_история_от=ч_изначалният_момент-ч_барове_изначално*60;
   ч_заводска_история_от=ulong(ч_изначалният_момент-ч_секунди*ч_барове_изначално)*1000;
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void КСекундичка::ЗаводскиСтаватСекундовски() {
   Print("Заводски тикове започват да стават секундовски, "+IntegerToString(ч_история_брой_тикове)+" тика засега.");
   if(ч_история_брой_тикове==0) return;

   int брояч=1;
   long крайно_време;

   ч_секундовски_котировки_история[0].time=ч_секундовска_история_от;
   ч_секундовски_котировки_история[0].tick_volume=1;
   ч_секундовски_котировки_история[0].open=ч_заводски_тикове_история[0].bid;
   ч_секундовски_котировки_история[0].high=ч_заводски_тикове_история[0].bid;
   ч_секундовски_котировки_история[0].low=ч_заводски_тикове_история[0].bid;
   ч_секундовски_котировки_история[0].close=ч_заводски_тикове_история[0].bid;

   крайно_време=long(ч_заводска_история_от+ч_секунди*1000);

   while(брояч<ч_история_брой_тикове-1 && ч_заводски_тикове_история[брояч].time_msc<крайно_време) {
      ч_секундовски_котировки_история[0].high=fmax(ч_заводски_тикове_история[брояч].bid,ч_секундовски_котировки_история[0].high);
      ч_секундовски_котировки_история[0].low=fmin(ч_заводски_тикове_история[брояч].bid,ч_секундовски_котировки_история[0].low);
      ч_секундовски_котировки_история[0].close=ч_заводски_тикове_история[брояч].bid;
      ч_секундовски_котировки_история[0].tick_volume++;
      брояч++;
   }

   for(int и=1; и<ч_барове_изначално; и++) {
      ч_секундовски_котировки_история[и].time=ч_секундовска_история_от+и*60;
      ч_секундовски_котировки_история[и].tick_volume=1;

      крайно_време=long(ч_заводска_история_от+и*ч_секунди*1000);

      if(ч_заводски_тикове_история[брояч].time_msc<крайно_време) {
         ч_секундовски_котировки_история[и].open=ч_заводски_тикове_история[брояч].bid;
         ч_секундовски_котировки_история[и].high=ч_заводски_тикове_история[брояч].bid;
         ч_секундовски_котировки_история[и].low=ч_заводски_тикове_история[брояч].bid;
         ч_секундовски_котировки_история[и].close=ч_заводски_тикове_история[брояч].bid;

         while(брояч<ч_история_брой_тикове-1 && ч_заводски_тикове_история[брояч].time_msc<крайно_време) {
            ч_секундовски_котировки_история[и].high=fmax(ч_заводски_тикове_история[брояч].bid,ч_секундовски_котировки_история[и].high);
            ч_секундовски_котировки_история[и].low=fmin(ч_заводски_тикове_история[брояч].bid,ч_секундовски_котировки_история[и].low);
            ч_секундовски_котировки_история[и].close=ч_заводски_тикове_история[брояч].bid;
            ч_секундовски_котировки_история[и].tick_volume++;
            брояч++;
         }
      } else {
         ч_секундовски_котировки_история[и].open=ч_секундовски_котировки_история[и-1].close;
         ч_секундовски_котировки_история[и].high=ч_секундовски_котировки_история[и-1].close;
         ч_секундовски_котировки_история[и].low=ч_секундовски_котировки_история[и-1].close;
         ч_секундовски_котировки_история[и].close=ч_секундовски_котировки_история[и-1].close;
      }
   }

   CustomRatesReplace(ч_име_символъ,ч_секундовска_история_от,ч_секундовска_история_до,ч_секундовски_котировки_история);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void КСекундичка::ПреизчисляванеРетроспективно() {
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void КСекундичка::ЗатварянеВсичкотоГрафика() {
   Print("Затваряне всичкото графика.");
   int всичкото_графика = ArraySize(ч_графикчките);
   for(int п=0; п<всичкото_графика; п++) ChartSetSymbolPeriod(ч_графикчките[п],_Symbol,PERIOD_M1);
   for(int у=0; у<всичкото_графика; у++) ChartRedraw(ч_графикчките[у]);
   for(int т=0; т<всичкото_графика; т++) ChartSetSymbolPeriod(ч_графикчките[т],_Symbol,PERIOD_M1);
   for(int к=0; к<всичкото_графика; к++) ChartRedraw(ч_графикчките[к]);
   for(int а=0; а<всичкото_графика; а++) ChartClose(ч_графикчките[а]);
   ObjectsDeleteAll(0,"Секундичка");
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void КСекундичка::ТриенеСекундовскиятСимволъ() {
   if(!SymbolSelect(ч_име_символъ,false)) Print("Символът секундовският си остана избран.");
   else  if(!CustomSymbolDelete(ч_име_символъ)) Print("Символът секундовският не можа да бъде изтрит.");
   else Print("Секундовският символ затрит. Всичко свърши.");
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void КСекундичка::ОтпарянеГрафика(bool истинска_графика,
      string шаблон) {
   Print("Отпаряне графика.");
   if(истинска_графика) {
      int пръц = ArraySize(ч_графикчките);
      ArrayResize(ч_графикчките,пръц+1,10);
      ч_графикчките[пръц]=ChartOpen(ч_име_символъ,PERIOD_M1);
      if(ч_графикчките[пръц]>0) {
         //ChartApplyTemplate(ч_графикчките[пръц],шаблон);
         ChartRedraw(ч_графикчките[пръц]);
         //ChartSetInteger(ч_графикчките[пръц],CHART_SCALEFIX,true);
         //ChartSetInteger(ч_графикчките[пръц],CHART_SHOW_DATE_SCALE,false);
      } else Print("Графикчката не можа да се отпори.");
   } else {
      ObjectCreate(0,"Секундичка",OBJ_CHART,0,0,0);
      ObjectSetInteger(0,"Секундичка",OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetInteger(0,"Секундичка",OBJPROP_XDISTANCE,10);
      ObjectSetInteger(0,"Секундичка",OBJPROP_YDISTANCE,25);
      ObjectSetInteger(0,"Секундичка",OBJPROP_XSIZE,400);
      ObjectSetInteger(0,"Секундичка",OBJPROP_YSIZE,300);
      ObjectSetInteger(0,"Секундичка",OBJPROP_DATE_SCALE,0);
      ObjectSetString(0,"Секундичка",OBJPROP_SYMBOL,ч_име_символъ);
      ObjectSetInteger(0,"Секундичка",OBJPROP_PERIOD,PERIOD_M1);
      ObjectSetInteger(0,"Секундичка",OBJPROP_SELECTABLE,true);
      ChartRedraw();
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void КСекундичка::КопиранеТиковеОнТаймер() {
   if(!ч_история_готова) {
      Print("Копиране ОнТаймеръ.");
      static int брояч=0;
      if(CopyTicksRange(_Symbol,ч_заводски_тикове_история,COPY_TICKS_ALL,ч_заводска_история_от,ч_заводска_история_до)!=ч_история_брой_тикове) {
         ч_история_брой_тикове=CopyTicksRange(_Symbol,ч_заводски_тикове_история,COPY_TICKS_ALL,ч_заводска_история_от,ч_заводска_история_до);
         ЗаводскиСтаватСекундовски();
         брояч=0;
      } else if(ч_история_брой_тикове>0) брояч++;
      if(брояч>2) {
         ЗаводскиСтаватСекундовски();
         ч_история_готова=true;
         Print("Kопиране исторически тикове приключи, "+IntegerToString(ч_история_брой_тикове)+" тика обработени.");
         EventKillTimer();
      }
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void КСекундичка::КопиранеТиковеОнТик() {
   datetime тайм_курент=TimeCurrent();
   ч_барове_впоследствие=int((тайм_курент-ч_изначалният_момент)/ч_секунди);
   ч_заводско_риъл_тайм_последен=ч_изначалният_момент_мсек+1000*ч_барове_впоследствие*ч_секунди;
   ч_секундовско_риъл_тайм_последен=ч_изначалният_момент_мсек+ч_барове_впоследствие*60000;

   MqlTick последният_тик[1];
   SymbolInfoTick(_Symbol,последният_тик[0]);
   последният_тик[0].time_msc=последният_тик[0].time_msc-(long)ч_заводско_риъл_тайм_последен+(long)ч_секундовско_риъл_тайм_последен;
   CustomTicksAdd(ч_име_символъ,последният_тик);
}


КСекундичка Секундичка(Секунди,БройБарове);


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit() {
   if(ObjectFind(0,"Секундичка")<1) Секундичка.ОтпарянеГрафика(ОтделнаГрафика,Шаблон);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick() {
   Секундичка.КопиранеТиковеОнТик();
}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer() {
   Секундичка.КопиранеТиковеОнТаймер();
}


//+------------------------------------------------------------------+

If someone can translate this, it would be great as i cant understand russian. Posting for those looking for source code of seconds chart in mt5.

[Deleted]  
You can do it yourself by using google translation. It's not perfect but you can use common sense to correct any remaining doubts.