Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BackTesting #252

Open
arteny opened this issue Mar 23, 2021 · 1 comment
Open

BackTesting #252

arteny opened this issue Mar 23, 2021 · 1 comment

Comments

@arteny
Copy link

arteny commented Mar 23, 2021

I want to clarify the available functionality of BackTesting (MtApi5).
As I could check, these options are absent for MtApi5 if compare with MQL experts:

  • Using user parameters and optimization feature
  • Using MQL5 cloud network

If I am wrong here or you have some other details, please share them with us.

And what I found is really missing for backtesting is there is no event in MtApi5 that says that backtesting is finishing.
https://www.mql5.com/ru/docs/event_handlers/ontesterdeinit
As a result Client.GetHistory.. methods returns "No connection" exception after auto-disconnecting.
Also is it possible to add the following method?
https://www.mql5.com/en/docs/common/testerstatistics

@KptKuck
Copy link

KptKuck commented Jul 11, 2021

I know the problem.
At the beginning I tried to add a new event OnDeinit. Which is sent in the function deinit(). But it was not satisfying.

Now I use the following workaround.

In the Trading APP I calculate the maximum time in minutes of the backtest.

Set a SafeEnd = maxtime-10min
I check this value in each bar
So you can definitely 10 minutes before the end of the backtest do everything you need (GetHistory..etc).

Here some code as help(MatLab)

Generate dates:

% Generate Tester Dates
TesterDates.d1 = datetime('2018.01.01','InputFormat','yyyy.MM.dd' );
TesterDates.d2 = datetime('2019.01.01','InputFormat','yyyy.MM.dd' );

TesterDates.Mon = dateseries(TesterDates.d1,TesterDates.d2,'Interval','weekly','Day','Mon');
TesterDates.Tue = dateseries(TesterDates.d1,TesterDates.d2,'Interval','weekly','Day','Tue');
TesterDates.Wed = dateseries(TesterDates.d1,TesterDates.d2,'Interval','weekly','Day','Wed');
TesterDates.Thu = dateseries(TesterDates.d1,TesterDates.d2,'Interval','weekly','Day','Thu');
TesterDates.Fri = dateseries(TesterDates.d1,TesterDates.d2,'Interval','weekly','Day','Fri');

TesterDates.day(1) = length(TesterDates.Mon);
TesterDates.day(2) = length(TesterDates.Tue);
TesterDates.day(3) = length(TesterDates.Wed);
TesterDates.day(4) = length(TesterDates.Thu);
TesterDates.day(5) = length(TesterDates.Fri);

TesterDates.maxweeks = max(TesterDates.day);
TesterDates.Dates = strings(TesterDates.maxweeks,5);

TesterDates.Dates(1:TesterDates.day(1),1) = TesterDates.Mon;
TesterDates.Dates(1:TesterDates.day(2),2) = TesterDates.Tue;
TesterDates.Dates(1:TesterDates.day(3),3) = TesterDates.Wed;
TesterDates.Dates(1:TesterDates.day(4),4) = TesterDates.Thu;
TesterDates.Dates(1:TesterDates.day(5),5) = TesterDates.Fri;

fromdate = datetime(TesterDates.preselected(k,1),'InputFormat','MM/dd/yyyy');
todate = datetime(TesterDates.preselected(k,2),'InputFormat','MM/dd/yyyy');

cLoggerP1.info(sprintf('Loop: %d of %d',k,K),1);
cLoggerP1.info(sprintf('StartDate: %s ',char(fromdate)),1);
cLoggerP1.info(sprintf('EndDate: %s',char(todate)),1);

safeend_dt = todate;

if (day(todate,'dayofweek') == 6)
safeend_dt = safeend_dt - minutes(65);
safeend = System.DateTime.Parse(datestr(safeend_dt));

else
safeend_dt = safeend_dt - minutes(10);
safeend = System.DateTime.Parse(datestr(safeend_dt));
end

function [ok] = updateTesterPreEnd(self,sdtTesterPreEndDate)

          cApiResult = self.cMtApi5.cCommon.TimeCurrent();
         
          if cApiResult.isSuccess()
              self.sdtTimeCurrent = cApiResult.sDateTime;
          end
                      
          if self.sdtTimeCurrent > sdtTesterPreEndDate
             self.bTesterPreEnd = true;
          end
                      
        end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants