Новая версия платформы MetaTrader 5 build 2280 - страница 29

 
fxsaber:

Надо сравнивать синие. Там видно, что OnTimer почти в четыре раза дольше Timer.

Именно в этом и вопрос.

ОнТаймер, внутри которого нет ничего, кроме вызова Таймер, занял в 3 раза больше процессорного времени, чем сам Таймер.


Обычная картинка в таких случаях: две одинаковые синие полоски (иногда на долю процента отличающиеся). А тут — такое!

Оверхед на вызов функции быть должен (если компилятор не смог его (вызов) развернуть), но он никак не может быть 200% (от и так достаточно весомой функции, т.е. это не погрешность на измерении пустышки).

 
Edgar Akhmadeev:


4. Только локальные агенты. А что именно из их логов? Они же бесконечные.

Логи оптимизации бесконечные? В OnInit много информации выводите?

Интерсно посмотреть логи на старте агента, а также логи агента от начала до конца одной оптимизации. Как с фреймами, так и без

 
Edgar Akhmadeev:

Вот структура тестерных функций, касающихся фреймов. OnTesterPass() отсутствует.

У Вас есть отличие в вариантах с фреймами и без. Попробуйте вызывать GetStatData в любом случае

double OnTester()
  {
   double sortino, TSSF, R, Weekly;
   double rc = OnTesterEvent(sortino, TSSF, R, Weekly);

   double stat_data[];
   GetStatData(stat_data, rc, sortino, TSSF, R, Weekly);

   if(Framed)
      FrameAdd("", 0, rc, stat_data);

   return rc;
  }

И сравните время.

 
Andrey Khatimlianskii:

Именно в этом и вопрос.

ОнТаймер, внутри которого нет ничего, кроме вызова Таймер, занял в 3 раза больше процессорного времени, чем сам Таймер.


Обычная картинка в таких случаях: две одинаковые синие полоски (иногда на долю процента отличающиеся). А тут — такое!

Оверхед на вызов функции быть должен (если компилятор не смог его (вызов) развернуть), но он никак не может быть 200% (от и так достаточно весомой функции, т.е. это не погрешность на измерении пустышки).

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

Пока могу сказать следующее, в текущей версии профилировщика MQL5 кода, измерительный инструмент вносит погрешности, и чем меньше код функции, тем больше погрешность.
К сожалению, не видно, какого размера функция Timer, возможно, она настолько мала, что время измерения сопоставимо с временем полезной работы.
Мы знаем как можно уменьшить влияние инструмента измерения, но это принципиально другой способ профилировки, который будем тестировать/реализовывать во второй половине этого года.

 
Ilyas:

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

Пока могу сказать следующее, в текущей версии профилировщика MQL5 кода, измерительный инструмент вносит погрешности, и чем меньше код функции, тем больше погрешность.
К сожалению, не видно, какого размера функция Timer, возможно, она настолько мала, что время измерения сопоставимо с временем полезной работы.
Мы знаем как можно уменьшить влияние инструмента измерения, но это принципиально другой способ профилировки, который будем тестировать/реализовывать во второй половине этого года.

Иляс, спасибо за ответ.

В том то и дело, что функция Таймер достаточно "толстая", и занимала львиную долю времени тестирования (потому что тест по ценам открытия М1, а таймер ежесекундный).
О погрешности я сразу написал, на нее не похоже. Но сейчас не хочется готовить код для воспроизведения, есть более приоритетные задачи.

Может, этот эффект проявится при любом тесте по ценам открытия с заведомо более частым таймером?
В любом случае, не думаю, что это стоит такого внимания.

 
Slava:


Выяснил, что при самостоятельном запуске советника с фреймами замедления в новых билдах не происходит. Оно происходит только при запуске моим оптимизатором (в основе - кликер из fxsaber MultiTester) только советника в режиме фреймов только под новыми билдами.

Это требует осмысления.

 
Edgar Akhmadeev:

Выяснил, что при самостоятельном запуске советника с фреймами замедления в новых билдах не происходит. Оно происходит только при запуске моим оптимизатором (в основе - кликер из fxsaber MultiTester) только советника в режиме фреймов только под новыми билдами.

Это требует осмысления.

Билд 2307 - всё нормализовалось.

Интересно, что-то нашли связанное, или это был побочный эффект?


UPD: Рано обрадовался. При тестировании на тиках всё вернулось. В 2307 время прохода независимо от включения фреймов растёт с 1:20 до 12:50. При этом 2 агента из 8 работают с нормальной скоростью. Случайные 2 (кто первый захватит ресурсы?). RAM занята на 68%, SDD на 0%.

На 2286 все агенты работают с одинаковой скоростью, и одинаково замедляются при включении доп. агентов. Резкое падение скорости происходит при включении более 5 агентов. Так было всегда при длине тиковой истории 4 года. Очень большие временные файлы создаются и постоянно пересоздаются. Одинаковые для всех агентов.

Я понимаю, что без воспроизводимого примера проблему не решить, но у меня связка из двух советников (контроллер оптимизации и фреймовый советник) - большой проект из десятков файлов с объёмом кода под мегабайт. Так что пока не знаю, что делать. Продолжу работать под 2286, а в редкое свободное время попытаюсь разбираться.

 

Service, пишет что скрипт.


OnInit function is useless for scripts asdx.mq5

OnDeinit function is useless for scripts asdx.mq5

Эти функции в сервисе, походу как я понял, не будут работать.
 
BillionerClub:

Service, пишет что скрипт.


OnInit function is useless for scripts asdx.mq5

OnDeinit function is useless for scripts asdx.mq5

Эти функции в сервисе, походу как я понял, не будут работать.

Не будут:

Тип

Имя функции

Параметры

Применение

Примечание

int

OnInit

нет

эксперты и индикаторы

Обработчик события Init. Допускается тип возвращаемого значения void.

void

OnDeinit

const int reason

эксперты и индикаторы

Обработчик события Deinit.

void

OnStart

нет

скрипты и сервисы

Обработчик события Start.

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 &TickVolume[],

const long &Volume[],

const int &Spread[]

индикаторы

Обработчик события Calculate на всех ценовых данных.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const int begin,

const double &price[]

индикаторы

Обработчик события Calculate на одном массиве данных.

В индикаторе не может одновременно присутствовать 2 обработчика Calculate. В этом случае будет работать только обработчик события Calculate на одном массиве данных.

void

OnTick

нет

эксперты

Обработчик события NewTick. Пока идет обработка события прихода нового тика другие события этого типа не приходят.

void

OnTimer

нет

эксперты и индикаторы

Обработчик события Timer.

void

OnTrade

нет

эксперты

Обработчик события Trade.

double

OnTester

нет

эксперты

Обработчики события Tester

void

OnChartEvent

const int id,

const long &lparam,

const double &dparam,

const string &sparam

эксперты и индикаторы

Обработчик события ChartEvent.

void

OnBookEvent

const string &symbol_name

эксперты и индикаторы

Обработчик события BookEvent.


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Каждый скрипт, сервис и эксперт работает в собственном отдельном потоке. Все индикаторы, рассчитываемые на одном символе, даже если они запущены на разных графиках, работают в одном потоке. Таким образом, все индикаторы на одном символе делят между собой ресурсы одного потока. В одном потоке с индикаторами также последовательно выполняются...
 

Открывашка, Билд 2280, реальный счет (FORTS)

2020.01.29 10:00:04.967 Trades  'ххххх': failed cancel order #116281762 sell limit 1.00 FEES-6.20 at 24749 [Modification failed due to order or position being close to market]

Как понимать эту ошибку?

Что значит "слишком близко к рынку", если ордер удаляется?

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
, то позиции по каждому символу разрешается закрывать только в том порядке, в котором они были открыты — сначала самую старую, затем более новую и т.д. При попытке закрыть позиции в ином порядке будет получена ошибка. Уровень залоговых средств, при достижении которого происходит принудительное закрытие самой убыточной позиции (Stop Out...
Причина обращения: