//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Binance Data Loader - by Transcendreamer"
#property script_show_inputs
input bool tickmode=true;
input string symbol="BTCUSD_TEST";
input double threshold=1.5;
input double ticksize=0.01;
input int timeframe=1;
input int barvolume=100;
input bool cleanup=false;
char delimeter=',';
bool unicode=false;
datetime time1=D'1984.01.01 00:00';
datetime time2=D'2077.01.01 00:00';
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   if(tickmode)
      LoadTicks();
   else
      LoadBars();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void LoadBars()
  {
   Print("#########################################");
   Print("SCRIPT STARTING");
   if(cleanup)
     {
      int k=CustomRatesDelete(symbol,time1,time2);
      if(k!=-1)
         Print("CLEARED BARS: ",k);
     }
   string filenames[];
   FileSelectDialog("SELECT BINANCE KLINES CSV FILES",NULL,
                    "CSV files (*.csv)|*.csv|All files (*.*)|*.*",
                    FSD_ALLOW_MULTISELECT,filenames);
   int total=ArraySize(filenames);
   if(!SymbolSelect(symbol,true))
     {
      Alert("CAN NOT FIND SYMBOL: ",symbol);
      return;
     }
   for(int i=0; i<total; i++)
     {
      int handle;
      if(unicode)
         handle=FileOpen(filenames[i],FILE_READ|FILE_IS_TEXT|FILE_UNICODE);
      else
         handle=FileOpen(filenames[i],FILE_READ|FILE_IS_TEXT|FILE_ANSI);
      if(handle==INVALID_HANDLE)
        {
         Alert("CAN NOT OPEN FILE: ",filenames[i]);
         continue;
        }
      ulong filesize=FileSize(handle);
      ulong percent=ulong(filesize/100);
      ulong trigger=0;
      MqlRates rates[];
      int count=0;
      long starting=LONG_MAX;
      long ending=LONG_MIN;
      while(!FileIsEnding(handle))
        {
         string parts[];
         string text=FileReadString(handle);
         StringSplit(text,delimeter,parts);
         long opentime=StringToInteger(parts[0]);
         datetime time=datetime(opentime/1000);
         double open=StringToDouble(parts[1]);
         double high=StringToDouble(parts[2]);
         double low=StringToDouble(parts[3]);
         double close=StringToDouble(parts[4]);
         double volume=StringToDouble(parts[5]);
         long closetime=StringToInteger(parts[6]);
         double assetvolume=StringToDouble(parts[7]);
         long trades=StringToInteger(parts[8]);
         double basevolume=StringToDouble(parts[9]);
         double quotevolume=StringToDouble(parts[10]);
         double ignore=StringToDouble(parts[11]);
         if(barvolume>0)
            trades=barvolume;
         if(time>ending)
            ending=time;
         if(time<starting)
            starting=time;
         count++;
         ArrayResize(rates,count,65536);
         rates[count-1].time=time;
         rates[count-1].open=open;
         rates[count-1].high=high;
         rates[count-1].low=low;
         rates[count-1].close=close;
         rates[count-1].real_volume=(long)volume;
         rates[count-1].spread=0;
         rates[count-1].tick_volume=trades;
         ulong progress=FileTell(handle);
         if(progress>=trigger)
           {
            Comment("PROGRESS:   ",i+1,"/",total,"   ",progress,"/",filesize);
            trigger+=percent;
           }
        }
      int n=CustomRatesReplace(symbol,starting,ending,rates);
      Comment("");
      Print("BARS LOADED: ",n);
      PlaySound("ok.wav");
      if(n==-1)
        {
         Alert("ERROR: ",GetLastError());
        }
      FileClose(handle);
     }
   Alert("ALL FILES WERE PROCESSED");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void LoadTicks()
  {
   Print("#########################################");
   Print("SCRIPT STARTING");
   if(cleanup)
     {
      int k=CustomTicksDelete(symbol,time1*1000,time2*1000);
      if(k!=-1)
         Print("CLEARED TICKS: ",k);
     }
   string filenames[];
   FileSelectDialog("SELECT BINANCE TRADES CSV FILES",NULL,
                    "CSV files (*.csv)|*.csv|All files (*.*)|*.*",
                    FSD_ALLOW_MULTISELECT,filenames);
   int total=ArraySize(filenames);
   if(!SymbolSelect(symbol,true))
     {
      Alert("CAN NOT FIND SYMBOL: ",symbol);
      return;
     }
   for(int i=0; i<total; i++)
     {
      int handle;
      if(unicode)
         handle=FileOpen(filenames[i],FILE_READ|FILE_IS_TEXT|FILE_UNICODE);
      else
         handle=FileOpen(filenames[i],FILE_READ|FILE_IS_TEXT|FILE_ANSI);
      if(handle==INVALID_HANDLE)
        {
         Alert("CAN NOT OPEN FILE: ",filenames[i]);
         continue;
        }
      ulong filesize=FileSize(handle);
      ulong percent=ulong(filesize/100);
      ulong trigger=0;
      MqlTick ticks[];
      int count=0;
      long starting=LONG_MAX;
      long ending=LONG_MIN;
      double last_ask=0;
      double last_bid=0;
      double cum_volume=0;
      double prev_price=0;
      while(!FileIsEnding(handle))
        {
         string parts[];
         string text=FileReadString(handle);
         StringSplit(text,delimeter,parts);
         long time=StringToInteger(parts[4]);
         double price=StringToDouble(parts[1]);
         double volume=StringToDouble(parts[2]);
         bool buyer=(parts[5]=="true");
         if(time>ending)
            ending=time;
         if(time<starting)
            starting=time;
         if(buyer)
            last_bid=price;
         else
            last_ask=price;
         cum_volume+=volume;
         if(last_ask!=0 && last_bid!=0)
            if(MathAbs(price-prev_price)>=threshold)
              {
               count++;
               ArrayResize(ticks,count,65536);
               ticks[count-1].time_msc=time;
               ticks[count-1].time=datetime(time/1000);
               ticks[count-1].flags=TICK_FLAG_LAST|TICK_FLAG_VOLUME|TICK_FLAG_ASK|TICK_FLAG_BID;
               ticks[count-1].volume_real=cum_volume;
               if(buyer)
                 {
                  ticks[count-1].last=price;
                  ticks[count-1].bid=price;
                  ticks[count-1].ask=(last_ask>price)?last_ask:price+ticksize;
                 }
               else
                 {
                  ticks[count-1].last=price;
                  ticks[count-1].ask=price;
                  ticks[count-1].bid=(last_bid<price)?last_bid:price-ticksize;
                 }
               cum_volume=0;
               prev_price=price;
              }
         ulong progress=FileTell(handle);
         if(progress>=trigger)
           {
            Comment("PROGRESS:   ",i+1,"/",total,"   ",progress,"/",filesize);
            trigger+=percent;
           }
        }
      int n=CustomTicksReplace(symbol,starting,ending,ticks);
      Comment("");
      Print("TICKS LOADED: ",n);
      PlaySound("ok.wav");
      if(n==-1)
        {
         Alert("ERROR: ",GetLastError());
        }
      FileClose(handle);
     }
   Alert("ALL FILES WERE PROCESSED");
  }
//+------------------------------------------------------------------+
             
            
            
            
Comments