Seconds Chart

 
//+------------------------------------------------------------------+
//|                                                  еСекундичка.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.

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