Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 561

 
Ihor Herasko:

Просто:

выдает ошибку

 
Aleksandr Lishchenko:

выдает ошибку

Где выдает ошибку? Какую выдает ошибку?

 

Здравствуйте. Есть задача проверить входной параметр торгового объема, заданный пользователем, на корректность, а точнее заданный лот должен быть кратен шагу изменения лота. Для этого нахожу вещественный остаток от деления и сравниваю его с нулевым значением или значением очень близким к нулю (например 0,000000001) 

void OnStart()
{
   double volume = 0.03;
   Alert("Результат деления ", volume/MarketInfo(Symbol(), MODE_LOTSTEP));
   Alert("Шаг изменения лота ", MarketInfo(Symbol(), MODE_LOTSTEP));
   Alert("Вешественный остаток ", fmod(volume, MarketInfo(Symbol(), MODE_LOTSTEP)));
}

Результат:

/*
   Вещественный остаток 0,009999999999999998
   Шаг изменения лота 0,01
   Результат деления 3,0
*/

Также приложил скриншет. 

По моему в остатке должен быть ноль или очень маленькое число, но получается почему-то практически 0,01? Как тогда проверить входной параметр, если например пользователь ошибочно задаст 0,001?

Файлы:
4npm6qh.png  8 kb
 
Aleksandr Teleguz:

Здравствуйте. Есть задача проверить входной параметр торгового объема, заданный пользователем, на корректность, а точнее заданный лот должен быть кратен шагу изменения лота. Для этого нахожу вещественный остаток от деления и сравниваю его с нулевым значением или значением очень близким к нулю (например 0,000000001) 

Результат:

Также приложил скриншет. 

По моему в остатке должен быть ноль или очень маленькое число, но получается почему-то практически 0,01? Как тогда проверить входной параметр, если например пользователь ошибочно задаст 0,001?

Немного не так. Первым делом нужно вычислить ближайшее корректное значение (на основании заданной величины), а уже потом проверить разность полученных величин. Если она равна нулю (или не более, чем DBL_EPSILON), то все ОК:

void OnStart()
{
   double volume = 0.03;

   double fVolumeMin = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MIN);   
   double fVolumeMax = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_MAX);   
   double fVolumeStep = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP); 

   double fNearestCorrectVolume = VolumeCast(volume, fVolumeMin, fVolumeMax, fVolumeStep);
   if (fabs(fNearestCorrectVolume - volume) > DBL_EPSILON)
      Alert("Ошибка");
   else
      Alert("Все ОК");
}

Функцию VolumeCast можно взять отсюда.

 
Ihor Herasko:

Где выдает ошибку? Какую выдает ошибку?

1 error(s), 0 warning(s) 2 1
'if' - expressions are not allowed on a global

 

Добрый день!

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

Большое Вам спасибо.

 
Aleksandr Lishchenko:

Добрый день!

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

Большое Вам спасибо.

Вам уже подсказали код.

Ошибку вы сами внесли - вам же написано в описании ошибки, что вы внесли код в область глобальных переменных, а не внутрь OnTick() или OnInit():

'if' - expressions are not allowed on a global scope

И с такими знаниями вы ещё и пытаетесь от кого-то защищать ваш код?
 
Artyom Trishkin:

Вам уже подсказали код.

Ошибку вы сами внесли - вам же написано в описании ошибки, что вы внесли код в область глобальных переменных, а не внутрь OnTick() или OnInit():

'if' - expressions are not allowed on a global scope

И с такими знаниями вы ещё и пытаетесь от кого-то защищать ваш код?

Я только учусь!

Не суди строго! ;)

 
Aleksandr Lishchenko:

1 error(s), 0 warning(s) 2 1
'if' - expressions are not allowed on a global

Покажите, как применили код. Неужто просто скопировали то, что я написал?

 
Ihor Herasko:

Покажите, как применили код. Неужто просто скопировали то, что я написал?

так и сделал :)))

Причина обращения: