Новая версия платформы MetaTrader 5 build 2085: Интеграция с Python и массовые улучшения в тестере стратегий - страница 40

 
fxsaber:
Что вы хотели этим сказать?  Здесь как-раз компилятор выдал бы предупреждение.  А вот после вашего кастинга он уже ничего не сможет выдать.
 
Alexey Navoykov:
Задача перегрузок - именно в том, чтобы избежать явных преобразований.  Вообще явными приведениями лучше не злоупотреблять, они то как-раз и таят в себе источник трудноуловимых ошибок.

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

 
Alexey Navoykov:
Что вы хотели этим сказать?  Здесь как-раз компилятор выдал бы предупреждение.  А вот после вашего кастинга он уже ничего не сможет выдать.

Чтобы не затевать бессмысленную дискуссию, выскажу просто свое мнение по этому поводу: мне нравится текущая реакция компилятора. И не будет нравиться, если ее изменят.

 
Edgar:

Работая над автоматизацией оптимизации и Frame-режимом понял, что к функции ParameterSetRange очень нужны функции int ParametersTotal() и string GetParameterName(int index) для перебора параметров.

Кроме того, нужна возможность определить, строковая или числовая переменная. Для строковой не работает ParameterGetRange()

 

ParameterGetRange в случае ошибки всегда возвращает код ошибки 0. Попробовал на строковом параметре.

Костыльным способом строковую переменную можно распознать, читая из set-файла. Если там "ИМЯ=" или "ИМЯ=СТРОКА". Но если в строке число, уже не отличить.

 
Edgar:

В этом коде добавьте

      else
        Str += "\n" + Names[i] + " = " + Params[i + 1].string_value;


напичкайте всяких input-переменных и запустите.

 
fxsaber:

В этом коде добавьте


напичкайте всяких input-переменных и запустите.

Спасибо. Суть этого кода как ответа для моего случая - если ParameterGetRange возвращает false, считаем это строковой переменной, то есть не делаем обработку ошибок. Так и я же об этом - приходится пока делать так. Но ParameterGetRange должен по документации возвращать код ошибки, но его нет. Это баг. Пока я могу придумать две ошибки: строковая переменная и неверное имя переменной. Имя можно проконтролировать из set-файла (костыль, хоть и необязательный к применению).

Факт остаётся: баг в ParameterGetRange, хоть и не фатальный.

 
В этом коде возврат нуля всегда обозначает string, т.к. имена входных передаются правильно.
 
fxsaber:
В этом коде возврат нуля всегда обозначает string, т.к. имена входных передаются правильно.

ОК. У меня Ваша библиотека Expert была в планах, но пришлось поковыряться внепланово, сейчас. Вы мастер обходить проблемы MQL, именно поэтому, если я использую либы, они практически все Ваши. Теперь и эта.

Напоследок всё же скажу, что хочется исправления багов, и добавления указанных ранее функций, чтобы не нужны были дополнительные костыли.

 

Проблема:  MQL Cloud Network  не позволяет проводить оптимизацию эксперта, использующего импортированные функции, вызываемые из OnTesterInit, OnTesterDeinit или OnTesterPass:

#import "user32.dll"
 int SendMessageA(long,int,int,int);
#import

input int Param;

void OnTesterInit()  { SendMessageA(0, 0, 0, 0); }

void OnTesterDeinit() { }

double OnTester() { return 0; }

В логе получаем:

2019.08.13 02:41:56.058 Tester imported DLL "user32.dll" not allowed in Cloud Network

Данные функции вызываются только на локальной машине, это не имеет отношения к облаку.  Поэтому запрет здесь совершенно напрасный.