Автоматическая смена аккаунта для доступа к MT4/MT5 - страница 3

 
LRA:
Программно выключить звук без всяких API можно программно, меняю имя звука:  zvuk="aaa.wav"; - будет звук  zvuk="bbb.wav"; звук отсутствует, так как в этом файле тишина

Тогда нужно делать руками ссылку на файл, что не совсем корректно, так как требуется уже вмешательство в файловую структуру.

 
Всё бы хорошо, но ядро процессора, на котором крутится терминал, постоянно загружено на 100% - есть ли идеи, как уменьшить нагрузку от работы скрипта?
 
Aleksey Vyazmikin:
Всё бы хорошо, но ядро процессора, на котором крутится терминал, постоянно загружено на 100% - есть ли идеи, как уменьшить нагрузку от работы скрипта?

   Сделать внешнюю виндовую прогу для управления терминалом, и забыть как страшный сон...

   https://www.youtube.com/watch?v=Al39VMT53MQ

 
Rustamzhan Salidzhanov:

   Сделать внешнюю виндовую прогу для управления терминалом, и забыть как страшный сон...

   https://www.youtube.com/watch?v=Al39VMT53MQ

Программа по управлению терминалом, это конечно интересно, но похоже на стрельбу в воробьев из пушки.

Интересно решение средствами MQL.

 
Aleksey Vyazmikin:

Программа по управлению терминалом, это конечно интересно, но похоже на стрельбу в воробьев из пушки.

Интересно решение средствами MQL.

   ну я бы так не сказал, трудозатраты совместьимые, зато полная управляемость и абсолютная стабильность.как для серверного решения, несколько таких как вы выразились пушек стоят у клиентов на серверах уже по несколько лет и никаких замечаний к работе...

    

 
Rustamzhan Salidzhanov:

   ну я бы так не сказал, трудозатраты совместьимые, зато полная управляемость и абсолютная стабильность.как для серверного решения, несколько таких как вы выразились пушек стоят у клиентов на серверах уже по несколько лет и никаких замечаний к работе...

    

Так я не говорю, что должны быть замечания.

Для меня это сложная задача. Готовы кодом поделится? А если нет, то это реклама?

 
Aleksey Vyazmikin:

Так я не говорю, что должны быть замечания.

Для меня это сложная задача. Готовы кодом поделится? А если нет, то это реклама?

   код на делфи, лично вам могу дать, осилите переработку под себя ?

 
Rustamzhan Salidzhanov:

   код на делфи, лично вам могу дать, осилите переработку под себя ?

Сомневаюсь, что самостоятельно справлюсь, но мир не без добрых людей.

 
Aleksey Vyazmikin:

Сомневаюсь, что самостоятельно справлюсь, но мир не без добрых людей.

   вот код основного модуля, в нем есть все, что вам нужно. проект не даю

  

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, StrUtils, Variants, Classes, Graphics, Controls, Forms, Masks,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, uFiles, TimeUnix, IniFiles, ShellApi, TlHelp32, ToolWin,
  AppEvnts;

type
  TForm1 = class(TForm)
    Footer: TStatusBar;
    Panel1: TPanel;
    Log: TMemo;
    bStart: TButton;
    bStop: TButton;
    userdata_fn: TEdit;
    watch: TTimer;
    data_dir: TEdit;
    symbol: TEdit;
    period: TEdit;
    timeout: TEdit;
    terminal_dir: TEdit;
    ApplicationEvents1: TApplicationEvents;
    dpStartDate: TDateTimePicker;
    dpStopDate: TDateTimePicker;
    Label1finddis: TLabel;
    Label2finddis: TLabel;
    procedure bStartClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure bStopClick(Sender: TObject);
    procedure watchTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure bSetClick(Sender: TObject);
    procedure ApplicationEvents1Exception(Sender: TObject; E: Exception);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
   TRun = class(TThread)
   private
   
   protected
      procedure Execute;override;
   end;   
var
  Form1: TForm1;
  gUsers:array of TStringList;
  Run:Trun;
  gOk:boolean = true;
  //+---------------------------------------------------------------------------+
  gUser,gAcc,gPass,gServ,gName,gStartTm,gStopTm,gMagics:string;
  //+---------------------------------------------------------------------------+
  function CloseExe():boolean;
  function FileCopy(const SourceFileName, TargetFileName: string):boolean;
  function ExecuteFileTm(FileName: string; Params: string; Dsk: boolean; TimeOut:cardinal): LongBool;
  //-------------------------
  function CheckTime():boolean;
  function CheckUsers():boolean;
  function WriteScriptIni():boolean;
  function WriteTerminalIni():boolean;
  function ClearFolder(Path: string):boolean;
  function ReadText(const fn:string; var nm:string):string;
  //+---------------------------------------------------------------------------+
implementation

{$R *.dfm}
//+-----------------------------------------------------------------------------+
procedure TForm1.bStartClick(Sender: TObject);
var
res:boolean;
fn:string;
begin
        if(not gOk)then exit;   
        form1.bStart.Enabled:=false;
        form1.bStop.Enabled:=true;
        form1.Footer.Panels[0].Text:='Working...';

        //if(not CheckTime())then exit; // выходим если еще не время
        if(not CheckUsers())then exit;// выходим если нет юзеров для проверки или ошибка
        Run.Execute;
end;
//+-----------------------------------------------------------------------------+
procedure TForm1.bStopClick(Sender: TObject);
begin
   form1.bStart.Enabled:=true;
   form1.bStop.Enabled:=false;
   form1.Footer.Panels[0].Text:='Stopped';
   //WriteTerminalIni();
   //Run.Destroy;
end;
//+-----------------------------------------------------------------------------+
procedure TForm1.bSetClick(Sender: TObject);
begin

end;
//+-----------------------------------------------------------------------------+
procedure TForm1.FormDestroy(Sender: TObject);
begin
   SaveSettings(true);
   if(not Run.Terminated)then Run.Destroy;
end;
//+-----------------------------------------------------------------------------+
procedure TForm1.FormCreate(Sender: TObject);
begin
  SaveSettings(false);
  Run:=TRun.Create(true);
  Run.Priority:=tpNormal;
end;
//+-----------------------------------------------------------------------------+
procedure TForm1.FormActivate(Sender: TObject);
begin
   form1.bStop.Enabled:=false;
   HaveDir(extractfilepath(paramstr(0))+form1.data_dir.Text,true);
   form1.Footer.Panels[5].Text:='00';
   gStartTm := datetostr(form1.dpStartDate.Date);
   gStopTm  := datetostr(form1.dpStopDate.Date);
end;
//+-----------------------------------------------------------------------------+
procedure TForm1.watchTimer(Sender: TObject);
var ctm:string;
begin
   DateTimeToString(ctm,'hh:mm:ss',Now);
   form1.Footer.Panels[1].Text:=ctm;
   DateTimeToString(ctm,'ss',Now);
   {if(ctm = '00')and(not form1.bStart.Enabled)then begin
      if(not CheckTime())then exit; // выходим если еще не время
      if(not CheckUsers())then exit;// выходим если нет юзеров для проверки или ошибка
      Run.Execute;                  // запускаем рабочий поток
   end;}   
end;
//+-----------------------------------------------------------------------------+
procedure TRun.execute;
var
tres:boolean;
i,ii,co:integer;
tm:TDateTime;
ctm,fn,txt,terr,serr,tenm,senm,dtm:string;
begin
   Application.ProcessMessages;
   DateTimeToString(dtm,'yyyymmdd',Now);
   ii:=UTimeCurrent;
   co:=0;
   if(Run.Terminated)then exit; // прерывание по команде
   if(Application.Terminated)then exit;// прерывание по закрытию программы
   if(not gOk)then exit;
        for i:=0 to Length(gUsers)-1 do begin
      Application.ProcessMessages;
      if(Run.Terminated)then exit; // прерывание по команде
                if(Application.Terminated)then exit;// прерывание по закрытию программы
      if(not form1.bStop.Enabled)then exit;// выход по нажатию стоп
        //GetLog('Count : '+inttostr(i)+' User Size : '+inttostr(Length(gUsers)));
                if(gUsers[i].Count < 4)then begin
                        Getlog('ERROR Bad User data string! User : '+string(gUsers[i][0])+' Account :'+string(gUsers[i][1]));
                        continue;
                end;
                gUser:=string(gUsers[i][0]);
        //--
                gAcc :=string(gUsers[i][1]);
      if(Length(gAcc)<2)then begin
         Getlog('ERROR Bad User Account string! User : '+string(gUsers[i][0])+' Account :'+string(gUsers[i][1]));
                        continue;
      end;
                gPass:=string(gUsers[i][2]);
      if(Length(gPass)<2)then begin
         Getlog('ERROR Bad User Password string! User : '+string(gUsers[i][0])+' Password :'+string(gUsers[i][2]));
                        continue;
      end;
                gServ:=string(gUsers[i][3]);
      if(Length(gAcc)<2)then begin
         Getlog('ERROR Bad Server IP string! User : '+string(gUsers[i][0])+' Server IP :'+string(gUsers[i][3]));
                        continue;
      end;
        //----
        gStartTm:=string(gUsers[i][4]);
        gStopTm:=string(gUsers[i][5]);
        gMagics:=string(gUsers[i][6]);
                //--- если приходиться прибивать терминал вручную, то читаем файл ошибок, лог експертов, лог терминала, и пишем все это в общий лог.
                if(CloseExe())then GetLog('WARNING : NOT CLOSED TERMINAL');
                //---
        tres := true;
        //---
        ClearFolder(form1.data_dir.Text+'logs\');// чистим папку логов терминала
        ClearFolder(form1.data_dir.Text+'MQL4\Logs\');// чистим папку логов советников
        //--- пишем сетфайл для скрипта
        WriteScriptIni();
                //---
                if(not WriteTerminalIni())then exit; // Пишем сетфайл терминала или выходим с остановкой
                ExecuteFileTm(form1.terminal_dir.Text+'terminal.exe',// запускаем терминал
                                                          Format('"%s" %s',[extractfilepath(paramstr(0))+'terminal.exe','-n:6 /p5 "config\start.ini"']),
                                                          false,
                                                          strtoint(form1.timeout.Text));
        //--- если что то пошло не так
        if(FileExists(form1.data_dir.Text+'MQL4\Files\'+'error.txt'))then begin
            DeleteFile(form1.data_dir.Text+'MQL4\Files\'+'error.txt');                              // удаляем файл ошибки
            terr := ReadText(form1.data_dir.Text+'logs\',tenm); // читаем лог терминала
            serr := ReadText(form1.data_dir.Text+'MQL4\Logs\',senm);// читаем лог скриптов
            tres:=false;                                                                            // говорим что все плохо
        end;
        //---
        inc(co);
        if(not tres)then begin
         Getlog('ERROR WIDTH USER ACCOUNT. User : '+string(gUsers[i][0])
                                         +' Account :'+string(gUsers[i][1])
                                         +' Password :'+string(gUsers[i][2])
                                         +' Server IP :'+string(gUsers[i][3]));
         GetLog('TERMINAL ERROR : '+terr);
         GetLog('SCRIPT ERROR : '+serr);
        end;
        end;
   ii:=UTimeCurrent - ii;
   if(ii>60)then begin
      ctm:=inttostr(ii mod 60)+':'+inttostr(ii div 60);
   end else begin
      ctm:='00:'+inttostr(ii);
   end;
   if(Length(gUsers)>0)then begin
      GetLog('Last Users Count : '+inttostr(co)+'  Working Time : '+ctm);
      Form1.Footer.Panels.Items[4].Text:='Last Users Count : ';
      Form1.Footer.Panels.Items[5].Text:=inttostr(co);
      Form1.Footer.Panels.Items[7].Text:=ctm;
   end;
   //CheckTime();
   form1.bStop.Click;
end;
//+------------------------------------------------------------------+
function ReadText(const fn:string; var nm:string):string;
var
sr : TSearchRec;
hd:TextFile;
txt:string;
begin
{$IOChecks off}
   result:='';
   if(FindFirst(fn+'*.log', faAnyFile, sr)<0)then exit;
   FindClose(sr);
   if(not FileExists(fn+sr.Name))then exit;
   AssignFile(hd,fn+sr.Name);
   try
           Reset(hd);
      While(not EoF(hd))do begin
         ReadLn(hd,txt);
         result:=result+txt+#13#10;
      end;
      CloseFile(hd);
      nm:=sr.Name;
   except
      CloseFile(hd);
   end;
{$IOChecks on}
end;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
function FileCopy(const SourceFileName, TargetFileName: string):boolean;
var
S, T : TFileStream;
begin
{$IOChecks off}
    result:=false;
    if(not FileExists(sourcefilename))then begin
        GetLog('ERROR NOT FOUND FILE : '+sourcefilename);
        exit;
    end;
    S := TFileStream.Create(sourcefilename, fmOpenRead );
    try
        T := TFileStream.Create(targetfilename, fmOpenWrite or fmCreate);
        try
            T.CopyFrom(S, S.Size ) ;
            FileSetDate(T.Handle, FileGetDate(S.Handle));
            result:=true;
        finally
            T.Free;
        end;    
    finally
        S.Free;
    end;
{$IOChecks on}
end;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
function ExecuteFileTm(FileName: string; Params: string; Dsk: boolean; TimeOut:cardinal): LongBool;
var
  PIn: PROCESS_INFORMATION;
  SII: STARTUPINFO;
  RetCode: cardinal;
  TmOut: cardinal; //In seconds
  i,ii: integer;
  CreationsFlags: cardinal;
  min,sec:integer;
  m,s:string;
begin
    RetCode:=0;
    if Dsk then begin
        CreationsFlags := CREATE_DEFAULT_ERROR_MODE or NORMAL_PRIORITY_CLASS
        or CREATE_UNICODE_ENVIRONMENT;
    end else begin
        CreationsFlags := CREATE_DEFAULT_ERROR_MODE or CREATE_NO_WINDOW
        or NORMAL_PRIORITY_CLASS
        or CREATE_UNICODE_ENVIRONMENT;
    end;
        try
                getstartupinfo(SII);
                result:=createprocess(
                                pchar(FileName),
                                pchar(Params),
                                nil,
                                nil,
                                True,
                                CreationsFlags,
                                nil,
                                pchar(extractfilepath(FileName)),
                                SII,
                                PIn);
        except
                on E : Exception do
                        GetLog(('ERROR Terminal starting : '+(E.ClassName)+' : '+E.Message));
                else
                        GetLog('ERROR Terminal starting error.');
                //---
                CloseHandle(Pin.hProcess);
                result := False;
                exit;
        end;
    //---
        if not result then begin
                CloseHandle(Pin.hProcess);
                result := False;
                GetLog('ERROR Terminal.exe not found on this path:'+FileName);
                Getlog('CRITICAL ERROR System stopped!');
                form1.bStop.Click;// прерываем выполнение программы
                if(not Run.Terminated)then Run.Terminate;    // останавливаем поток
                exit;
        end;
    //---
    RetCode := STILL_ACTIVE;
    Form1.Footer.Panels.Items[4].Text:='Wait for close Terminal';
    i:=0;
        while (i<300) and (RetCode = STILL_ACTIVE) do begin
                try
                        GetExitCodeProcess(Pin.hProcess, RetCode);
                        Application.ProcessMessages;
                except
                        CloseHandle(Pin.hProcess);
                        result := False;
                        exit;
                end;
        inc(i);
        Sleep(100);
        sec := round(i/10);
        if(sec<10)then s:='0'+inttostr(sec) else s:=inttostr(sec);
        Form1.Footer.Panels.Items[5].Text:=s;
        Application.ProcessMessages;
        if Application.Terminated then exit;
        if form1.bStart.Enabled then exit;
        end;
    Form1.Footer.Panels.Items[4].Text:='Terminal Closed';
    GetExitCodeProcess(Pin.hProcess, RetCode);
        if(RetCode = STILL_ACTIVE) then begin
                TerminateProcess(Pin.hProcess, RetCode);
                CloseHandle(Pin.hProcess);
                result := true; //
                GetLog('ERROR : The terminal is completed by timeout.');
        Sleep(500);
                exit;
        end;
        CloseHandle(Pin.hProcess);
        result := True;
    Sleep(500);
end;
//+------------------------------------------------------------------+
//| Прибиваем Терминал вручную                                       |
//+------------------------------------------------------------------+
function CloseExe():boolean;
var
        hSnapshot,hSnapshot2:THandle;
        proc:TProcessEntry32;
        m:TModuleEntry32;
        fn:string;
        pid:cardinal;
        Pin: PROCESS_INFORMATION;
begin
   result:=false;
        pid:=pin.dwProcessId;
        fn:=extractfilepath(paramstr(0))+'terminal.exe';
        hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        proc.dwSize:=Sizeof(proc);
        if Process32First(hSnapshot,proc) then repeat
                hSnapshot2:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,proc.th32ProcessID);
                m.dwSize:=SizeOf(TModuleEntry32);
                if Module32First(hSnapshot2,m) then begin
                        if (Pos(fn,m.szExePath)>0) then begin
                                TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), proc.th32ProcessID), 0);
                                GetLog('WARNING Close Terminal manually :'+m.szExePath);
                                CloseHandle(hSnapshot2);
                                CloseHandle(hSnapshot);
                                result:=true;
                                exit;
                        end;
                end;
        until not Process32Next(hSnapshot,proc);
        CloseHandle(hSnapshot);
end;
//+------------------------------------------------------------------+
//| очищаем папки                                                    |
//+------------------------------------------------------------------+
function ClearFolder(Path: string):boolean;
var
        Mask: string;
        SearchRec: TSearchRec;
        FindResult: Integer;
        List: TStringList;
        i: Integer;
begin
        {$IOChecks off}
        //getLog('Try Clear Folder : '+Path);
    if not HaveDir(Path,false)then begin
                GetLog('Not Found Path for Clear: '+Path);
                GetLog('CRITICAL ERROR. Programm Stopped.');
                gOk:=false;
        form1.bStop.Click;
                exit;
        end;
    if(FindFirst(Path + '*.*', faAnyFile, SearchRec)<0)then exit;
        Mask := ExtractFileName(Path);
        if Mask = '' then Mask := '*.*';
        Path := ExtractFilePath(Path);
        if Path = '' then Path := IncludeTrailingBackslash(GetCurrentDir);
        List := TStringList.Create;
        try
                FindResult := FindFirst(Path + '*.*', faAnyFile, SearchRec);
                try
                        while FindResult = 0 do
                                with SearchRec do begin
                                        if ((Attr and faDirectory) = 0) and MatchesMask(Name, Mask) then
                                                List.Add(Name);
                                                FindResult := FindNext(SearchRec);
                                end;
                                for i := 0 to List.Count - 1 do
                                DeleteFile(Path + List[i]);
                finally
                        FindClose(SearchRec);
                end;
        finally
                List.Free;
        end;
    result:=true;
    {$IOChecks on}
end;
//+------------------------------------------------------------------+
//| Пишем ини файл для срипта                             |
//+------------------------------------------------------------------+
function WriteScriptIni():boolean;
var
        iHd:TextFile;
        ini:TIniFile;
        fn:string;
begin
   result:=false;
   fn := form1.data_dir.text+'MQL4\Presets\monitor.set';
   if not HaveDir(fn,false)then begin
                GetLog('CRITICAL ERROR. Not found CONFIG dir'+extractfilepath(paramstr(0))+'Programm Stopped.');
                gOk:=false;
                form1.bStop.Click;
                exit;
        end;
        if(FileExists(fn))then DeleteFile(fn);
        AssignFile(iHd,fn);
        Rewrite(iHd);
    
        WriteLn(iHd,'AccName='+gUser);       //GetLog(gUser);
        WriteLn(iHd,'StartDt='+gStartTm);    //GetLog(gStartTm);
        WriteLn(iHd,'EndDt='+gStopTm);       //GetLog(gStopTm);
        WriteLn(iHd,'Magiks='+gMagics);      //GetLog(gMagics);

        CloseFile(iHd);
   result:=true;
end;
//+------------------------------------------------------------------+
//| Пишем ини файл для запуска терминала                             |
//+------------------------------------------------------------------+
function WriteTerminalIni():boolean;
var
        iHd:TextFile;
        ini:TIniFile;
        fn:string;
begin
   result:=false;
   fn := form1.data_dir.text+'config\start.ini';
   if not HaveDir(fn,false)then begin
                GetLog('CRITICAL ERROR. Not found CONFIG dir'+extractfilepath(paramstr(0))+'Programm Stopped.');
                gOk:=false;
                form1.bStop.Click;
                exit;
        end;
        if(FileExists(fn))then DeleteFile(fn);
        AssignFile(iHd,fn);
        Rewrite(iHd);
    
        WriteLn(iHd,'Login='+gAcc);
        WriteLn(iHd,'Password='+gPass);
        WriteLn(iHd,'Server='+StringReplace(gServ,'_',' ',[rfReplaceAll]));
        //WriteLn(iHd,'AutoConfiguration=false');//+auto);
        //WriteLn(iHd,'DataServer='+ini.ReadString('user','server','127.0.0.1'));
        WriteLn(iHd,'EnableDDE=false');
        WriteLn(iHd,'EnableNews=false');
        WriteLn(iHd,'; proxy settings');
        WriteLn(iHd,'ProxyEnable=false');
        WriteLn(iHd,'; ftp settings');
        WriteLn(iHd,'FTPEnable=false');
        WriteLn(iHd,'; experts settings');
        WriteLn(iHd,'ExpertsEnable=true');
        WriteLn(iHd,'ExpertsDllImport=true');
        WriteLn(iHd,'ExpertsDllConfirm=false');
        WriteLn(iHd,'ExpertsExpImport=true');
        WriteLn(iHd,'ExpertsTrades=false');
        WriteLn(iHd,'ExpertsTradesConfirm=false');
        WriteLn(iHd,'; open chart and run expert and/or script');
        //WriteLn(iHd,'Symbol='+form1.symbol.text);
        WriteLn(iHd,'Period='+form1.period.text);
        WriteLn(iHd,'Script=AccountMonitor');
        WriteLn(iHd,'ScriptParameters=monitor.set');
        CloseFile(iHd);
   result:=true;        
end;
//+-----------------------------------------------------------------------------+
function CheckUsers():boolean;
var
i:integer;
fn,txt:string;
hd:TextFile;
begin
   result:=false;
   fn := extractfilepath(paramstr(0))+form1.userdata_fn.Text;
   if(not FileExists(fn))then begin
                GetLog('ERROR UserFile not found:'+fn);
                exit;
        end;
   AssignFile(hd,fn);
   i:=0;
        try
                Reset(hd);
      while(not Eof(hd))do begin
         ReadLn(hd,txt);
         inc(i);
      end;
        except
                CloseFile(hd);
      exit;
        end;
        CloseFile(hd);
   if(i<1)then exit;
   //---
        SetLength(gUsers,i-1);
        AssignFile(hd,fn);
        i:=0;
        try
                Reset(hd);
                ReadLn(hd,txt);
                while(not Eof(hd))do begin
                        ReadLn(hd,txt);
                        //GetLog(txt);
                        txt:=StringReplace(Trim(txt),';',',',[rfReplaceAll]);
                        txt:=StringReplace(txt,' ','_',[rfReplaceAll]);
                        //if(LastDelimiter(',',txt)=Length(txt))then txt:=Copy(txt,1,Length(txt)-1);
                        //if(Length(txt)<20)then continue;
                        //---
                        gUsers[i]:=TStringList.Create;
                        gUsers[i].CommaText:=txt;
                        inc(i);
                end;
        except
                CloseFile(hd);
                exit;
        end;
        //GetLog('Count Users : '+inttostr(i));
        CloseFile(hd);
        result:=true;
end;
//+-----------------------------------------------------------------------------+
function CheckTime():boolean;
var
i:integer;
tm,tt:TDateTime;
ctm,fn,txt:string;
hd:TextFile;
times:TStringList;
begin
   result:=false;
   DateTimeToString(ctm,'hh:mm',Now);
   //fn := extractfilepath(paramstr(0))+form1.timedata_fn.Text;
   if(not FileExists(fn))then begin
                GetLog('ERROR TimeFile not found:'+fn);
                exit;
        end;
   AssignFile(hd,fn);
        try     
                Reset(hd);
        except
                CloseFile(hd);
      exit;
        end;
        ReadLn(hd,txt);
        CloseFile(hd);
        txt:=Trim(txt);
   txt:=StringReplace(txt,';',',',[rfReplaceAll]);
   if(LastDelimiter(',',txt)=Length(txt))then txt:=Copy(txt,1,Length(txt)-1);
   //---
   times:=TStringList.Create;
   times.CommaText:=txt;
   for i:=0 to times.Count-1 do begin
      if(times[i] = ctm)then begin
         result:=true;

         exit;
      end;
   end;
   //---
   tm:=StrToTime(times[times.Count-1]);
   tt:=StrToTime(ctm);
   if(tt>tm)then begin
      form1.Footer.Panels[3].Text:=times[0];
      exit;
   end;
   for i:=0 to times.Count-1 do begin
      tm:=StrToTime(times[i]);
      tt:=StrToTime(ctm);
      if(tt<tm)then begin
         form1.Footer.Panels[3].Text:=times[i];
         exit;
      end;
   end;
end;
//+------------------------------------------------------------------+
procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
  E: Exception);
begin
   GetLog('APPLICATION ERROR : '+(E.ClassName)+' : '+E.Message);
end;


end.
 
Rustamzhan Salidzhanov:

   вот код основного модуля, в нем есть все, что вам нужно. проект не даю

  

Спасибо! Уверен, что это поможет кому то.  Я правильно понимаю, что это работает через изменение ini файла, т.е. для смены аккаунта нужно переоткрывать терминал?