Тестер стратегий MetaTrader 5: ошибки, баги, предложения по улучшению работы - страница 46

 
traveller00:
Билд 2280, но и в прошлых версиях это было. Если запускать на отладку скрипт или советник открывается новое окно первого символа из обзора рынка на таймфрейме 1H. А если мне надо отладить не на первом символе или на другом ТФ? Есть ли способ это сделать без шаманства вроде удаления всех символов, чтобы нужный стал первым?
Зайдите в настройки терминала. Там есть выбор символа для отладки.
 
Artyom Trishkin:
Зайдите в настройки терминала. Там есть выбор символа для отладки.

Артём, ты чуток ошибся. Это настройки МЕ, а не терминала


Меньше надо работать.)))

 
Artyom Trishkin:
Зайдите в настройки терминала. Там есть выбор символа для отладки.

Всё, нашёл, спасибо. Недавно с MT5 работаю, ещё не до конца все вещи знаю.

 
Alexey Viktorov:

Артём, ты чуток ошибся. Это настройки МЕ, а не терминала


Меньше надо работать.)))

Да, ошибся... Бывает когда с мобильного пишешь, и глянуть некуда...
 

Билд 2280. На компьютере 4 процессора. Запущено 2 MT5. В первом крутится долгий скрипт, в итоге его terminal64.exe кушает на 100% 1 процессор, что даёт общую загрузку в 25%. На втором MT5 запущена генетическая оптимизация. Стандартно 4 агента по числу процессоров. Первая пачка заданий приходит всем по 127. Остальные задания 2 агента получают и выполняют, а остальные 2 висят в finished и даже не получают. Если их принудительно disable-enable, они подключатся в работу. До нового старта оптимизации. Если грохнуть первый MT5, ситуация останется такой же. Если после этого перезапустить второй MT5, то будет нормально. Это такой хитрый load balancer или где-то баг? Если первое, то он не очень удачный, потому что в итоге загрузка идёт на 75% (первый MT5+2 агента) и всё же это скорее должно рулиться приоритетами винды.

P.S. Похоже, не обязательно связано с загрузкой процессоров. Только что после ребута запустил только генетику, больше вообще ничего не запущено, тоже 2 агента филонили, пока их не отключил-включил. Если активными держать только 3 агента, 1 отключить вообще, то всё равно 2 филонят, работает только 1.

P.P.S. Если процессоров 6, то филонят уже 3.
 

Билд 2280. Отлаживал индикатор, в отладчике пошагово выполнял. На строчке

StartTime = iTime(Symbols[0], _Period, Pos + PosAddon);

упала отладка. Что-то вроде критическая ошибка, отладка остановлена. В лог отписало

           crash -->  000000B7250C38B1 038424B8000000    add        eax, [rsp+0xb8]
                      000000B7250C38B8 89442460          mov        [rsp+0x60], eax
                      000000B7250C38BC 448B4C2460        mov        r9d, [rsp+0x60]
                      000000B7250C38C1 49B8010000000000  mov        r8, 0x1
                                       0000
                      000000B7250C38CB 488B542468        mov        rdx, [rsp+0x68]
                      000000B7250C38D0 48B9E8DD4220B700  mov        rcx, 0xb72042dde8
                                       0000
                      000000B7250C38DA 49FF96580F0000    call       qword near [r14+0xf58]  ; #11037 (terminal64.exe)
        
        00: 0x000000B7250C38B1

Повторяется, но редко. С чем связано, неизвестно, ничего не менялось особо между отладками.

 

Билд 2280. Биржа, срочный рынок. Вся история загружена, но тесты проводятся в оффлайне. iBarShift как-то странно работает в индикаторах. Причём этот же код нормально работает в скрипте. Баг или я что просмотрел?

#property indicator_separate_window

void OnInit()
{
  datetime Time[];
  ArraySetAsSeries(Time, true);
  CopyTime(_Symbol,_Period,0,1,Time);

  int Shift=iBarShift(_Symbol,_Period,Time[0]);
  Print("Symbol="+_Symbol+", Shift="+(string)Shift);

  for(int i=0;i!=SymbolsTotal(true);++i)
  {
    const string SymbName=SymbolName(i,true);
    Shift=iBarShift(SymbName,_Period,Time[0]);
    Print("Symbol="+SymbName+", Shift="+(string)Shift);
  }
}

int OnCalculate(const int rates_total,const int prev_calculated,const datetime& time[],const double& open[],const double& high[],
  const double& low[],const double& close[],const long& tick_volume[],const long& volume[],const int& spread[])
{
  return 0;
}

Есть такой код. По сути он проходит по всем символам из обзора рынка и дёргает iBarShift. В скрипте точно этот же код отрабатывает нормально. В индикаторе выдаёт для всех символов, кроме текущего (на графике которого запущен), -1 с ошибкой, что нет истории. Причём на втором прогоне он, видимо, историю подгружает и уже показывает нормально.

 
traveller00:

этот же код нормально работает в скрипте. Баг или я что просмотрел?

В отличие от скрипта, индикатор работает асинхронно - не ожидает готовности истории.

 
fxsaber:

В отличие от скрипта, индикатор работает асинхронно - не ожидает готовности истории.

Дык вся история же есть. Как я говорил, он работает в оффлайне, вся история уже загружена с сервера. Или ему что-то ещё нужно?

 
traveller00:

Дык вся история же есть. Как я говорил, он работает в оффлайне, вся история уже загружена с сервера. Или ему что-то ещё нужно?

В теории, конечно, нужно из холодного старта все поднять. На практике же не увлекался индикаторами, поэтому точно не возьмусь утверждать.