Проверьте - что я не правильно сделала? - страница 6

 
Nikolai Semko #:

Да, Наталья - это был просто мем из серии "Когда платят за строчку кода"

Это такой юмор у программистов


В Вашем случае нет необходимости в функции 

Необходимо просто переменые Volume1 ... Volume10 сформировать изначально в виде массива volume[10]
и потом по индексу n обращаться к его элементам volume[n]. 
Не беспокойтесь - через это проходил почти каждый программист.
Главное, что Вас реально прёт от программирования. Я это чувствую.
Значит - далеко пойдете.

Подскажите как написать красиво. Что бы не дублировать массивы кода.
В советнике используется 2 индикатора.
и условия для открытия ордера выглядят так сейчас:

if (Indicator1 > 0 && Indicator2 > 0)
{
OrderSend
}


Но я бы хотела добавить в настройки фильтр
Использовать или не использовать 1 или 2 индикатор
Только я незнаю как это реализовать более правильно.
Что бы получилось примерно так:

if (Indicator1 && Indicator1 > 0)
{
if (Indicator2 && Indicator2 > 0) || (Indicator2 == false)
{
///
}
}



if (Indicator2 && Indicator2 > 0)
{
if (Indicator1 && Indicator1 > 0) || (Indicator1 == false)
{
///
}
}
что бы в настройках я могла отключить 1 индикатор или второй.
Не могу понять как сделать не копируя много кода.....
 
Natalya Smirnova #:

Подскажите как написать красиво. Что бы не дублировать массивы кода.
В советнике используется 2 индикатора.
и условия для открытия ордера выглядят так сейчас:


Но я бы хотела добавить в настройки фильтр
Использовать или не использовать 1 или 2 индикатор
Только я незнаю как это реализовать более правильно.
Что бы получилось примерно так:

что бы в настройках я могла отключить 1 индикатор или второй.
Не могу понять как сделать не копируя много кода.....

Вот тут я на эту тему немного писал: https://www.mql5.com/ru/forum/6343/page1384#comment_26447195

 
JRandomTrader #:

Вот тут я на эту тему немного писал: https://www.mql5.com/ru/forum/6343/page1384#comment_26447195

Благодарю уже пошла изучать.
 

Natalya Smirnova #:

что бы в настройках я могла отключить 1 индикатор или второй.
Не могу понять как сделать не копируя много кода.....


input bool indicator_1 = true;
input bool indicator_2 = true;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool F_1()
    {
     if(!indicator_1)
          return true;
// выполнение условий

//---
     return false;
    }
bool F_2()
    {
     if(!indicator_2)
          return true;
// выполнение условий

//---
     return false;
    }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart(void)
    {
     if(F_1 && F2) /* работаем */ ;
    }

Пишите условие выполнения индикатора в функции и если он не должен проверяться, то значит условие выполнено. Возвращаем TRUE.

 
Natalya Smirnova #:

Подскажите как написать красиво. Что бы не дублировать массивы кода.
В советнике используется 2 индикатора.
и условия для открытия ордера выглядят так сейчас:


Но я бы хотела добавить в настройки фильтр
Использовать или не использовать 1 или 2 индикатор
Только я незнаю как это реализовать более правильно.
Что бы получилось примерно так:

что бы в настройках я могла отключить 1 индикатор или второй.
Не могу понять как сделать не копируя много кода.....

Все же переменная для условия использования и переменная выходного значения индикатора должны быть разными переменными.
И если переменные для условия использования будут ind_1 и ind_2, то, например, можно так:

ind_1 = !(ind_1 && !(Indicator1>0));
ind_2 = !(ind_2 && !(Indicator2>0));
if (ind_1 && ind_2) { OrderSend... };
ЗЫ На всякий случай: Восклицательный знак означает инверсию bool значения
 
Nikolai Semko #:

Все же переменная для условия использования и переменная выходного значения индикатора должны быть разными переменными.
И если переменные для условия использования будут ind_1 и ind_2, то, например, можно так:

ind_1 = !(ind_1 && !(Indicator1>0));

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

PS/ архитектурно вообще шлак. Если показания индикаторов могут быть сведены в группу без торговых факторов (вне зависимости где чего открывал), то это индикатор и ему нечего делать в торговой логике робота. Оно обязано быть вынесеным и доступным к анализу. 

 
Maxim Kuznetsov #:

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

Может быть. 
Какие могу быть варианты у логики ab
0 0 = 1
0 1 = 1
1 0 = 0
1 1 = 1
Кроме !(a && !b)
Может кто найдет более короткую логику...

 
Maxim Kuznetsov #:

PS/ архитектурно вообще шлак. Если показания индикаторов могут быть сведены в группу без торговых факторов (вне зависимости где чего открывал), то это индикатор и ему нечего делать в торговой логике робота. Оно обязано быть вынесеным и доступным к анализу. 

Это я не понял.
Просто отвечал на вопрос. Не более.
 
Nikolai Semko #:
Может быть. 
Какие могу быть варианты у логики ab
0 0 = 1
0 1 = 1
1 0 = 0
1 1 = 1
Кроме !(a && !b)
Может кто найдет более короткую логику...

!a || b

:)

 
PapaYozh #:

!a || b

:)

Да точно.
Спасибо :))
Смешно. Пытался XOR прикрутить, а про OR забыл.

Значит более короткий вариант:
ind_1 = !ind_1 || Indicator1>0;
ind_2 = !ind_2 || Indicator2>0;
if (ind_1 && ind_2) { OrderSend... };
или однострочная версия с сохранением изначальных ind_1 и ind_2

if ((!ind_1 || Indicator1>0) && (!ind_2 || Indicator2>0)) { OrderSend... };


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