Новая версия платформы MetaTrader 5 build 5660: улучшения и исправления - страница 20

 
Aleksei Kuznetsov # :
Хотели проверить, но видимо забыли https://www.mql5.com/ru/forum/1111/page3690#comment_58774387
Об этом уже сообщили в MetaQuotes.
 
Возможно "фолдинги" это действительно "до фига делов". А если добавить директивы #region и #endregion(для свертывания/развёртывания выбранного кода между ними) возможно таким способом этот "эффект" будет проще сделать. Да и противники "фолдинга" не пострадают(они просто могут не использовать эти директивы в своем коде). )
 

Не знаю, где спросить, поэтому извиняюсь за оффтоп.

Генетическая оптимизация, если в неё вмешаться неправильно, то результат получим либо хуже, либо дольше ждать придётся.

Поэтому спрашиваю, как обработать такую ситуацию. Допустим, есть два параметра в настройках, назовём Х и У.

Мы эти оба параметра оптимизируем так: стартовое значение 1, шаг 1, конечное значение 10. 

Лучшие результаты по пользовательскому критерию оптимизации получаются, когда и Х, и У больше пяти, но мне эти результаты не нужны. Мне нужно, чтоб либо Х, либо У был меньше 5.

Если я в OnInit() сделаю проверку типа «если Х и У больше 5, то...», а вот и сам вопрос: как правильнее сделать?

1. Вернуть INIT_FAILED прям там, в OnInit().

2. Вернуть INIT_FAILED прям там, в OnInit(), а потом в OnTester() ещё сильнее усилить негатив этого теста и вернуть -DBL_MAX.

3. Не прерывать проход в OnInit(), а просто в OnTester() вернуть -DBL_MAX.

Или все варианты не айс и нужно как-то по-другому.

 
Aleksandr Slavskii #:

Если я в OnInit() сделаю проверку типа «если Х и У больше 5, то...», а вот и сам вопрос: как правильнее сделать?

1. Вернуть INIT_FAILED прям там, в OnInit().

2. Вернуть INIT_FAILED прям там, в OnInit(), а потом в OnTester() ещё сильнее усилить негатив этого теста и вернуть -DBL_MAX.

3. Не прерывать проход в OnInit(), а просто в OnTester() вернуть -DBL_MAX.

INIT_PARAMETERS_INCORRECT

Агенты не будут этот набор входных больше трогать, и алгоритм ГА не будет сбиваться из-за левых значений критерия.

 
fxsaber #:
NIT_PARAMETERS_INCORRECT
Точно, это оно самое. Спасибо.
 
Vladislav Boyko # :

Результат выполнения зависит от того, была ли открыта вкладка inputs при запуске скрипта. Настройки дефолтные.

  • Вкладка inputs не была открыта

  • Вкладка inputs была открыта

Исправлено в сборке 5742. Ввод можно использовать только в глобальном пространстве.

 
Stanislav Korotky # :

Почему вызов:

отрабатывает, как запрашивается, то есть цены идут по строкам [N][4], а вот такой вызов:

дает неправильный результат - цены по столбцам [1][N], где N - количество баров . Ожидалась матрица [N][1].

В справке написана фраза о том, что флаг COPY_RATES_VERTICAL применим только к запросу цен из матрицы. Ну так я и вызываю из матрицы, а не вектора.

Считаю, это баг.

Исправлено в сборке 5742.
 
fxsaber # :
b5699, повтор просьбы.
Исправлено в сборке 5743.
 

b5739
Анализировал логи с сделками в MТ тестере и обнаружил дни двойных свопов.

Двойной своп был взят за сделку с 2 на 3 января 2024 (вторник на среду). Есть зависимость от даты начала теста.

Тестовый эксперт. ДЦ - MQ demo. EURUSD. Реальные тики.

input datetime openTime    = D'2024.01.02 17:37:15';
input datetime closeTime   = D'2024.01.03 11:44:49';
input ENUM_ORDER_TYPE otype = 0;
input double lot = 1;
#include <Trade\Trade.mqh>
CTrade ExtTrade;
void OnTick(void){
   static MqlTick Tick; static bool opened=false, closed=false;
   if (!SymbolInfoTick(_Symbol, Tick)){ return;}
   if(!opened && Tick.time>=openTime ){opened=true; ExtTrade.PositionOpen(_Symbol,otype,lot,(otype==ORDER_TYPE_SELL ? Tick.bid:Tick.ask),0,0);}
   if(!closed && Tick.time>=closeTime){closed=true; ExtTrade.PositionClose(_Symbol);}
}

Сецификация

Запуск теста с 2023.12.20

Взято 2 свопа по -0.7

Запуск тестрера с 2023.12.31 или с 1 января 2024


Взят 1 своп

Так как есть зависимость от даты старта теста, очевидно, что это баг.

 

Эксперт тот же, меняем только даты (см в коде)

input datetime openTime    = D'2022.12.28 11:03:13';
input datetime closeTime   = D'2023.01.03 01:01:04';
input ENUM_ORDER_TYPE otype = 0;
input double lot = 1;
#include <Trade\Trade.mqh>
CTrade ExtTrade;
void OnTick(void){
   static MqlTick Tick; static bool opened=false, closed=false;
   if (!SymbolInfoTick(_Symbol, Tick)){ return;}
   if(!opened && Tick.time>=openTime ){opened=true; ExtTrade.PositionOpen(_Symbol,otype,lot,(otype==ORDER_TYPE_SELL ? Tick.bid:Tick.ask),0,0);}
   if(!closed && Tick.time>=closeTime){closed=true; ExtTrade.PositionClose(_Symbol);}
}

EURUSD

Взято 6 свопов. Правильно.

Меняем символ на XAUUSD


Тестируем с теми же датами

Взято 5 свопов. -4.6*5=-23
Почему не 6 как для EURUSD? Баг?

У вас прописаны разные алгоритмы расчета свопов для разных символов? Результаты простейшей функции на складывание!!! чисел отличаются. Видимо их 2 - одна с багом, другая без. Там ИИ что ли кодил, не понимая простейшую логику?