Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2318

 

Добрый день. Помогите, пожалуйста, разобраться.

Задача: Если CCI пересекла уровень 200 сверху вниз - считаем тренд нисходящим, -200 снизу вверх - восходящим. То есть до проверки советником условия покупки/продажи, он должен "посмотреть" и найти ближайшее "совершённое" пересечение.

Делаю так и помещаю в тело onTick:

int TrendSignal = 0;
         for (int i=0; i<Bars; i++)
         {
            double CCI_1=iCCI(Symbol(),0,CCI_Per,PRICE_CLOSE,i);
            double CCI_2=iCCI(Symbol(),0,CCI_Per,PRICE_CLOSE,i+1);
            
            if ( CCI_1>=CCI_BOT&&
                 CCI_2<=CCI_BOT )
               
               TrendSignal = 1; break;
               
            if ( CCI_1<=CCI_TOP&&
                 CCI_2>=CCI_TOP )
                 
               TrendSignal = 2; break;
         }

Результат не тот. Подскажите, пож., где ошибка, куда смотреть? 
 

 
antobarto #:

Добрый день. Помогите, пожалуйста, разобраться.

Задача: Если CCI пересекла уровень 200 сверху вниз - считаем тренд нисходящим, -200 снизу вверх - восходящим. То есть до проверки советником условия покупки/продажи, он должен "посмотреть" и найти ближайшее "совершённое" пересечение.

Делаю так и помещаю в тело onTick:

Результат не тот. Подскажите, пож., где ошибка, куда смотреть? 
 

Для советника не нужно пересечение в прошлом году. Поэтому проверять надо только 1 и 2 бары.

 
Alexey Viktorov #:

Для советника не нужно пересечение в прошлом году. Поэтому проверять надо только 1 и 2 бары.

Может быть человек ищет когда был факт последнего пересечения уровня? Чтобы понимать в каком направлении сейчас находится тренд в его понимании.

 
antobarto #:

Добрый день. Помогите, пожалуйста, разобраться.

Задача: Если CCI пересекла уровень 200 сверху вниз - считаем тренд нисходящим, -200 снизу вверх - восходящим. То есть до проверки советником условия покупки/продажи, он должен "посмотреть" и найти ближайшее "совершённое" пересечение.

Делаю так и помещаю в тело onTick:

Результат не тот. Подскажите, пож., где ошибка, куда смотреть? 
 

А какой результат-то?

 
Alexey Viktorov #:

Для советника не нужно пересечение в прошлом году. Поэтому проверять надо только 1 и 2 бары.

Вот смотрите,

Сегодня 29 ноября 2023 года и я ставлю советник на график. 

Первое, что должен определить советник - глобальное направление тренда. По ТС тренд определяется экстремумами CCI с уровнями 200 и -200. Ближайший экстремум (пересечение CCI уровня 200 сверху вниз) и, "флаг" для определения тренда "только sell" находится, допустим, 13 ноября 2023 года. Вот как объяснить это советнику? Иначе, может пройти несколько месяцев, пока не появится экстремум и сов начнёт работу.

Я пробовал сделать функциями 

bool TrendUp()
{
for (int i=0; i<Bars; i++)
         {
            double CCI_1=iCCI(Symbol(),0,CCI_Per,PRICE_CLOSE,i);
            double CCI_2=iCCI(Symbol(),0,CCI_Per,PRICE_CLOSE,i+1);
            
            if ( CCI_1>=CCI_BOT&&
                 CCI_2<=CCI_BOT )
               
            return (true);
            
         }
         return (false);
}

И аналогично TrendDown

Но результат тоже некорректный.


Как объяснить советнику: "смотри на историю, увидишь экстремум, скажи на бай он, или на селл"

 
Artyom Trishkin #:

А какой результат-то?

Так ведь сказано

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

antobarto, 2023.11.29 05:21

Добрый день. Помогите, пожалуйста, разобраться.

Задача: Если CCI пересекла уровень 200 сверху вниз - считаем тренд нисходящим, -200 снизу вверх - восходящим. То есть до проверки советником условия покупки/продажи, он должен "посмотреть" и найти ближайшее "совершённое" пересечение.

Делаю так и помещаю в тело onTick:

int TrendSignal = 0;
         for (int i=0; i<Bars; i++)
         {
            double CCI_1=iCCI(Symbol(),0,CCI_Per,PRICE_CLOSE,i);
            double CCI_2=iCCI(Symbol(),0,CCI_Per,PRICE_CLOSE,i+1);
            
            if ( CCI_1>=CCI_BOT&&
                 CCI_2<=CCI_BOT )
               
               TrendSignal = 1; break;
               
            if ( CCI_1<=CCI_TOP&&
                 CCI_2>=CCI_TOP )
                 
               TrendSignal = 2; break;
         }

Результат не тот. Подскажите, пож., где ошибка, куда смотреть? 
 


 
antobarto #:

Добрый день. Помогите, пожалуйста, разобраться.

Задача: Если CCI пересекла уровень 200 сверху вниз - считаем тренд нисходящим, -200 снизу вверх - восходящим. То есть до проверки советником условия покупки/продажи, он должен "посмотреть" и найти ближайшее "совершённое" пересечение.

Делаю так и помещаю в тело onTick:

Результат не тот. Подскажите, пож., где ошибка, куда смотреть
 

Воспользуйтесь функцией Print() и посмотрите, какие значения принимают переменные. 

 
Galim_V #:

Воспользуйтесь функцией Print() и посмотрите, какие значения принимают переменные. И цикл for вам здесь не нужен.

Пробовал, только через 

comment(TrendSignal);

с каждым тиком значения меняются, не смотря на то, что экстремум был один.

 
antobarto #:

Пробовал, только через 

с каждым тиком значения меняются, не смотря на то, что экстремум был один.

Из кода, который вы привели непонятно, почему должно быть иначе? Откройте дебаггер(отладчик) посмотрите, как все у вас работает.

 
Galim_V #:
Из кода, который вы привели непонятно, почему должно быть иначе?

Так он поэтому и просит, чтобы подсказали, где ошибка в коде. ))

С уважением, Владимир.

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