На сколько я понял, когда тестировал и проверял переменные, а так же массивы, всё работает.. Сама проблема в цикле.. for ..
если пишется
ShouldCheckCondition[1]=INPUT_1;
ShouldCheckCondition[2]=INPUT_2;
то есть не заполняется ShouldCheckCondition[0]
значит цикл вести логично от 1.
ещё раз по буквам:
- перед циклом ставим флаг doTrade=true;
- пробегаем циклом массив ShouldCheckCondition, если в его элементе значение true, то проверяем нужное условие. Если условие выполненно, то продолжаем проверки. Если не выполненно, ставим doTrade=false и прерываем цикл
- по выходу и цикла смотрим - если doTrade==true , значит все требуемые условия выполненны (никто не сбросил его в false) и делаем какие-то действия (торгуем например)
можно "развернуть цикл" методом CopyPaste и обойтись без массива и его инициализаций:
Максим в моей интерпретации вашего кода, я сделал всё в одной функции, у вас было несколько, всё вроде работает нормально(сейчас тестирую):
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; //открываем ордер в Sellif (!ShouldCheckCondition_SEL[isccs]) {
// если не склалось - то всё,не торгуем
doTrade_SEL=false;break;
}
}
}
Единственное но, что условия выполняются как ИЛИ, а нужно как И...
Другими словами, если было выбрано для открытия ордера Условие1 то и открывается ордер по нему, но если были выбраны для открытия ордера Условие1 и Условие2, то на данный момент вход осуществляется ИЛИ по Условию1 ИЛИ по Условию2, а нужно И по Условию1 И по Условию2 одновременно!
Максим в моей интерпретации вашего кода, я сделал всё в одной функции, у вас было несколько, всё вроде работает нормально(сейчас тестирую):
Единственное но, что условия выполняются как ИЛИ, а нужно как И...
Или в моей интерпретации ошибка?
я там не вижу собственно проверок условий :-) а только проверка флагов
как-то так например:
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;
}
}
}
то вход осуществляется ИЛИ по 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.. !)
Каждый день на витрине MQL5 Маркета появляются десятки новых приложений для автоматизации торговли. Выберите подходящее среди 10 000 продуктов и избавьтесь от ненужных рутинных операций. Продавайте свои программы для алготрейдинга в нашем Маркете — в самом большом магазине торговых приложений для трейдеров! One Click Close Скрипт помогает легко...
И вот в таком варианте кода, вход осуществляется ИЛИ по 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()) следуя этим флагам осуществляются конкретный проверки. Про ЭТО вам все и отвечали
Условия входа через И, или ИЛИ?
Условия входа через И
Только нужно внимательно прочитать в начале поста саму задачу. Надеюсь, что я там внятно написал..
Ищите ошибку. Включайте условия по-одному, проверяйте их.
Проверял, я же написал, что условия работают...
На сколько я понял, когда тестировал и проверял переменные, а так же массивы, всё работает.. Сама проблема в цикле.. for ..
можно и в одну строчку:
Проверял, я же написал, что условия работают...
На сколько я понял, когда тестировал и проверял переменные, а так же массивы, всё работает.. Сама проблема в цикле.. 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) {
/// торгуем
}
если пишется
ShouldCheckCondition[1]=INPUT_1;
ShouldCheckCondition[2]=INPUT_2;
то есть не заполняется ShouldCheckCondition[0]
Спасибо за терпение!
Максим в моей интерпретации вашего кода, я сделал всё в одной функции, у вас было несколько, всё вроде работает нормально(сейчас тестирую):
Единственное но, что условия выполняются как ИЛИ, а нужно как И...
Другими словами, если было выбрано для открытия ордера Условие1 то и открывается ордер по нему, но если были выбраны для открытия ордера Условие1 и Условие2, то на данный момент вход осуществляется ИЛИ по Условию1 ИЛИ по Условию2, а нужно И по Условию1 И по Условию2 одновременно!
Или в моей интерпретации ошибка?
Спасибо за терпение!
Максим в моей интерпретации вашего кода, я сделал всё в одной функции, у вас было несколько, всё вроде работает нормально(сейчас тестирую):
Единственное но, что условия выполняются как ИЛИ, а нужно как И...
Или в моей интерпретации ошибка?
я там не вижу собственно проверок условий :-) а только проверка флагов
как-то так например:
я там не вижу собственно проверок условий :-) а только проверка флагов
как-то так например:
Давайте проще....
Имеется ввиду следующее:
И вот в таком варианте кода, если будут выбраны оба условия для фильтрации входа
то вход осуществляется ИЛИ по 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_44 = FALSEextern bool VHOD_PO_MA_34 = FALSE;
extern bool VHOD_PO_MA_54 = FALSE;
extern bool VHOD_PO_MA_.. .. .......
Может быть миллион!
Может попробовать набор флагов использовать?
Давайте проще....
Имеется ввиду следующее:
И вот в таком варианте кода, вход осуществляется ИЛИ по 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()) следуя этим флагам осуществляются конкретный проверки.
Про ЭТО вам все и отвечали
НАУЧИТЕСЬ ФОРМУЛИРОВАТЬ ЗАДАЧИ
Согласен, что не корректно объяснил задачу,я не силён в программировании, поэтому сразу тяжело сформулировать...
Надеюсь, что сейчас более понятно о объяснил...
НУЖНА ПОМОЩЬ!