Метод проверки вводимого input параметра - страница 2

 

Попробуйте так:

//+------------------------------------------------------------------+
//|                                               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;
#define DEF 12

input uint uint_seconds=DEF;     //seconds (0...255)

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   
   Print(__FUNCTION__);
//--- indicator buffers mapping
   EventSetTimer((uint_seconds>255)?DEF:uint_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.

Но таймер будет работать с периодом 12 секунд. 

 
barabashkakvn:

Может быть Вам стоит посмотреть в сторону перечислимых типов?

И ограничить варианты задания периода таймера, например, до 20-25? Скажем, 25 шагов по 10 секунд? 

 
Fleder:

Может быть Вам стоит посмотреть в сторону перечислимых типов?

И ограничить варианты задания периода таймера, например, до 20-25? Скажем, 25 шагов по 10 секунд? 

А, что, ограничивать пользователя - это даже очень хорошая идея:

//+------------------------------------------------------------------+
//|                                               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;

enum ENUM_PERIOD
  {
   seconds_10=10,       
   seconds_20=20     
  };
input ENUM_PERIOD  uchar_seconds=seconds_10;

//+------------------------------------------------------------------+
//| 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__);
  }
//+------------------------------------------------------------------+
 
barabashkakvn:

А, что, ограничивать пользователя - это даже очень хорошая идея:

Меньше свободы - больше дисциплины!
 

Действительно было бы неплохо, если бы input-ы проверялись автоматически. Создадите заявку в сервис деск?

А пока отвяжитесь от использования инпута введением дополнительной переменной:

input int  inp_seconds = 12;
int int_seconds = 0;

int OnInit()
{
   int_seconds = inp_seconds;
   if ( int_seconds > 60 || int_seconds < 1 ) int_seconds = 10; // default value
 
komposter:

Действительно было бы неплохо, если бы input-ы проверялись автоматически. Создадите заявку в сервис деск?

А пока отвяжитесь от использования инпута введением дополнительной переменной:

Да, сегодня подам заявку.
 
Заявка по поводу автоматической проверки input параметров создал. Про решение обязательно сообщу.
 
papaklass:

 А что мешало организовать проверку input параметров в OnInit? Если есть ошибки ввода, то в лог вывести сообщение о ошибке и прекратить работу индикатора/эксперта. При новом запуске пользователь введет правильные данные.

Заявка не нужна. :) 

Тут проблема была в следующем: если, например, input-переменная имеет тип uchar, то нижнее ограничение работает(пользователь не может ввести отрицательное число - "минус" не вводится), а вот верхнее ограничение не пашет (в данном случае - это 255).

И ввести можно заведомо большее число, чем охватывает тип uchar. Но произойдёт неявное приведение типов и в нашей input-переменной окажется неопределённое целочисленное значение. 

 
papaklass:

 А что мешало организовать проверку input параметров в OnInit? Если есть ошибки ввода, то в лог вывести сообщение о ошибке и прекратить работу индикатора/эксперта. При новом запуске пользователь введет правильные данные.

Заявка не нужна. :) 

Предлагаю рассмотреть проблему ввода со стороны пользователя. 
Поправить действия пользователя лучше во время ввода, чем заставлять его просматривать Журнал и еще и вдобавку просить перезапустить индикатор.
Причина обращения: