Миллион if или всё одной строчкой?

 

Всем Доброго времени суток! Всем людям доброй воли, да не оскудеет рука дающего руку помощи..!


Есть вот такая задача:

  В "Свойствах" эксперта, во "Входных параметрах" даём право выбора на каких условиях входить в рынок:

   

       extern bool Условие1
       extern bool Условие2
       extern bool Условие3
       extern bool Условие4     
       extern bool Условие......

и так миллион Условий для входа

Начинаем реализовывать это в эксперте:

  Если было выбрано Условие1 для входа в рынок то:

                      if ( Условие1 = true) {Входим в рынок;}

   А что если были выбраны для входа  Условие1  и  Условие2 то:

                      if ( Условие1 = true && Условие2 = true ) {Входим в рынок;}

   А что если были выбраны для входа  Условие1  и  Условие2 и  Условие3 то:

                     if ( Условие1 = true && Условие2 = true &&  Условие3 = true ) {Входим в рынок;}

  А что если были выбраны для входа  Условие3  и  Условие15 и  Условие30 и  Условие50 то:

                      if ( Условие3 = true && Условие15 = true &&  Условие30 = true &&  Условие50 = true ) {Входим в рынок;}

   А что если  ...   


В общем к чему я веду, если Условий для входа миллион, все возможные варианты перечислять нужно? Тогда это пиз..ц  потому что это 10

   ... то есть миллиард if...


Или всё таки есть другое решение?

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
HTMax:

Всем Доброго времени суток! Всем людям доброй воли, да не оскудеет рука дающего руку помощи..!


Есть вот такая задача:

  В "Свойствах" эксперта, во "Входных параметрах" даём право выбора на каких условиях входить в рынок:

   

       extern bool Условие1
       extern bool Условие2
       extern bool Условие3
       extern bool Условие4     
       extern bool Условие......

и так миллион Условий для входа

Начинаем реализовывать это в эксперте:

  Если было выбрано Условие1 для входа в рынок то:

                      if ( Условие1 = true) {Входим в рынок;}

   А что если были выбраны для входа  Условие1  и  Условие2 то:

                      if ( Условие1 = true && Условие2 = true ) {Входим в рынок;}

   А что если были выбраны для входа  Условие1  и  Условие2 и  Условие3 то:

                     if ( Условие1 = true && Условие2 = true &&  Условие3 = true ) {Входим в рынок;}

  А что если были выбраны для входа  Условие3  и  Условие15 и  Условие30 и  Условие50 то:

                      if ( Условие3 = true && Условие15 = true &&  Условие30 = true &&  Условие50 = true ) {Входим в рынок;}

   А что если  ...   


В общем к чему я веду, если Условий для входа миллион, все возможные варианты перечислять нужно? Тогда это пиз..ц  потому что это 10

   ... то есть миллиард if...


Или всё таки есть другое решение?

int OnInit() {

   ShouldCheckCondition[1]=INPUT_1;

   ShouldCheckCondition[2]=INPUT_2;

   ShouldCheckCondition[3]=INPUT_3;

  ....

}

void OnTick() {

// проверим все торговые уловия

bool doTrade=true;

for (int i=0;i<ArraySize(ShouldCheckCondition);i++) {

  if (ShouldCheckCondition[i]) {

    //если надо проверять 100500-тое уловие, то проверим

    //вызовем функцию проверки этого условия

    if (!CheckCondition(i)) {

       // если не склалось - то всё,не торгуем

       doTrade=false; break;

    }

}

if (doTrade) {

   // все требуемые условия сошлись, торгуем

}

}


как-то вот так примерно :-) дано схематично

 
Maxim Kuznetsov:

int OnInit() {

   ShouldCheckCondition[1]=INPUT_1;

   ShouldCheckCondition[2]=INPUT_2;

   ShouldCheckCondition[3]=INPUT_3;

  ....

}

void OnTick() {

// проверим все торговые уловия

bool doTrade=true;

for (int i=0;i<ArraySize(ShouldCheckCondition);i++) {

  if (ShouldCheckCondition[i]) {

    //если надо проверять 100500-тое уловие, то проверим

    //вызовем функцию проверки этого условия

    if (!CheckCondition(i)) {

       // если не склалось - то всё,не торгуем

       doTrade=false; break;

    }

}

if (doTrade) {

   // все требуемые условия сошлись, торгуем

}

}


как-то вот так примерно :-) дано схематично


Я дилетант в программировании поэтому прошу простить, но как то не понял как это работает.. 

  Для начала как объявляем ShouldCheckCondition..? 
                                     bool ShouldCheckCondition[]  -  так?

                                              ArrayInitialize()  не используем?


А вот тут в коде вы написали:

                         //если надо проверять 100500-тое уловие, то проверим

                         //вызовем функцию проверки этого условия


Здесь я вообще  не понял, что писать нужно?


И вот в этой части кода вы написали:

                            if (!CheckCondition(i))

  по моему должно  быть так:

                            if (!CheckCondition[i])


В общем понятен смысл кода написанный вами, но не очень понял как этот код выполняет описанную выше мною задачу:

 

       extern bool Условие1
       extern bool Условие2
       extern bool Условие3
       extern bool Условие4     
       extern bool Условие......

и так миллион bool Условий для входа..

 

И какие Условия захочет использовать пользователь, нам  не известно..   Может 1 и 3,  а может 10 и 34 и 35, а может...   в общем разные..



  Если можно более понятней как для чайника..   составить код с объяснениями..

  Буду очень Благодарен...

 
bool Условие1_buy=true;
bool Условие1_sell=true;

if(Условие1_включено){
   Условие1_buy=...;
   Условие1_sell=...;
}


bool Условие2_buy=true;
bool Условие2_sell=true;

if(Условие2_включено){
   Условие2_buy=...;
   Условие2_sell=...;
}

bool Buy=Условие1_buy &&  Условие2_buy;
bool Sell=Условие1_sell &&  Условие2_sell; 

Вот так!

 

1. заводим некоторый массив bool ShouldCheckCondition[100500]; - это будут флаги надо/ненадо проверять условия

2. при старте программы инициализируем всё как false и дополняем/заполняем флагами из полей ввода. (из input)

3. когда пора проверять торговые условия, бежим по массиву и смотрим "необходма-ли такая проверка".

3.1 если она нужна но не вышла, то не торгуем

4. когда прошло весь массив и нет флага "не торгуем", значит все требуемые условия сошлись и открываем ордер (или что-то иное)

 
Maxim Kuznetsov:

1. заводим некоторый массив bool ShouldCheckCondition[100500]; - это будут флаги надо/ненадо проверять условия

2. при старте программы инициализируем всё как false и дополняем/заполняем флагами из полей ввода. (из input)

3. когда пора проверять торговые условия, бежим по массиву и смотрим "необходма-ли такая проверка".

3.1 если она нужна но не вышла, то не торгуем

4. когда прошло весь массив и нет флага "не торгуем", значит все требуемые условия сошлись и открываем ордер (или что-то иное)


Спасибо за ваше терпение!  Буду пытаться тестировать..

 

Если всё упростить и сделать всё одной функцией:


bool ShouldCheckCondition_BUY[7];
                                
               ShouldCheckCondition_BUY[1] = USLOVIADLAVHODA_VBUY_1;
               ShouldCheckCondition_BUY[2] = USLOVIADLAVHODA_VBUY_2;
               ShouldCheckCondition_BUY[3] = USLOVIADLAVHODA_VBUY_3;
               ShouldCheckCondition_BUY[4] = USLOVIADLAVHODA_VBUY_4;
               ShouldCheckCondition_BUY[5] = USLOVIADLAVHODA_VBUY_5;
              
              bool doTrade_BUY=false;

               for (int isccb=0;isccb<ArraySize(ShouldCheckCondition_BUY);isccb++) {
                    if (ShouldCheckCondition_BUY[isccb]) {
                      doTrade_BUY=true; // открываем ордер в BUY 
                    //если надо проверять 100500-тое уловие, то проверим
                   //вызовем функцию проверки этого условия
                     if (!ShouldCheckCondition_BUY[isccb]) {
                   // если не склалось - то всё,не торгуем
                       doTrade_BUY=false;break; 
                      }
                     }
                   }
              
             bool ShouldCheckCondition_SEL[7];
                                
               ShouldCheckCondition_SEL[1] = USLOVIADLAVHODA_VSEL_1;
               ShouldCheckCondition_SEL[2] = USLOVIADLAVHODA_VSEL_2;
               ShouldCheckCondition_SEL[3] = USLOVIADLAVHODA_VSEL_3;
               ShouldCheckCondition_SEL[4] = USLOVIADLAVHODA_VSEL_4;
               ShouldCheckCondition_SEL[5] = USLOVIADLAVHODA_VSEL_5;
              
              bool doTrade_SEL=false;

               for (int isccs=0;isccs<ArraySize(ShouldCheckCondition_SEL);isccs++) {
                    if (ShouldCheckCondition_SEL[isccs]) {
                      doTrade_SEL=true; //открываем ордер в Sell
                   //если надо проверять 100500-тое уловие, то проверим
                   //вызовем функцию проверки этого условия
                     if (!ShouldCheckCondition_SEL[isccs]) {
                   // если не склалось - то всё,не торгуем
                       doTrade_SEL=false;break;
                   }
                  }
                 }

Я правильно интерпретировал ваш код?


  Если да? То почему-то при тестировании, во время проверки массива с условиями,  условия выполняются 1 или 2 или 3, а не 1 и 2 и 3 (если они были выбраны для входа, то есть открытия ордеров)..  

 Что не так сделал? 


Самому не разобраться...

 
for (int isccb=0;isccb<ArraySize(ShouldCheckCondition_BUY);isccb++) {
   if (ShouldCheckCondition_BUY[isccb]) {
      doTrade_BUY=true;
      if (!ShouldCheckCondition_BUY[isccb]) {
         doTrade_BUY=false;break; 
      }
   }
}

Было. А надо:

for (int isccb=0;isccb<ArraySize(ShouldCheckCondition_BUY);isccb++) {
   if (ShouldCheckCondition_BUY[isccb]) {
      doTrade_BUY=true;
   }
   if (!ShouldCheckCondition_BUY[isccb]) {
      doTrade_BUY=false;
      break; 
   }
}

А лучше:

bool doTrade_BUY=true;
for (int isccb=0;isccb<ArraySize(ShouldCheckCondition_BUY);isccb++) {
   if (!ShouldCheckCondition_BUY[isccb]) {
      doTrade_BUY=false;
      break; 
   }
}
 
Dmitry Fedoseev:

Было. А надо:

А лучше:

При таком варианте переменная doTrade_BUY всё время равна 0 (то есть False)! Хотя переменные Условий входа в рынок  USLOVIADLAVHODA_VBUY_ кричат одна, за одной, каждая в своё время, по очереди, что вход есть, то есть они равны 1 (True).. , я проверял!

  Что то не так!!

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
HTMax:

При таком варианте переменная doTrade_BUY всё время равна 0 (то есть False)! Хотя переменные Условий входа в рынок  USLOVIADLAVHODA_VBUY_ кричат одна, за одной, каждая в своё время, по очереди, что вход есть, то есть они равны 1 (True).. , я проверял!

  Что то не так!!

Условия входа через И, или ИЛИ?

 
HTMax:

При таком варианте переменная doTrade_BUY всё время равна 0 (то есть False)! Хотя переменные Условий входа в рынок  USLOVIADLAVHODA_VBUY_ кричат одна, за одной, каждая в своё время, по очереди, что вход есть, то есть они равны 1 (True).. , я проверял!

  Что то не так!!

Ищите ошибку. Включайте условия по-одному, проверяйте их.

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