Second(s) timeframes on your MT4

 

this script converts the chart's ticks into any Second(s)timeframes !!!

the Script works only for XAUUSD, you can modify it to work with other pairs or other names of Gold pair.

Example custom periods:

S5
S10
S15
S20
S30
S45

S50

Once the Second(s) chart is generated, you can apply almost everything you normally use on regular charts:

✅ Templates ( .tpl )
✅ Indicators
Expert Advisors
✅ Objects & drawings
✅ Trendlines
✅ Fibonacci tools
✅ Moving averages
✅ Oscillators
✅ Custom indicators
✅ Price action tools


Enjoy the Script !!

//+------------------------------------------------------------------+
//|                                             XAUUSD_Seconds.mq4   |
//|                        Custom Seconds Offline Chart Generator    |
//|                        For MT4 Build 600+                        |
//+------------------------------------------------------------------+
#property strict
#property show_inputs

input int   InpSecondsPeriod = 10;      // Seconds timeframe
input bool  InpAutoOpenChart = true;    // Auto open offline chart
input bool  InpShowComment   = true;    // Show status comment

int      ExtHandle      = -1;
long     OfflineChartID = 0;
int      OfflinePeriod  = 20000;

datetime CurrentBarTime = 0;

MqlRates Rate;

string OfflineFileName;

//+------------------------------------------------------------------+
//| Script start                                                     |
//+------------------------------------------------------------------+
void OnStart()
{
   if(Symbol() != "XAUUSD")
   {
      Alert("Attach this script to XAUUSD only.");
      return;
   }

   if(InpSecondsPeriod < 1)
   {
      Alert("Seconds period must be >= 1");
      return;
   }

   OfflinePeriod += InpSecondsPeriod;

   OfflineFileName = Symbol() + (string)OfflinePeriod + ".hst";

   ExtHandle = FileOpenHistory(
      OfflineFileName,
      FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ
   );

   if(ExtHandle < 0)
   {
      Alert("Failed to create offline history file.");
      return;
   }

   WriteHistoryHeader();

   WaitForFirstTick();

   BuildInitialBar();

   if(InpAutoOpenChart)
   {
      OpenOfflineChart();
   }

   MainLoop();
}

//+------------------------------------------------------------------+
//| Wait for first market tick                                       |
//+------------------------------------------------------------------+
void WaitForFirstTick()
{
   while(!IsStopped())
   {
      if(RefreshRates())
      {
         if(TimeCurrent() > 0)
            break;
      }

      Sleep(100);
   }
}

//+------------------------------------------------------------------+
//| Build first candle                                               |
//+------------------------------------------------------------------+
void BuildInitialBar()
{
   datetime now = TimeCurrent();

   CurrentBarTime = NormalizeSecondTime(now);

   Rate.time         = CurrentBarTime;
   Rate.open         = Bid;
   Rate.high         = Bid;
   Rate.low          = Bid;
   Rate.close        = Bid;
   Rate.tick_volume  = 1;
   Rate.spread       = MarketInfo(Symbol(), MODE_SPREAD);
   Rate.real_volume  = 0;

   FileWriteStruct(ExtHandle, Rate);
   FileFlush(ExtHandle);
}

//+------------------------------------------------------------------+
//| Main processing loop                                             |
//+------------------------------------------------------------------+
void MainLoop()
{
   datetime last_refresh = 0;

   while(!IsStopped())
   {
      RefreshRates();

      datetime now = TimeCurrent();

      datetime normalized = NormalizeSecondTime(now);

      if(normalized > CurrentBarTime)
      {
         FinalizeCurrentBar();

         StartNewBar(normalized);
      }
      else
      {
         UpdateCurrentBar();
      }

      if(InpShowComment)
      {
         Comment(
            "XAUUSD Seconds Chart Generator\n",
            "Seconds TF : S", InpSecondsPeriod, "\n",
            "Offline ID : ", OfflinePeriod, "\n",
            "Status     : RUNNING\n",
            "Bid        : ", DoubleToString(Bid, Digits)
         );
      }

      if(TimeLocal() - last_refresh >= 2)
      {
         RefreshOfflineChart();
         last_refresh = TimeLocal();
      }

      Sleep(20);
   }

   Comment("");
}

//+------------------------------------------------------------------+
//| Start new candle                                                 |
//+------------------------------------------------------------------+
void StartNewBar(datetime bar_time)
{
   CurrentBarTime = bar_time;

   Rate.time         = CurrentBarTime;
   Rate.open         = Bid;
   Rate.high         = Bid;
   Rate.low          = Bid;
   Rate.close        = Bid;
   Rate.tick_volume  = 1;
   Rate.spread       = MarketInfo(Symbol(), MODE_SPREAD);
   Rate.real_volume  = 0;

   FileWriteStruct(ExtHandle, Rate);
   FileFlush(ExtHandle);
}

//+------------------------------------------------------------------+
//| Update current candle                                            |
//+------------------------------------------------------------------+
void UpdateCurrentBar()
{
   if(Bid > Rate.high)
      Rate.high = Bid;

   if(Bid < Rate.low)
      Rate.low = Bid;

   Rate.close = Bid;

   Rate.tick_volume++;

   int struct_size = sizeof(MqlRates);

   FileSeek(ExtHandle, -struct_size, SEEK_END);

   FileWriteStruct(ExtHandle, Rate);

   FileFlush(ExtHandle);
}

//+------------------------------------------------------------------+
//| Finalize candle                                                  |
//+------------------------------------------------------------------+
void FinalizeCurrentBar()
{
   int struct_size = sizeof(MqlRates);

   FileSeek(ExtHandle, -struct_size, SEEK_END);

   FileWriteStruct(ExtHandle, Rate);

   FileFlush(ExtHandle);
}

//+------------------------------------------------------------------+
//| Normalize time                                                   |
//+------------------------------------------------------------------+
datetime NormalizeSecondTime(datetime t)
{
   return (t / InpSecondsPeriod) * InpSecondsPeriod;
}

//+------------------------------------------------------------------+
//| Write HST header                                                 |
//+------------------------------------------------------------------+
void WriteHistoryHeader()
{
   int    version = 401;
   string copyright;
   string symbol = Symbol();
   int    period = OfflinePeriod;
   int    digits = Digits;
   int    unused[13];

   ArrayInitialize(unused, 0);

   copyright = "Custom Seconds Chart";

   FileWriteInteger(ExtHandle, version, LONG_VALUE);
   FileWriteString(ExtHandle, copyright, 64);
   FileWriteString(ExtHandle, symbol, 12);
   FileWriteInteger(ExtHandle, period, LONG_VALUE);
   FileWriteInteger(ExtHandle, digits, LONG_VALUE);
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);
   FileWriteInteger(ExtHandle, 0, LONG_VALUE);

   FileWriteArray(ExtHandle, unused, 0, 13);
}

//+------------------------------------------------------------------+
//| Open offline chart                                               |
//+------------------------------------------------------------------+
void OpenOfflineChart()
{
   OfflineChartID = ChartOpen(Symbol(), OfflinePeriod);

   Sleep(1000);

   RefreshOfflineChart();
}

//+------------------------------------------------------------------+
//| Refresh chart                                                    |
//+------------------------------------------------------------------+
void RefreshOfflineChart()
{
   if(OfflineChartID <= 0)
      return;

   ChartSetSymbolPeriod(
      OfflineChartID,
      Symbol(),
      OfflinePeriod
   );

   ChartRedraw(OfflineChartID);
}

//+------------------------------------------------------------------+
//| Cleanup                                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");

   if(ExtHandle >= 0)
   {
      FileClose(ExtHandle);
      ExtHandle = -1;
   }
}
//+------------------------------------------------------------------+