битовая маска

 

Помогите разобраться.
допустим есть 3 стратегии без параметров . Каждая может торговать по 3 символам. 
ка выбрать 3-4 самые прибыльные. чтоб записать результат в одну переменную 
типа Num = 001000110 ?


Лучше сразу пример кода с комментарием.

 
Dmitiry Ananiev:

Помогите разобраться.
допустим есть 3 стратегии без параметров . Каждая может торговать по 3 символам. 
ка выбрать 3-4 самые прибыльные. чтоб записать результат в одну переменную 
типа Num = 001000110 ?

Есть 3 стратегии. Нужно выбрать 4 стратегии... Что-то не то с постановкой задачи.

 
Ihor Herasko #:

Есть 3 стратегии. Нужно выбрать 4 стратегии... Что-то не то с постановкой задачи.

3 стратегии по 3 символам.  Всего 9. 
отобрать надо 4. 

 
Либо так.
input int inConfig = 32;

class SYSTEM { public: virtual string ToString() { return(__FUNCSIG__); } };

class SYSTEM1 : public SYSTEM { public: virtual string ToString() { return(__FUNCSIG__); } };
class SYSTEM2 : public SYSTEM { public: virtual string ToString() { return(__FUNCSIG__); } };
class SYSTEM3 : public SYSTEM { public: virtual string ToString() { return(__FUNCSIG__); } };
class SYSTEM4 : public SYSTEM { public: virtual string ToString() { return(__FUNCSIG__); } };
class SYSTEM5 : public SYSTEM { public: virtual string ToString() { return(__FUNCSIG__); } };

// https://www.mql5.com/ru/forum/1111/page3286#comment_45001634
template <typename T>
SYSTEM* New( const string &ClassName ) { return((typename(T) == ClassName) ? new T : NULL); }

typedef SYSTEM* (*TNew)( const string& );
const TNew FuncNew[] = {New<SYSTEM1>, New<SYSTEM2>, New<SYSTEM3>, New<SYSTEM4>, New<SYSTEM5>};

SYSTEM* New2( string ClassName )
{  
  SYSTEM* Res = NULL;
  
  ClassName = "class " + ClassName;
  
  for (uint i = ArraySize(FuncNew); (Res == NULL) && (bool)i--;)
    Res = FuncNew[i](ClassName);  
    
  return(Res);
}

// Возвращает набор систем по номеру конфигурации.
int SetSystems( SYSTEM* &Systems[], const int Num = 0 )
{
  const string SystemsStr[] = {"SYSTEM1", "SYSTEM2", "SYSTEM3", "SYSTEM4", "SYSTEM5"};
  
  const int Size = ArrayResize(Systems, ArraySize(SystemsStr));

  for (uint i = Size; (bool)i--;)
    Systems[i] = !(Num & (1 << i)) ? NULL : New2(SystemsStr[i]);
  
  return(Size);
}

void OnStart()
{    
  SYSTEM* Systems[];

  // Разные номера конфигурации для демонстрации.
  for (uint Num = inConfig; (bool)Num--;)
  {
    Print("\n" + (string)Num);
    
    for (uint i = SetSystems(Systems, Num); (bool)i--;)
      if (Systems[i] != NULL)
      {
        Print(Systems[i].ToString());   
        
        delete Systems[i];
      }
  }  
}


Либо по-старинке.

SYSTEM* GetSystem( const int Num )
{
  switch(Num)
  {
  case 0:
    return new SYSTEM1;
  case 1:
    return new SYSTEM2;
  case 2:
    return new SYSTEM3;
  case 3:
    return new SYSTEM4;
  case 4:
    return new SYSTEM5;
  }
  
  return(NULL);
}

// Возвращает набор систем по номеру конфигурации.
int SetSystems( SYSTEM* &Systems[], const int Num = 0 )
{
  const int Size = ArraySize(Systems);
  
  for (uint i = Size; (bool)i--;)
    Systems[i] = !(Num & (1 << i)) ? NULL : GetSystem(i);
  
  return(Size);
}


Узнать количество стратегий в номере можно так.

int GetAmountBits( int Num )
{
  int Res = Num & 1;
  
  while ((bool)(Num >>= 1))
    Res += Num & 1;
    
  return(Res);
}

void OnStart()
{
  Print(GetAmountBits(3));
}
 
fxsaber #:
Либо так.

Либо по-старинке.

Узнать количество стратегий в номере можно так.

В сборе для оптимизации.

input int inConfig = 31; // Номер конфигурации (1 .. 2^n-1), n - количество стратегий
sinput int inAmount = 3; // Искомое количество стратегий в портфеле

class SYSTEM { public: virtual void OnTick() {} };

class SYSTEM1 : public SYSTEM { public: virtual void OnTick() {} };
class SYSTEM2 : public SYSTEM { public: virtual void OnTick() {} };
class SYSTEM3 : public SYSTEM { public: virtual void OnTick() {} };
class SYSTEM4 : public SYSTEM { public: virtual void OnTick() {} };
class SYSTEM5 : public SYSTEM { public: virtual void OnTick() {} };

SYSTEM* Portfolio[];

int OnInit()
{    
  return(GetAmountBits(inConfig) != inAmount); // https://www.mql5.com/ru/forum/452503#comment_48766759
}

void OnTick()
{
  static const int Size = SetSystems(Portfolio, inConfig); // https://www.mql5.com/ru/forum/452503#comment_48766759
  
  for (uint i = Size; (bool)i--;)
    if (Portfolio[i] != NULL)
      Portfolio[i].OnTick();
}

void OnDeinit( const int )
{
  for (uint i = ArraySize(Portfolio); (bool)i--;)
    if (Portfolio[i] != NULL)
      delete Portfolio[i];
}
После полного перебора будут показаны наилучшие портфели ровно из трех стратегий, выбранных из пяти имеющихся.
 
А о чем вопрос? О том, как выбрать или о том, как записать в одну переменную?