Индикатор на пересечение средней

 

Добрый день.

Некоторое время назад сделал для себя индикатор на пересечение средней (100). Вот код:

#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Blue

extern int Per=100;

int History=100000;

double MA_1[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int init()

  {

   SetIndexBuffer(0,MA_1);

   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3,Blue);

   return;

  }



//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int start()

  {

   int i,Counted_bars;

   double My_24EMA;

   double My_24EMA1;

   Counted_bars=IndicatorCounted();

   i=Bars-Counted_bars-1;

   if (i>History-1)

      i=History-1;

   while (i>=0)

   { 

MA_1[i+1]=0; 

My_24EMA=iMA(NULL,0,Per,0,MODE_EMA,PRICE_CLOSE,i+1);    

My_24EMA1=iMA(NULL,0,Per,0,MODE_EMA,PRICE_CLOSE,i+2);

if (Close[i+1]>My_24EMA && Close[i+2]<My_24EMA1)

   {

   MA_1[i+1]=1;

   }

if (Close[i+1]<My_24EMA && Close[i+2]>My_24EMA1)

   {

   MA_1[i+1]=-1;

   }

i--;

}

return;

}

//+------------------------------------------------------------------+ 


Я сразу уточню: я - не профи какой-нибудь. Мой пытливый мозг с трудом делает такие штуки :)

Но, вот незадача -  последние несколько дней не могу изменить этот индикатор, чтобы получить такой результат -  при пересечении средней хочу, чтобы индюк показывал ещё, например, 5 баров значение "1" (или "-1" в случае пересечения сверху вниз), если нет обратного пересечения. Например, график цены пересёк среднюю cнизу вверх и дальше пошёл вверх. Первый индюк (см.выше) показал бы в момент пересечения 1, а потом опять стал равным нулю. А мне надо, чтобы мой второй индюк показывал бы "1"ещё 5 баров и только потом стал равным нулю. Если бы до того как пройдёт эти 5 баров было бы обратное пересечение, то индюк бы показал бы "-1" и т.д. Надеюсь я смог пояснить, что я хочу сделать:) Вот как выглядит моя последняя попытка добиться нужного результата: 

#property copyright "Copyright © 2010, MetaQuotes Software Corp."

#property link      "http://www.metaquotes.net"



#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Blue

extern int Per=100;

int History=100000;

double MA_1[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int init()

  {

   SetIndexBuffer(0,MA_1);

   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3,Blue);

   return;

  }



//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int start()

  {

   int i,Counted_bars;

   int qb;

   double My_24EMA;

   double My_24EMA1;

   Counted_bars=IndicatorCounted();

   i=Bars-Counted_bars-1;

   if (i>History-1)

      i=History-1;

   while (i>=0)

      { 

         for (qb=0; qb>5;qb++)



            {

               MA_1[i+1+qb]=0; 

               My_24EMA=iMA(NULL,0,Per,0,MODE_EMA,PRICE_CLOSE,i+1+qb);    

               My_24EMA1=iMA(NULL,0,Per,0,MODE_EMA,PRICE_CLOSE,i+2+qb);





               if (Close[i+1+qb]>My_24EMA && Close[i+2+qb]<My_24EMA1) 

                  {

                     MA_1[i+1+qb]=1;break;

                  }

               if (Close[i+1+qb]<My_24EMA && Close[i+2+qb]>My_24EMA1)

                  {

                     MA_1[i+1+qb]=-1;break;

                  }  

             }

        i--;

      }

return;

}

//+------------------------------------------------------------------+ 

 

 

Не получается. Пожалуйста, подскажите - что надо поправит в коде?

 

Заранее благодарен за помощь.

 
concord99:

Добрый день.

Некоторое время назад сделал для себя индикатор на пересечение средней (100). Вот код:


Я сразу уточню: я - не профи какой-нибудь. Мой пытливый мозг с трудом делает такие штуки :)

Но, вот незадача -  последние несколько дней не могу изменить этот индикатор, чтобы получить такой результат -  при пересечении средней хочу, чтобы индюк показывал ещё, например, 5 баров значение "1" (или "-1" в случае пересечения сверху вниз), если нет обратного пересечения. Например, график цены пересёк среднюю cнизу вверх и дальше пошёл вверх. Первый индюк (см.выше) показал бы в момент пересечения 1, а потом опять стал равным нулю. А мне надо, чтобы мой второй индюк показывал бы "1"ещё 5 баров и только потом стал равным нулю. Если бы до того как пройдёт эти 5 баров было бы обратное пересечение, то индюк бы показал бы "-1" и т.д. Надеюсь я смог пояснить, что я хочу сделать:) Вот как выглядит моя последняя попытка добиться нужного результата: 

 

Не получается. Пожалуйста, подскажите - что надо поправит в коде?

 

Заранее благодарен за помощь.

  


Используйте кнопку SRC для вставки кода, если конечно хотите получить ответ.

Править чужие посты удовольствия не доставляет 

 
Пожалуйста, помогите кто-нибудь найти ошибку в коде ...)
 
 
#property copyright "Copyright © 2010, MetaQuotes Software Corp."

#property link      "http://www.metaquotes.net"



#property indicator_separate_window

#property indicator_buffers 1

#property indicator_color1 Blue

extern int Per=100;

int History=100000;

double MA_1[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int init()

  {

   SetIndexBuffer(0,MA_1);

   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3,Blue);

   return;

  }



//+------------------------------------------------------------------+

//| Custom indicator iteration function                              |

//+------------------------------------------------------------------+

int start()

  {

   int i,Counted_bars;

   int qb;

   double My_24EMA;

   double My_24EMA1;

   Counted_bars=IndicatorCounted();

   i=Bars-Counted_bars-1;

   if (i>History-1)

      i=History-1;

   while (i>=0)

      { 

         for (qb=0; qb>5;qb++)



            {

               MA_1[i+1]=0; 

               My_24EMA=iMA(NULL,0,Per,0,MODE_EMA,PRICE_CLOSE,i+1+qb);    

               My_24EMA1=iMA(NULL,0,Per,0,MODE_EMA,PRICE_CLOSE,i+2+qb);





               if (Close[i+1+qb]>My_24EMA && Close[i+2+qb]<My_24EMA1) 

                  {

                     MA_1[i+1]=1;break;

                  }

               if (Close[i+1+qb]<My_24EMA && Close[i+2+qb]>My_24EMA1)

                  {

                     MA_1[i+1]=-1;break;

                  }  

             }

        i--;

      }

return;

}

//+------------------------------------------------------------------+ 

Последние несколько дней не могу изменить этот индикатор, чтобы получить такой результат -  при пересечении средней я хочу, чтобы индюк показывал ещё, например, 5 баров значение "1" (или "-1" в случае пересечения сверху вниз), если нет обратного пересечения. Например, график цены пересёк среднюю cнизу вверх и дальше пошёл вверх. Первый индюк (см.выше) показал бы в момент пересечения 1, а потом опять стал равным нулю. А мне надо, чтобы мой второй индюк показывал бы "1"ещё 5 баров и только потом стал равным нулю. Если бы до того как пройдёт эти 5 баров было бы обратное пересечение, то индюк бы показал бы "-1" и т.д. Надеюсь я смог пояснить, что я хочу сделать:)

Вероятно, я не правильно использую внутренний цикл. Если возможно, подскажите, пожалуйста, что поправить надо?

 
concord99:
Пожалуйста, помогите кто-нибудь найти ошибку в коде ...)
Как понял, так сделал.
Файлы:
concord99.mq4  3 kb
 
IgRU4ek:
Как понял, так сделал.


Большое Вам спасибо, IgRU4ek!!!  ... Вот после таких ситуаций опять появляется вера в человечество!  
 
IgRU4ek:
Как понял, так сделал.


Благодаря Вашей помощи я наконец-то внёс необходимые изменения в свой код (если кому-то потребуется :)):

#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Blue
extern int Per=100;
int History=100000;
double MA_1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   SetIndexBuffer(0,MA_1);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3,Blue);
   return;
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int i,Counted_bars;
   int qb;
   double My_24EMA;
   double My_24EMA1;
   Counted_bars=IndicatorCounted();
   i=Bars-Counted_bars-1;
   if (i>History-1)
      i=History-1;
   while (i>=0)
      { 

         for (qb=i; qb<=i+5;qb++)

            {
               MA_1[i+1]=0; 
               
               My_24EMA=iMA(NULL,0,Per,0,MODE_EMA,PRICE_CLOSE,1+qb);    
               My_24EMA1=iMA(NULL,0,Per,0,MODE_EMA,PRICE_CLOSE,2+qb);


               if (Close[1+qb]>My_24EMA && Close[2+qb]<My_24EMA1) 
                  {
                     MA_1[i+1]=1;
                     break;
                  }
               if (Close[1+qb]<My_24EMA && Close[2+qb]>My_24EMA1)
                  {
                     MA_1[i+1]=-1;
                     break;
                  }  
             }
        i--;
      }
return;
}
//+------------------------------------------------------------------+

 Ещё раз спасибо Вам.

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