Библиотеки: MultiTester - страница 16

 

Самый удобный способ закачать историю тиков (запускать советник в Терминале).

#property description "Закачивает тики через Тестер."

sinput datetime inFromDate = D'2019.01.01'; // С какой даты закачать тики
sinput bool inAllSymbols = false;           // По всем символам (true) или текущему (false)

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

string PrevTesterSettings = NULL;

string GetMyName( void )
{
  return(StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Experts\\")));
}

bool RunMe( const datetime FromDate, const bool AllSymbols = false )
{
  const string Str = "[Tester]" +
                     "\nExpert=" + GetMyName() +
                     "\nSymbol=" + _Symbol +
                     "\nOptimization=" + (AllSymbols ? "3" : "0") +
                     "\nModel=4" +
                     "\nFromDate=" + TimeToString(FromDate, TIME_DATE) +
                     "\nToDate=" + TimeToString(TimeCurrent(), TIME_DATE) +
                     "\nForwardMode=0" +
                     "\nProfitInPips=1" +
                     "\nOptimizationCriterion=0" +
                     "\nVisual=0";
                     
  return(MTTESTER::SetSettings2(Str) && MTTESTER::ClickStart());
}

int OnInit()
{
  bool Res = !MQLInfoInteger(MQL_TESTER) && EventSetTimer(1);

  if (Res = Res && MTTESTER::GetSettings(PrevTesterSettings))
    if (!(Res = RunMe(inFromDate, inAllSymbols)))
      MTTESTER::SetSettings2(PrevTesterSettings);

  return(Res ? INIT_SUCCEEDED : INIT_FAILED);
}

void OnTimer()
{
  if (MTTESTER::IsReady())
  {
    MTTESTER::SetSettings2(PrevTesterSettings);
    
    if (inAllSymbols)
      MTTESTER::CloseNotChart();

    ExpertRemove();
  }
}


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

 
Stanislav Korotky:

Можно избавиться от необходимости писать свой контроллер на MQL5 для вызовов TesterSettings.Add путем поддержки текстового формата настроек проходов тестера (типа в каждой строке символы, таймфреймы и прочее, что может передаваться в  TesterSettings.Add). Потом сделать универсальный советник-контроллер (добавить в состав библиотеки), который принимает на вход единственный параметр - файл с настройками и сам реализует на его основе  SetTesterSettings, тогда пользователю не надо ничего программировать.

В итоге сделал такое. Формируем пачку заданий из ini-файлов и шлем ее на выполнение.

Но часто возникают задачи, когда нужно сформировать задание на основе результатов предыдущих Поэтому не всегда ini-вариант подходит.


ЗЫ Реализация здесь.

 
Практикующим автоматизацию Тестера рекомендую посмотреть в сторону следующих его настроек
MQL5\Profiles\Tester\Groups\*.txt
MQL5\Profiles\Tester\Symbols\*.txt
 
fxsaber:

Самый удобный способ закачать историю тиков (запускать советник в Терминале).

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

Это очень кстати для создания кастомных символов из тиковой истории реальных символов. Кастомные от оригинальных будут отличаться тем, что у них будет полное соответствие тиков и баров. Тем самым не возникнет ошибочных результатов Тестера (пример).

 
К сожалению это все равно не дает обратиться к тиковым данным на несколько лет назад из терминала, даже когда тиковая история закачена в тестере. Приходиться сначала выгружать тики из тестера в файл а потом загружать в кастомный символ через терминал. Вот пример советника который нужно запустить сначала в тестере в режиме реальных тиков для сбора, а потом в терминале для загрузки в кастомный символ.
Файлы:
 
Evgenii Kuznetsov:
К сожалению это все равно не дает обратиться к тиковым данным на несколько лет назад из терминала, даже когда тиковая история закачена в тестере. Приходиться сначала выгружать тики из тестера в файл а потом загружать в кастомный символ через терминал. Вот пример советника который нужно запустить сначала в тестере в режиме реальных тиков для сбора, а потом в терминале для загрузки в кастомный символ.

Вашу схему можно реализовать через запуск советника в Терминале, в котором будет использоваться MTTester.mqh.


Не сталкивался с задачей создания кастомного символа из тиков за много лет. За год - делал и там без проблем Терминал берет тики. Возможно, не запрашиваете порциями и просто упираетесь в нехватку памяти при запросе большого интервала.

 
При нехватки памяти CopyTicksRange выдавал бы -1 и соответственно ошибку можно было бы узнать через GetLastError(), а в моем случае он выдавал просто 0. Ну и запросы были интервалами по одному месяцу.
 
Evgenii Kuznetsov:
При нехватки памяти CopyTicksRange выдавал бы -1 и соответственно ошибку можно было бы узнать через GetLastError(), а в моем случае он выдавал просто 0. Ну и запросы были интервалами по одному месяцу.

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

 

Да просто запустить в тестере любого советника в режиме реальных тиков с 2013 года.

Потом в терминале запустить скрипт:

void OnStart(){
   MqlTick Ticks[];
   Print("!!! ",CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (ulong)D'2013.01.01' * 1000, (ulong)D'2013.02.01' * 1000));
}
 
Evgenii Kuznetsov:

Да просто запустить в тестере любого советника в режиме реальных тиков с 2013 года.

Потом в терминале запустить скрипт:

2020.02.12 16:35:03.435 Test6 (USDSEK,M1)       !!! 2370228
Причина обращения: