Скачать MetaTrader 5

Метод проверки вводимого input параметра

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Karputov
Модератор
49268
Vladimir Karputov 2014.04.12 22:45 

Из справки:

Изменять значение переменной с модификатором input внутри mql5-программы нельзя, такие переменные доступны только для чтения. Изменять значения input-переменных может только пользователь из окна свойств программы.

А теперь такая ситуация. Допустим есть input с типом uchar (минимальное значение равно нулю, максимальное значение равно 255):

input uchar    uchar_seconds=12;

Вопрос: как организовать проверку значения, которое ввел пользователь?

 

В случае с переменной типа  uchar (минимальное значение равно нулю, максимальное значение равно 255) в поле ввода отрицательные значения ввести невозможно. Это уже хорошо. Но вот значение большее 255 в поле ввода вводится спокойно. Правда после этого, если вывести Print'ом, то значение нашей переменой uchar_seconds будет от 0 до 255.

Что хочется:

  • дать механизм проверки в поле ввода
  • если введенное значение выходит за границу значений (в данном случае, если пользователь ввел значение большее 255), то переменной должно быть присвоено значение по умолчанию. Т.е. если пользователь ввел для переменной uchar_seconds значение равное 300, то uchar_seconds должно быть автоматически присвоено значение по умолчанию, равное 12.

Artem Temnikov
1031
Artem Temnikov 2014.04.13 03:24  
barabashkakvn:

Из справки:

А теперь такая ситуация. Допустим есть input с типом uchar (минимальное значение равно нулю, максимальное значение равно 255):

Вопрос: как организовать проверку значения, которое ввел пользователь?

При помощи типа uchar будет невозможно отследить ввод пользователем числа, превышающего 255.

И острой необходимости использовать для input-переменных типа uchar тоже нет.

Попробуйте тип int.

От ввода отрицательного значения можно подстраховаться функцией  MathAbs().

От переполнения тоже легко - простой проверкой. 

 Или так:

  input int int_seconds=12;     //seconds (0...255)
  const uchar uchar_seconds=uchar((MathAbs(int_seconds)>255)?12:MathAbs(int_seconds));
Vladimir Karputov
Модератор
49268
Vladimir Karputov 2014.04.13 05:39  
Fleder:

При помощи типа uchar будет невозможно отследить ввод пользователем числа, превышающего 255.

И острой необходимости использовать для input-переменных типа uchar тоже нет.

Попробуйте тип int.

От ввода отрицательного значения можно подстраховаться функцией  MathAbs().

От переполнения тоже легко - простой проверкой. 

 Или так:

Спасибо, хорошая идея.
Vladimir Karputov
Модератор
49268
Vladimir Karputov 2014.04.13 12:20  

Спасибо Fleder за подсказанное решение.


Хотя, желательно автоматическая проверка на переполнение и присвоение значения заданного по умолчанию: 

  • если введенное значение выходит за границу значений (в данном случае, если пользователь ввел значение большее 255), то переменной должно быть присвоено значение по умолчанию. Т.е. если пользователь ввел для переменной uchar_seconds значение равное 300, то uchar_seconds должно быть автоматически присвоено значение по умолчанию, равное 12.
Artem Temnikov
1031
Artem Temnikov 2014.04.13 12:40  
barabashkakvn:

Спасибо Fleder за подсказанное решение.


Хотя, желательно автоматическая проверка на переполнение и присвоение значения заданного по умолчанию: 

Я проверял: если ввести значение 256 (или более), то присвоится дефолтное число 12.

Или нужна именно информация о самом факте переполнения? 

Artem Temnikov
1031
Artem Temnikov 2014.04.13 12:48  
#property  script_show_inputs
#define DEF 12
input int int_seconds=DEF;     //seconds (0...255)

void OnStart()
{
  const uchar uchar_seconds=uchar((MathAbs(int_seconds)>255)?DEF:MathAbs(int_seconds));
  Print("u = ",uchar_seconds);
}

Автоматическая проверка

Значение по умолчанию 

Vladimir Karputov
Модератор
49268
Vladimir Karputov 2014.04.13 12:56  
Fleder:

Я проверял: если ввести значение 256 (или более), то присвоится дефолтное число 12.

Или нужна именно информация о самом факте переполнения? 

Я тоже проверял, были значения и 12 и 44. 

Автоматическая проверка

Значение по умолчанию  

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

Как пример если

input uchar uchar_seconds=12;         //(From 0 to 255).

то в поле ввода пользователь просто не сможет ввести отрицательные значения.

Artem Temnikov
1031
Artem Temnikov 2014.04.13 12:59  
barabashkakvn:
Я тоже проверял, были значения и 12 и 44. 
У меня 44 получается только если их ввести в поле ввода, а так всегда 12.
Artem Temnikov
1031
Artem Temnikov 2014.04.13 13:05  

Тогда можно изменить:

#property  script_show_inputs
#define DEF 12
input uint int_seconds=DEF;     //seconds (0...255)

void OnStart()
{
  const uchar uchar_seconds=uchar((int_seconds>255)?DEF:int_seconds);
  Print("u = ",uchar_seconds);
}

 Отрицательные значения больше не вводятся.

Vladimir Karputov
Модератор
49268
Vladimir Karputov 2014.04.13 13:05  
Fleder:
У меня 44 получается только если их ввести в поле ввода, а так всегда 12.
//+------------------------------------------------------------------+
//|                                               test_indicator.mq5 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property   copyright "Copyright © 2014, Vladimir Karputov"
#property   link      "http://wmua.ru/slesar/"
#property   version   "1.00"
#property   indicator_chart_window
#property   indicator_plots 0;

input uchar uchar_seconds=12;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print(__FUNCTION__);
//--- indicator buffers mapping
   EventSetTimer(uchar_seconds);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   Print(__FUNCTION__);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Print(__FUNCTION__);
  }
//+------------------------------------------------------------------+
Для примера введите 300, а потом проверьте параметры индикатора. Затем введите 500 и проверьте значения. После переполнения значения будут непредсказуемы.
Vladimir Karputov
Модератор
49268
Vladimir Karputov 2014.04.13 13:05  
Fleder:

Тогда можно изменить:

 Отрицательные значения больше не вводятся.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Метод проверки вводимого input параметра

barabashkakvn, 2014.04.13 12:56

Я тоже проверял, были значения и 12 и 44. 

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

Как пример если

input uchar uchar_seconds=12;         //(From 0 to 255).

то в поле ввода пользователь просто не сможет ввести отрицательные значения.


1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий