Помогите вникнуть в ошибку 131

 

До сих пор я мыслил так:

Если 131, значит нехватка средств не при чем, на этот случай есть 134.

Стало быть, "неправильный объем" может быть по трем причинам:

1. Объем сделки меньше минимального лота.

2. Объем сделки больше максимального лота.

3. Объем сделки не соответствует шагу изменения лота.

Вопрос к знатокам: а не ошибался ли я? Не существует ли еще каких-то других причин ошибки 131?

И еще я думал, что если тестирование происходит без подключения к торговому счету,

то Marketinfo() все равно работает, просто возвращает дефаулты.

Но тогда второй вопрос: а откуда эти дефаулты берутся?

Могут ли они оказаться несуразными, типа максимальный лот меньше минимального,

или шаг лота какой-нибудь дикий?

И еще в догонку вопрос: а видал ли кто-то, чтобы шаг лота был больше минимального лота?

 
Dmitriy Susloparov:
 

...

И еще в догонку вопрос: а видал ли кто-то, чтобы шаг лота был больше минимального лота?

Не встречал такого ни разу. Чаще всего шаг равен минимальному объему, иногда шаг меньше. Например, минимум 0.05 с шагом 0.01.

 
Vladimir:

Не встречал такого ни разу. Чаще всего шаг равен минимальному объему, иногда шаг меньше. Например, минимум 0.05 с шагом 0.01.


Ну почему же? Лет 10 назад у Alpari был минлот 0.1, а шаг 0.25. Это нормально. Сейчас, может быть и нет ни у кого, но вовсе не означает, что не будет в будущем.

Поэтому ответ топикстартеру в принципе однозначный - указан некорректный объем, до проверки достаточности средств дело еще не дошло.

 

Жаль, что никто не смог придумать других причин ошибки 131.

Тогда объясните, в чем разница между:

MarketInfo(NULL,MODE_MINLOT);  MarketInfo(NULL,MODE_MAXLOT); MarketInfo(NULL,MODE_LOTSTEP)

и 

SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)

Как правильнее?

(В обоих случаях речь идет о текущем символе.)

И рассказали бы знатоки, как можно изменить дефолтную спецификацию символа, для тестирования без подключения к счету?

 
Dmitriy Susloparov:

Жаль, что никто не смог придумать других причин ошибки 131.

Тогда объясните, в чем разница между:

MarketInfo(NULL,MODE_MINLOT);  MarketInfo(NULL,MODE_MAXLOT); MarketInfo(NULL,MODE_LOTSTEP)

и 

SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)

Как правильнее?

(В обоих случаях речь идет о текущем символе.)

И рассказали бы знатоки, как можно изменить дефолтную спецификацию символа, для тестирования без подключения к счету?

MarketInfo функции старого образца, SymbolInfo... - нового образца, работают как в mql4, так и в mql5

Используйте SymbolInfo..., будет проще переезд на mql5

 
Dmitriy Susloparov:

Жаль, что никто не смог придумать других причин ошибки 131.

Тогда объясните, в чем разница между:

MarketInfo(NULL,MODE_MINLOT);  MarketInfo(NULL,MODE_MAXLOT); MarketInfo(NULL,MODE_LOTSTEP)

и 

SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX); SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)

Как правильнее?

(В обоих случаях речь идет о текущем символе.)

И рассказали бы знатоки, как можно изменить дефолтную спецификацию символа, для тестирования без подключения к счету?

Почитай тут.

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • 2016.07.19
  • MetaQuotes Software Corp.
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку для обеспечения единого стандарта качества. В этой статье мы расскажем о наиболее частых ошибках, которые допускают разработчики в своих технических индикаторах и торговых роботах. А также покажем как самостоятельно проверить свой продукт перед отправкой в Маркет.
 
Alexey Viktorov:

Почитай тут.

В том то и дело, что "тут" я давно почитал.

Более того, научился вставлять в советники такой код, чтобы объемы сделок не выходили за границы

и были бы кратными шагу. Разве что пользовался я Marketinfo(), а не SymbolInfoDouble().

Понимаете, я признаю, что если у разработчика продукт работает без ошибок, а у модератора - с ошибками,

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

Но как проверять продукты не хуже модератора, в "тут" не написано.

Я теперь понял, что для полноценной проверки необходимо иметь возможность задавать произвольные

значения в спецификации символа. А это вовсе не "тут".

 
Dmitriy Susloparov:

В том то и дело, что "тут" я давно почитал.

Более того, научился вставлять в советники такой код, чтобы объемы сделок не выходили за границы

и были бы кратными шагу. Разве что пользовался я Marketinfo(), а не SymbolInfoDouble().

Понимаете, я признаю, что если у разработчика продукт работает без ошибок, а у модератора - с ошибками,

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

Но как проверять продукты не хуже модератора, в "тут" не написано.

Я теперь понял, что для полноценной проверки необходимо иметь возможность задавать произвольные

значения в спецификации символа. А это вовсе не "тут".

Там пример функции в которой ясно видно, что простой нормализации недостаточно. И какую-бы функцию не использовали, Marketinfo() или SymbolInfoDouble() результат - ошибка...

 
Dmitriy Susloparov:

Я теперь понял, что для полноценной проверки необходимо иметь возможность задавать произвольные

значения в спецификации символа. А это вовсе не "тут".


Сделайте проще: прогоните в цикле значения от -DBL_MAX до DBL_MAX, передавая их в свою функцию, которая занимается корректированием значения объема. Тогда и увидите, в чем проблема. Ну или покажите эту функцию здесь. Возможно, сможем указать на изъян.

 
Alexey Viktorov:

Там пример функции в которой ясно видно, что простой нормализации недостаточно. И какую-бы функцию не использовали, Marketinfo() или SymbolInfoDouble() результат - ошибка...

А разве я говорил о нормализации?

Идем к началу ветки: есть три причины ошибки 131: меньше минимума, больше максимума, нет кратности шагу.

Четвертой причины видимо, нет. Минимум - максимум проверить просто? Ну вроде бы, да.

А кратность что ли трудно проверить? Или Вы думаете, я пишу "кратность", а сам вместо этого делаю нормализацию?

Признаться, я не делаю как в "тут", а делаю вот так:

if (fmod(Lots, Step) == 0) { -- блок кода, выставляющий ордер --   }

Это я как-то неправильно проверяю кратность что ли?

 
Ihor Herasko:

Сделайте проще: прогоните в цикле значения от -DBL_MAX до DBL_MAX, передавая их в свою функцию, которая занимается корректированием значения объема. Тогда и увидите, в чем проблема. Ну или покажите эту функцию здесь. Возможно, сможем указать на изъян.

А еще проще, но главное - надежнее было бы погонять весь советник на различных спецификациях символа.

В MT5 есть такая фишка - можно создать собственный символ, а в MT4 - нет.

Но как-то же программисты MT4 выкручиваются?