Входной параметр в бинарном виде

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

Пример из справки Типы char, short, int и long:

... Для целочисленных переменных значения можно задавать в бинарном виде с помощью префикса B. Например, можно закодировать рабочие часы торговой сессии в переменную типа int и использовать информацию о них согласно требуемому алгоритму:

//--- для рабочих часов ставим 1, для нерабочих указываем 0 
   int AsianSession   =B'111111111'; // азиатская сессия с 0:00 часов до 9:00 
   int EuropeanSession=B'111111111000000000'; // европейская сессия  9:00 - 18:00 
   int AmericanSession =B'111111110000000000000011'; // американская 16:00 - 02:00 


Но задать в бинарном виде входной параметр (именно в виде 111111111000000000) -

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                                      Copyright 2017, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property script_show_inputs
//--- для рабочих часов ставим 1, для нерабочих указываем 0 
input int AsianSession=B'111111111'; // азиатская сессия с 0:00 часов до 9:00 
input int EuropeanSession=B'111111111000000000'; // европейская сессия  9:00 - 18:00 
input int AmericanSession=B'111111110000000000000011'; // американская 16:00 - 02:00 
//---
string text="10";
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//---

  }
//+------------------------------------------------------------------+

не выйдет - во входных параметрах бинарное представление числа преобразовывается в обычное число:

Входные параметры


Вопрос: есть ли способ задавать во входных параметрах значения именно в бинарном виде (чтобы пользователь видел не число, а именно бинарное представление, вроде 111111111000000000)?

Aleksei Radchenko
1109
Aleksei Radchenko  
Vladimir Karputov:

Пример из справки Типы char, short, int и long:

... Для целочисленных переменных значения можно задавать в бинарном виде с помощью префикса B. Например, можно закодировать рабочие часы торговой сессии в переменную типа int и использовать информацию о них согласно требуемому алгоритму:


Но задать в бинарном виде входной параметр (именно в виде 111111111000000000) -

не выйдет - во входных параметрах бинарное представление числа преобразовывается в обычное число:


Вопрос: есть ли способ задавать во входных параметрах значения именно в бинарном виде (чтобы пользователь видел не число, а именно бинарное представление, вроде 111111111000000000)?


Используйте строку - string, а затем делайте ее парсинг -  это не сложно. На сколько я знаю, прямого способа - нет :)
Vladimir Karputov
Модератор
180883
Vladimir Karputov  

Как вариант, такой подход:

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

Morse code

Vladimir Karputov, 2017.04.07 08:42

...

Вот такое решение: маска задаётся в виде перечисления

//+------------------------------------------------------------------+
//| Enum pattern mask                                                |
//+------------------------------------------------------------------+
enum ENUM_PATTERN_MASK
  {
   _0    =   0    ,   // 0
   _1    =   1    ,   // 1

   _2    =   2    ,   // 00
   _3    =   3    ,   // 01
   _4    =   4    ,   // 10
   _5    =   5    ,   // 11

   _6    =   6    ,   // 000
   _7    =   7    ,   // 001
   _8    =   8    ,   // 010
   _9    =   9    ,   // 011
   _10   =   10   ,   // 100
   _11   =   11   ,   // 101
   _12   =   12   ,   // 110
   _13   =   13   ,   // 111

   _14   =   14   ,   // 0000
   _15   =   15   ,   // 0001
   _16   =   16   ,   // 0010
   _17   =   17   ,   // 0011
   _18   =   18   ,   // 0100
   _19   =   19   ,   // 0101
   _20   =   20   ,   // 0110
   _21   =   21   ,   // 0111
   _22   =   22   ,   // 1000
   _23   =   23   ,   // 1001
   _24   =   24   ,   // 1010
...

в OnInit() маска переводится в строковую переменную "sExtMorseCode" (переменная "sExtMorseCode" объявлена на глобальном программном уровне) в функции ConvertNumberToString:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool ConvertNumberToString(const ENUM_PATTERN_MASK num_mask,string &text)
  {
   bool result=true;
//---
   switch(num_mask)
     {
      case 0:  text="0"; break;
      case 1:  text="1"; break;
      case 2:  text="00"; break;
      case 3:  text="01"; break;
      case 4:  text="10"; break;
      case 5:  text="11"; break;
      case 6:  text="000"; break;
      case 7:  text="001"; break;
      case 8:  text="010"; break;
      case 9:  text="011"; break;
      case 10: text="100"; break;
...
      case 53: text="10111"; break;
      case 54: text="11000"; break;
      case 55: text="11001"; break;
      case 56: text="11010"; break;
      case 57: text="11011"; break;
      case 58: text="11100"; break;
      case 59: text="11101"; break;
      case 60: text="11110"; break;
      case 61: text="11111"; break;
      default: text=""; return(false);
     }
//---
   return(result);
  }

Решилось две проблемы:

1). пользователь видит во входных параметрах паттерн в виде "0101":

Удобное вид входного пареметра

2). Входной параметр отлично поддаётся оптимизации в тестере.


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