//+------------------------------------------------------------------+
//LoadHistory.mq4
//Version 2.0
//Copyright 2024, K Lam
//+------------------------------------------------------------------+
// Rewrite to 2.0

#property copyright "Copyright 2024, K Lam"
#property link      "FXKill.U"
//not update using new version, will fail
//#property strict

#define WM_KEYDOWN         0x0100
#define WM_COMMAND         0x0111
#define VK_HOME            0x24
#define VK_END             0x23

#define Version  20240826
#import "kernel32.dll"
#import "user32.dll"
//   int SendMessageA (int hWnd, int Msg, int wParam, int lParam);
   int PostMessageA (int hWnd, int Msg, int wParam, int lParam);
   
bool InMarketWatch = true; //
int HomeLoop=7; //1000
int Retry=10;//150 time.
int Wait=500;// 1/2
int TimeOut=100;
int sleep=10;
int week=10080;//60*24*7 day(5)
int tf[10]={1,5,15,30,60,240,1440,10080,43200,0};

string SList[2];
long ListChart;
int Handle;
int PrintLog=0;

int KeyMove(string InSy)
{
   int cnt;
   int cntKey;
   int cntT;
   int res1,res2,res3,res4;
   int goday=week/Period();
   
   for(cnt=0;cnt<HomeLoop;cnt++) {
   //if(false)
      for(cntKey=0;cntKey<5;cntKey++) {
         res1=ChartNavigate(ListChart,CHART_BEGIN,goday);
         res2=ChartNavigate(ListChart,CHART_BEGIN,-1*goday);
         res3=ChartNavigate(ListChart,CHART_END,goday);
         res4=ChartNavigate(ListChart,CHART_END,-1*goday);
         PostMessageA(Handle, WM_COMMAND,33324,0);//Refresh      
         } //for
   if(false)
      for(cntKey=0;cntKey<5;cntKey++) {
         PostMessageA(Handle, WM_KEYDOWN, VK_HOME,0);//Pass HOME Key
         Sleep(2);
         PostMessageA(Handle, WM_COMMAND,33324,0);//Refresh
         PostMessageA(Handle, WM_KEYDOWN, VK_END,0);
         } //for
      if(!res1 || !res2 || !res3 || !res4) break;//return(0);
//   if(!res) Print("Navigate failed. Error = ",GetLastError());
//      Print(InSy,"@Start at ",ChartSymbol(0),"=",Symbol(),"Navigate!");
      
      Sleep(sleep);//wait 0.0001 sca
      if(cntT>TimeOut) break;
      cntT++;
      }

return(1);
}

int SameString(string InSy)
{//compair string is same then next
   int cnt;
   int cntT;

   for(cnt=0;cnt<Retry;cnt++) {
      if(StringCompare(InSy,ChartSymbol(ListChart),true)==0) return(1);
      Sleep(sleep);//wait 0.0001 sca
      if(cntT>TimeOut) break;
      cntT++;
      }
   return(0);
}

void LoadChart()
{
   ListChart=ChartOpen(Symbol(),PERIOD_H1);
   Handle=WindowHandle(Symbol(),PERIOD_H1); 
   //ChartGetInteger(ListChart,CHART_WINDOW_HANDLE,0,Handle);
   ChartSetSymbolPeriod(ListChart,Symbol(),PERIOD_H1);
   if(ListChart==Handle) Print("ListChart==",ListChart);   
}

void LoadTime(string InSy)
{
   int cnt;
   int TT=10;//10 Timeframe
   int StartCnt;
   int EndCnt;

   for(cnt=0;cnt<TT;cnt++) {
      StartCnt=iBars(InSy,tf[cnt]);
      if(ChartSetSymbolPeriod(ListChart,InSy,tf[cnt])) //PERIOD_H1
         if(PrintLog>0) Print("LoadTime InSy=",ChartSymbol(ListChart));
      if(SameString(InSy)!=1) //Print(InSy," Loaded"); else 
         Print(InSy," fail Loaded");

      Sleep(Wait);// 1000 = 1 second
      //PassKey //ChartNavigate(ListChart,CHART_BEGIN,-150); CHART_END
      if(KeyMove(InSy)==1) 
         if(PrintLog>0) Print(InSy," Key Pass=",Symbol());
      //Print("Changed=",Symbol()," cnt=",cnt);
      ChartRedraw();
      EndCnt=iBars(InSy,tf[cnt]);
      
      if((EndCnt-StartCnt)>0) //if(PrintLog>0)
         Print(InSy,"@Start=",StartCnt," Loaded Bar=",iBars(InSy,tf[cnt])," at ",
            ChartSymbol(0),"=",Symbol(),"@Timeframe=",tf[cnt]);
      }//for(cnt=0;cnt<TT;cnt++) {
}

int ShowSymbol()
{
   int AllSymbols=SymbolsTotal(InMarketWatch);
   
   if(InMarketWatch)    
      Print("Load In Market Watch=",AllSymbols," only, All Symbols=",SymbolsTotal(false));
      else
         Print("Load All Symbols=",SymbolsTotal(false));
   ArrayResize(SList,AllSymbols);
   return(AllSymbols);
}

void LoadSymbol(int AllSymbols)
{   
   int i;
   uint Starttime;
   for(i=0;i<AllSymbols;i++) {
      SList[i]=SymbolName(i,InMarketWatch);
      Starttime=GetTickCount();
      LoadTime(SList[i]);
      Print("Loading... ",SList[i]," done. ",DoubleToString((double(GetTickCount()-Starttime)/1000),3)," Seconds.");
//      CurrBars=iBars(Symbols[i],tf[j]);
//Print("Start Bar@",StartBars," Bar=",iBars(SList[i],tf[i])," at ",Symbol()," Timeframe=",tf[i]);
      }
}
//+------------------------------------------------------------------+
//| Initialization
int init()
{
   Print(AccountCompany()," ",AccountNumber(),"@",AccountServer());
   return(0);
}

int deinit()
{
   if(ChartClose(ListChart))
      Print("Chart Closed");

   Print(AccountCompany()," ",AccountNumber(),"@",AccountServer());
   Print("Leverage =", AccountLeverage()," Login User=",AccountName());
   return(0);
}

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() 
{
   int ListSymbols;
   
   ListSymbols=ShowSymbol();
   LoadChart();//
   
   LoadSymbol(ListSymbols);
   return;
}
