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

 
Алексей Тарабанов:

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

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

Только нужно внимательно прочитать в начале поста саму задачу. Надеюсь, что я там внятно написал..

 
Dmitry Fedoseev:

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

Проверял, я же написал, что условия работают... 

На сколько я понял, когда тестировал и проверял переменные, а так же массивы, всё работает.. Сама проблема в цикле..  for  .. 

 

можно и в одну строчку:

if((!условие1 || (условие1 && (/* само условие 1 */)) &&
   (!условие2 || (условие2 && (/* само условие 2 */)) &&
     .....
  )
 
HTMax:

Проверял, я же написал, что условия работают... 

На сколько я понял, когда тестировал и проверял переменные, а так же массивы, всё работает.. Сама проблема в цикле..  for  .. 

если пишется

ShouldCheckCondition[1]=INPUT_1;

ShouldCheckCondition[2]=INPUT_2;

то есть не заполняется ShouldCheckCondition[0]

значит цикл вести логично от 1.

ещё раз по буквам:

- перед циклом ставим флаг doTrade=true;

- пробегаем циклом массив ShouldCheckCondition, если в его элементе значение true, то проверяем нужное условие. Если условие выполненно, то продолжаем проверки. Если не выполненно, ставим doTrade=false и прерываем цикл

- по выходу и цикла смотрим - если doTrade==true , значит все требуемые условия выполненны (никто не сбросил его в false) и делаем какие-то действия (торгуем например)

можно "развернуть цикл" методом CopyPaste и обойтись без массива и его инициализаций:

bool doTrade=true;

doTrade=doTrade && ((! INPUT_1) || проверка_уловия_1);

doTrade=doTrade && ((! INPUT_2) || проверка_уловия_2);

doTrade=doTrade && ((! INPUT_3) || проверка_уловия_3);

if (doTrade) {

  /// торгуем

}

 
Maxim Kuznetsov:

если пишется

ShouldCheckCondition[1]=INPUT_1;

ShouldCheckCondition[2]=INPUT_2;

то есть не заполняется ShouldCheckCondition[0]


Спасибо за терпение!

Максим в моей интерпретации вашего кода, я сделал всё в одной функции, у вас было несколько, всё вроде работает нормально(сейчас тестирую):

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 
                     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
                     if (!ShouldCheckCondition_SEL[isccs]) {
                   // если не склалось - то всё,не торгуем
                       doTrade_SEL=false;break;
                   }
                  }
                 }


Единственное но, что условия выполняются как ИЛИ,  а нужно как И...

Другими словами, если было выбрано для открытия ордера Условие1 то и открывается ордер по нему, но если были выбраны для открытия ордера Условие1 и Условие2, то на данный момент вход осуществляется ИЛИ по Условию1 ИЛИ по Условию2, а нужно И по Условию1 И по Условию2 одновременно!

Или в моей интерпретации ошибка?

 
HTMax:


Спасибо за терпение!

Максим в моей интерпретации вашего кода, я сделал всё в одной функции, у вас было несколько, всё вроде работает нормально(сейчас тестирую):


Единственное но, что условия выполняются как ИЛИ,  а нужно как И...


Или в моей интерпретации ошибка?

я там не вижу собственно проверок условий :-) а только проверка флагов

как-то так например:

 for (int isccb=0;doTrade && isccb<ArraySize(ShouldCheckCondition_BUY);isccb++) {
   if (ShouldCheckCondition_BUY[isccb]) {
      /// требуется проверка условия № isccb
      /// (вызвать соотв.функцию или прямо на месте проверить
      switch(isccb) {
         case 1: if (! условие_номер_раз) doTrade=false; break;
         case 2: if (! условие_номер_два) doTrade=false; break;
         case 3:
         case 4: if (! проверка_три_четыре(isccb)) doTrade=false;break;
         default: 
              // можно вызвать функцию по ссылке, из заранее готового массива
              if (FunctionArray[issb]==NULL || !FunctionArray[sccb](isccb)) doTrade=false;
      }
   }
 }
 
Maxim Kuznetsov:

я там не вижу собственно проверок условий :-) а только проверка флагов

как-то так например:




Давайте  проще....

     Имеется ввиду следующее:

//+------------------------------------------------------------------+
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern bool VHOD_PO_MA_14 = FALSE;
extern bool VHOD_PO_MA_34 = FALSE;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int start()
  {
//---
//+-----------------------------------------+
//|                   ВХОД                  |
//+-----------------------------------------+  

             
              bool ShouldCheckCondition_BUY[2];
              bool ShouldCheckCondition_SEL[2]; 
                      
             //+-----------------------------------------+ USLOVIA V BUY +-----------------------------------------+
             if (VHOD_PO_MA_14 == true && Ask >  iMA(NULL,0,14,0,MODE_SMMA,PRICE_MEDIAN,0);) ShouldCheckCondition_BUY[1] = true; 
             if (VHOD_PO_MA_34 == true && Ask >  iMA(NULL,0,34,0,MODE_SMMA,PRICE_MEDIAN,0);) ShouldCheckCondition_BUY[2] = true;
             //+-----------------------------------------+ USLOVIA V SELL +----------------------------------------+
             if (VHOD_PO_MA_14 == true && Bid <  iMA(NULL,0,14,0,MODE_SMMA,PRICE_MEDIAN,0);) ShouldCheckCondition_SEL[1] = true; 
             if (VHOD_PO_MA_34 == true && Bid <  iMA(NULL,0,34,0,MODE_SMMA,PRICE_MEDIAN,0);) ShouldCheckCondition_SEL[2] = true;
             //+------------------------------------------+ END USLOVIYAM +----------------------------------------+
             
                      
              bool doTrade_BUY;

               for (int isccb=0;isccb<ArraySize(ShouldCheckCondition_BUY);isccb++) {
                    if (ShouldCheckCondition_BUY[isccb]) {
                        doTrade_BUY=true; // открываем ордер в BUY 
                     if (!ShouldCheckCondition_BUY[isccb]) {
                                          // если не склалось - то всё,не торгуем
                       doTrade_BUY=false;break; 
                      }
                     }
                   }    
                                        
  }



И вот в таком варианте кода,  если будут выбраны оба условия для фильтрации входа

extern bool VHOD_PO_MA_14 = TRUE;
extern bool VHOD_PO_MA_34 = TRUE;

то вход осуществляется ИЛИ по  VHOD_PO_MA_14  ИЛИ по VHOD_PO_MA_34, а нужно ,что бы открытие ордеров осуществлялось И по   VHOD_PO_MA_14 И по  VHOD_PO_MA_34 (Другими словами если в BUY то ордер открывается только если Ask больше  iMA(NULL,0,14,..  И Ask больше  iMA(NULL,0,34.. !)


Не забываем для чего всё этого нужно, потому что

extern bool VHOD_PO_MA_14 = FALSE;
extern bool VHOD_PO_MA_34 = FALSE;

extern bool VHOD_PO_MA_44 = FALSE
extern bool VHOD_PO_MA_54 = FALSE;
extern bool VHOD_PO_MA_.. .. .......


Может быть миллион!

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Каждый день на витрине MQL5 Маркета появляются десятки новых приложений для автоматизации торговли. Выберите подходящее среди 10 000 продуктов и избавьтесь от ненужных рутинных операций. Продавайте свои программы для алготрейдинга в нашем Маркете — в самом большом магазине торговых приложений для трейдеров! One Click Close Скрипт помогает легко...
 

Может попробовать набор флагов использовать?

 
HTMax:




Давайте  проще....

     Имеется ввиду следующее:



И вот в таком варианте кода, вход осуществляется ИЛИ по  VHOD_PO_MA_14  ИЛИ по VHOD_PO_MA_34, а нужно если будут выбраны оба условия для фильтрации входа

, то открытие ордеров осуществлялось И по   VHOD_PO_MA_14 И по  VHOD_PO_MA_34 (Другими словами если в BUY то ордер открывается только если Ask больше  iMA(NULL,0,14,..  И Ask больше  iMA(NULL,0,34.. !)

НАУЧИТЕСЬ ФОРМУЛИРОВАТЬ ЗАДАЧИ - это львиная половина решения

у вас в исходном посте совершенно иная формулировка задачи, а именно "имеем в INPUT 100500 флагов, означающих надо или не надо проверять некоторые условия, надо написать компактный, сопровождаемый код для этого".

то есть в исходной формулировке - массив ShouldCheck в OnInit заполняется флагами из Input. В ран-тайм (в OnTick, а не в start()) следуя этим флагам осуществляются конкретный проверки.
Про ЭТО вам все и отвечали

 
Maxim Kuznetsov:

НАУЧИТЕСЬ ФОРМУЛИРОВАТЬ ЗАДАЧИ

Согласен, что не корректно объяснил задачу,я не силён в программировании, поэтому сразу тяжело сформулировать...

Надеюсь, что сейчас более понятно о объяснил...


НУЖНА ПОМОЩЬ!

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