Множественные изменения исходного массива перед отрисовкой индюка

 

Коллеги, не могу решить проблему с индюком, нужна помощь!

Использую 3 массива:

  • Массив: best[] - исходный расчет
  • После его усредняю: base[] - в этом массиве результат усреднения
  • Буфер вывода индюка - массив best_MA[]. Прежде чем перегнать данные из base в best_MA, нужно выполнить проверку сигнала (сигнал - это пересечение нулевой линии индикатора)

Как делаю проверку:

сигнальный бар (i) должен в своем исходном значении (best[i]) быть больше предшествующего ему бара (best[i+1]) по абсолютному значению. Если не смотря на пересечение линии 0, в абсолютном значении по best бар меньше, то вместо рассчитанного для него в base значения, в best_MA ставится его значение с тем же знаком что и предыдущий знак. Т.е. индикатор находится в той же зоне (выше/ниже нуля) что и предыдущий бар.

После прогона цикла 1 раз получаем некоторое кол-во исправлений "неверных" сигналов. НО из-за этого меняется ситуация со смежными барами

Ниже привожу кусок кода, из-за которого этот пост, но кодом это назвать трудно. Временно решить можно только путем многократного повторения условий-фильтров :-(

 for(i=0; i<limit; i++)
            {
            //best_MA[i] = base[i];
            if (base[i+1] > 0 && base[i] < 0 && MathAbs(best[i]) < MathAbs(best[i+1])) base[i] =  MathAbs(best[i]);
            if (base[i+1] < 0 && base[i] > 0 && MathAbs(best[i]) < MathAbs(best[i+1])) base[i] = -MathAbs(best[i]);
            
            if (base[i+1] > 0 && base[i] < 0 && best[i] > best[i+1] && best[i+1] > 0)  base[i] =  best[i];
            if (base[i+1] < 0 && base[i] > 0 && best[i] > best[i+1] && best[i] < 0)    base[i] =  best[i];
            }
         for(i=0; i<limit; i++)
            {
            best_MA[i] = base[i];
           
            if (best_MA[i+1] > 0 && best_MA[i] < 0 && MathAbs(best[i]) < MathAbs(best[i+1])) best_MA[i] =  MathAbs(best[i]);
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && MathAbs(best[i]) < MathAbs(best[i+1])) best_MA[i] = -MathAbs(best[i]);
            }
         for(i=0; i<limit; i++)
            {
            if (best_MA[i+1] < 0 && best_MA[i] < 0 && best[i] > best[i+1] && best[i] > 0 && best[i+1] > 0)           best_MA[i] = best[i];
            if (best_MA[i+1] > 0 && best_MA[i] < 0 && best[i] > best[i+1] && best[i] > 0 && best[i+1] > 0)           best_MA[i] = best[i];
            if (best_MA[i+1] > 0 && best_MA[i] < 0 && best[i] > best[i+1])                                           best_MA[i] = best[i];
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && best[i] > best[i+1] && best[i] < 0)                            best_MA[i] = best[i];
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && best[i] < MathAbs(best[i+1]) && best[i] > 0 && best[i+1] < 0)  best_MA[i] = base[i];
            }
         for(i=0; i<limit; i++)
            {
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && best[i] < MathAbs(best[i+1]) && best[i] > 0 && best[i+1] < 0)           best_MA[i] = base[i];
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && best[i] < best[i+1] && best[i] > 0 && best[i+1] > 0)                    best_MA[i] = base[i];
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && MathAbs(best[i]) < best[i+1] && best[i] < 0 && best[i+1] > 0)           best_MA[i] = best[i];
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && MathAbs(best[i]) < MathAbs(best[i+1]) && best[i] < 0 && best[i+1] < 0)  best_MA[i] = base[i];
            }
         for(i=0; i<limit; i++)
            {
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && MathAbs(best[i]) < MathAbs(best[i+1]) && best[i] < 0 && best[i+1] < 0)  best_MA[i] = base[i];
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && best[i] < best[i+1] && best[i] > 0 && best[i+1] > 0)                    best_MA[i] = base[i];
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && best[i] < MathAbs(best[i+1]) && best[i] > 0 && best[i+1] < 0)           best_MA[i] = base[i];
            } 
         for(i=0; i<limit; i++)
            {
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && best[i] < best[i+1] && best[i] > 0 && best[i+1] > 0)              best_MA[i] = -best[i];
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && MathAbs(best[i]) < best[i+1] && best[i] < 0 && best[i+1] > 0)     best_MA[i] = best[i];
            }
         for(i=0; i<limit; i++)
            {
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && MathAbs(best[i]) < MathAbs(best[i+1]) && best[i] < 0 && best[i+1] < 0)  best_MA[i] = best[i];
            if (best_MA[i+1] < 0 && best_MA[i] > 0 && MathAbs(best[i]) < best[i+1] && best[i] < 0 && best[i+1] > 0)     best_MA[i] = best[i];

            }            
 

Пересечением является не только было < стало >, но и было <=, стало > например.

Плюс я бы не использовал столь похожие названия массивов base и best - немудрено их перепутать.

 
Aleksei Radchenko:

Пересечением является не только было < стало >, но и было <=, стало > например.

Плюс я бы не использовал столь похожие названия массивов base и best - немудрено их перепутать.


Да, эти условия пересечения тоже учитываются.

Смог вот на что переделать:

         for(i=0; i<limit; i++)
            {
            if (base[i+1] > 0 && base[i] < 0) 
               {
                  if (MathAbs(best[i]) < MathAbs(best[i+1])) 
                     {
                     base[i] =  MathAbs(best[i]); i = 0; continue;
                     }
                  if (MathAbs(best[i]) > MathAbs(best[i+1]) && best[i] > 0) 
                     {
                     base[i] =  MathAbs(best[i]); i = 0; continue;
                     }
               }
            if (base[i+1] < 0 && base[i] > 0)
               {
                  if (MathAbs(best[i]) < MathAbs(best[i+1])) 
                     {
                     base[i] = -MathAbs(best[i]); i = 0; continue;
                     }
                  if (MathAbs(best[i]) > MathAbs(best[i+1]) && best[i] < 0) 
                     {
                     base[i] = -MathAbs(best[i]); i = 0; continue;
                     }
               }
            }
            //*********************
            
            
         for(i=0; i<limit; i++)
            {
            best_MA[i] = base[i];
            }