Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1152

 
SEM:

Что должна возвращать функция?

Print(SYMBOL_POINT);

для EURUSD у меня возвращает 16, по идее должно 0,00001

а  Print(SymbolInfoDouble(Symbol(),SYMBOL_POINT));

возвращает    9.999999999999996e-06

https://www.mql5.com/ru/docs/convert/doubletostring

Документация по MQL5: Преобразование данных / DoubleToString
Документация по MQL5: Преобразование данных / DoubleToString
  • www.mql5.com
[in]  Формат точности. Если значение digits лежит в диапазоне от 0 до 16, то будет получено строковое представление числа с указанным количество знаков после запятой. Если значение digits лежит в диапазоне от -1 до -16, то...
 
как получить Значение одного пункта для EURUSD? У меня получается 16, вместо 0,00001
 
SEM:
как получить Значение одного пункта для EURUSD? У меня получается 16, вместо 0,00001

А вы что именно распечатываете?

SYMBOL_POINT - это предопределённая константа. Т.е., вы распечатываете числовое значение константы.

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Для получения текущей рыночной информации служат функции SymbolInfoInteger(), SymbolInfoDouble() и SymbolInfoString(). В качестве второго параметра этих функций допустимо передавать один из идентификаторов из перечислений ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE и ENUM_SYMBOL_INFO_STRING соответственно. Некоторые символы (как...
 
Artyom Trishkin:

А вы что именно распечатываете?

Пытаюсь нормализовать TakeProfit для Sell, получается TP = -130

 int TakeProfit=100;//Profit

double _PriceCurrent_TakeProfit = NormalizeDouble(m_position.PriceOpen()-(TakeProfit*SYMBOL_POINT),SYMBOL_DIGITS) ;
 
SEM:

Пытаюсь нормализовать TakeProfit для Sell

SYMBOL_DIGITS - это тоже константа. Она НЕ возвращает значения "количество знаков после запятой в котировке символа". Она указывает функции SymbolInfoInteger() какое значение целочисленного свойства символа необходимо вернуть.
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Для получения текущей рыночной информации служат функции SymbolInfoInteger(), SymbolInfoDouble() и SymbolInfoString(). В качестве второго параметра этих функций допустимо передавать один из идентификаторов из перечислений ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE и ENUM_SYMBOL_INFO_STRING соответственно. Некоторые символы (как...
 
Artyom Trishkin:
SYMBOL_DIGITS - это тоже константа. Она НЕ возвращает значения " количество знаков после запятой в котировке символа". Она указывает функции SymbolInfoInteger() какое значение целочисленного свойства символа необходимо вернуть.

Хорошо, тогда как нормализовать ТП для Sell?

  Print(NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_POINT),(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS)));

тоже возвращает непонятно что = (EURUSD,M15)    1e-05
 

 
SEM:

Хорошо, тогда как нормализовать ТП для Sell?

тоже возвращает непонятно что = (EURUSD,M15)    1e-05
 

1е-05 это единица в минус пятой степени, то-есть 0.00001. Чему вас учили в старших классах школы???

 
SEM:

Хорошо, тогда как нормализовать ТП для Sell?

тоже возвращает непонятно что = (EURUSD,M15)    1e-05
 

Для робота вы нормализовали.

Для вывода в принты нужно использовать DoubleToString

 Print(DoubleToString(SymbolInfoDouble(Symbol(),SYMBOL_POINT),(int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS)));
 
Vitaly Muzichenko:

Для робота вы нормализовали.

Для вывода в принты нужно использовать DoubleToString

Спасибо за помощь! В итоге:

double _SYMBOL_POINT_ = SymbolInfoDouble(Symbol(),SYMBOL_POINT);
int _SYMBOL_DIGITS_   = (int)SymbolInfoInteger(Symbol(),SYMBOL_DIGITS);


{
  double _PriceCurrent_TakeProfit =NormalizeDouble(m_position.PriceOpen()-(TakeProfit*_SYMBOL_POINT_),_SYMBOL_DIGITS_) ;
  double _PriceCurrent=NormalizeDouble(m_position.PriceCurrent()-(TakeProfit*_SYMBOL_POINT_),_SYMBOL_DIGITS_);
}
 
Franklins100:

Это идея, но перекрестное тестирование не даст точных результатов, на мой взгляд. Тестирование, опять таки на мой неопытный взгляд, должно проводится в конечном, цельном варианте. И тут сразу вопрос - как и благодаря каким параметрам компьютера можно максимально ускорить тестирование, не прибегая к использованию сторонних мощностей. GPU или CPU?

Перекрёстное тестирование даёт такойже точный результат как и прямое. Если понимать все переменные то при разбивке на группы указываете приемлемый шаг для переменных. Потом по итогу прогонов тестов в зависимости от картинки 3Д по результатам можно выделить одну или несколько групп значений для кагдой группы переменных. И в итоге запускаете полный тест но уже с узким разбросом и высокой дискретностью параметров.

Я так прогоняю один советник каждую субботу. Более 300 переменных. В течении дня прогоняю перекрёстные тесты. И на ночь ставлю основной. В воскресенье уже результат анализирую. Смотрю что изменилось по сравнению с набором прошлой недели. Ну и там уже по ситуации иногда доп тесты врубаю. Всё кручу на двух компах.

В итоге уходит гдето 30 машино часов. Если на прямую врубать то думаю комп бы завис :) недели на две. Тут уж хощ ни хош выкручиваешся как можеш.

На скорость тестов влияет ядерность процессора (для мт5 точно).

На самые первые тесты ушло много времени. Теперь тока прогоняю последнюю неделю. Думаю у каждого советника свои премудрости. Я просто ввёл коэфициенты и основные параметры меняются очень редко. Получается что идёт подстройка под волантильность в основном. Плюсом серьёзный новостной модуль с индивидуальной разбивкой по типам новостей а не тупо три звезды :) Вообще думаю "новости" это самое слабое место у всех советников торговых. А ещё же есть периоды "смена контрактов", "опционные экспирации". С ними тоже работать есть резон.