Не могу решить задачу

 

Помогите решить задачу, мозг уже сломал.

Есть пересечение линией любого уровня
Требуется нарисовать зону по крайним точкам за N-баров - размер зоны в барах =40 (это выполнимо)
А вот проверку на новые пересечения в диапазоне =20 баров внутри зоны 40 баров не могу реализовать
Т.е. перед тем как нарисовать всю зону в 40 баров назад до пересечения, требуется проверить находилась ли линия внутри уровней на протяжении 20 баров от начала
После проверки 20-ти баров далее пересечения не важны, главное чтобы от начала пересечения и до 20 баров линия больше не пересекала уровни.

int LevelUP=70;
int LevelDN=30;
int LongZone=40;
int ShortZone=20;

   for(i=limit; i>=0; i--) 
      {//Проверка что 40 баров назад было пересечение внутрь между уровней
       if((RSI(i+LongZone)<LevelUP && RSI(i+LongZone+1)>LevelUP) || 
          (RSI(i+LongZone)>LevelDN && RSI(i+LongZone+1)<LevelDN))
          {
           //Рисуем зону 40 баров
          }
      }


 

Если нужно определить, находился ли RSI между заданными уровнями, не выходя за их пределы, то для этого потребуется организовать цикл по таким барам. На каждом баре брать значение RSI и сравнивать на выход из заданной зоны:

bool IsRSIBetweenLevels()
{
   for(i = 40; i > 19; --i) 
   {
      double fRSI = iRSI(NULL, PERIOD_CURRENT, 7, PRICE_CLOSE, i);
      if (fRSI > LevelUP || fRSI < LevelDN)
         return false;
   }

   return true;
}

Если функция вернет true - выхода из зоны не было. В противном случае - было.

 
Ihor Herasko #:

Если нужно определить, находился ли RSI между заданными уровнями, не выходя за их пределы, то для этого потребуется организовать цикл по таким барам. На каждом баре брать значение RSI и сравнивать на выход из заданной зоны:

Если функция вернет true - выхода из зоны не было. В противном случае - было.

Спасибо

Print показывает
По всей истории в итоге результат =false
Ни одного результата =true

=========================

Известно время бара где было требуемое пересечение,
так же можно получить время бара с шагом в 20 баров от места пересечения
и в этом промежутке перебрать все бары по индикатору

Вот что-то правильное в голове крутится, но решение не приходит))

 
Перебирать цикл на каждом баре - это ужас-ужас.
 
forex2030 #:

Спасибо

Print показывает
По всей истории в итоге результат =false
Ни одного результата =true

Все зависит от того, какие используются значения LevelUP и LevelDn. Возможно, они слишком близки друг к другу. Тогда результат закономерен. А вот если взять LevelUP = 100 и LevelDN = 0, то получится обратный результат - практически на всей истории результат true.

 
Aleksei Stepanenko #:
Перебирать цикл на каждом баре - это ужас-ужас.

Про оптимизацию пока речь не шла. Сначала делаем правильно, а потом уже оптимизируем.

 
forex2030:

Помогите решить задачу, мозг уже сломал.

Есть пересечение линией любого уровня
Требуется нарисовать зону по крайним точкам за N-баров - размер зоны в барах =40 (это выполнимо)
А вот проверку на новые пересечения в диапазоне =20 баров внутри зоны 40 баров не могу реализовать
Т.е. перед тем как нарисовать всю зону в 40 баров назад до пересечения, требуется проверить находилась ли линия внутри уровней на протяжении 20 баров от начала
После проверки 20-ти баров далее пересечения не важны, главное чтобы от начала пересечения и до 20 баров линия больше не пересекала уровни.


Сформулируйте задачу, чтобы она была понятна, тогда, может, самостоятельно получится ее решить.

 

Есть 3 точки

int LevelUP=70;
int LevelDN=30;

int LongZone=40;
int ShortZone=20;

   for(i=limit; i>=0; i--) 
      {
/*1*/  Time[i];           //Точка начала анализа
/*2*/  Time[i+ShortZone]; //Точка дополнительного анализа, середина зоны
/*3*/  Time[i+LongZone];  //Точка пересечения линии с уровнем
      }

Как эти точки объединить в одну общую проверку? 

Dmitry Fedoseev:

Сформулируйте задачу, чтобы она была понятна, тогда, может, самостоятельно получится ее решить.

Я описал суть вопроса, но самостоятельно решить не идёт правильная мысль, вот и прошу помощи, может что-то не вижу или не учитываю

 

Выбираются крайние точки и все

Есть время первого и последнего интересующего бара, а так-же максимальная верхняя точка и нижняя этих баров (не важно точки индикатора, или цены). Все можно рисовать прямоугольную зону.

 
Konstantin Nikitin #:

Выбираются крайние точки и все

Есть время первого и последнего интересующего бара, а так-же максимальная верхняя точка и нижняя этих баров (не важно точки индикатора, или цены). Все можно рисовать прямоугольную зону.

С этим нет проблем нарисовать зону по крайним точкам.

Есть проблема анализа на повторное пересечения уровней внутри этой зоны от 0 до 20 баров
Например зона 40 баров, она уже есть и требуется ещё сделать проверку на наличия пересечений на дистанции в 20 баров от места первого пересечения.
Т.е. если зона 40 баров и на протяжении 20 баров было ещё пересечение выше-ниже уровня, то такая зона не рисуется,
а если не было больше пересечений на протяжении 20 баров, то такая зона может рисоваться.

 
forex2030 #:

С этим нет проблем нарисовать зону по крайним точкам.

Есть проблема анализа на повторное пересечения уровней внутри этой зоны от 0 до 20 баров
Например зона 40 баров, она уже есть и требуется ещё сделать проверку на наличия пересечений на дистанции в 20 баров от места первого пересечения.
Т.е. если зона 40 баров и на протяжении 20 баров было ещё пересечение выше-ниже уровня, то такая зона не рисуется,
а если не было больше пересечений на протяжении 20 баров, то такая зона может рисоваться.

это имеется в виду?

   int LevelUP=70;
   int LevelDN=30;
   int LongZone=40;
   int ShortZone=20;

   for(int i=limit; i>=0; i--) {
      if(i+LongZone >= rates_total) continue;
      //Проверка что 40 баров назад было пересечение внутрь между уровней
      if((RSI(i+LongZone)>LevelUP && RSI(i+LongZone-1)<LevelUP) ||
            (RSI(i+LongZone)<LevelDN && RSI(i+LongZone-1)>LevelDN)) {
         bool intersectionOfLines = false;
         for(int z = i+LongZone-1; z >= i+LongZone - ShortZone && z > 0; z--) {
            if(RSI(z)>LevelUP || RSI(z)<LevelDN) {
               intersectionOfLines = true;
               break;
            }
         }
         if(intersectionOfLines == false) {
            createZone();
         }
      }
   }
Причина обращения: