Не повторять На каждой свече Алерт

 

Перечитала все схожие вопросы, но ответа не нашла.
Наверное я совсем не правильно делаю, раз таких вопросов не нашла.
Пишу индикатор.
Который по заданным условиям рисует стрелку и выдает Алерт.
Так же есть встроенная функция (for которая показывает стрелки на истории)
Все замечательно работает, ОДНАКО

При открытии новой свечи выдается Алерт. Хотя стрелки нет и условия не подходящие.
Такое впечатление, что при открытии новой свечи, индикатор пробегает по истории и выдает исторический Алерт (по последнему сигналу)

Выложу часть кода, так как я думаю не имеет смысл все захламлять.
Действующую часть так сказать.

int i;
     for(i=0; i<BarsToCount; i++) // BarsToCount = 500 (в настройках)
   
     {
      MA1[i]=iMA(NULL,0,MA_1,shift_1,method_1,applied_price_1,i);
      MA2[i]=iMA(NULL,0,MA_2,shift_1,method_1,applied_price_1,i);

      OP3 = Open[i+3]; CL3 = Close[i+3]; HI3 = High[i+3]; LO3 = Low[i+3];
      OP2 = Open[i+2]; CL2 = Close[i+2]; HI2 = High[i+2]; LO2 = Low[i+2];
      OP1 = Open[i+1]; CL1 = Close[i+1]; HI1 = High[i+1];  LO1 = Low[i+1];
      
       if(Sistema1)
        {
         if(Open[i+1] > MA1[i+1] && Close[i+1] < MA1[i+1])
           {
            if(OP3 > MA1[i+1] && CL3 > MA1[i+1])
              {
               if(OP2 > MA1[i+1] && CL2 > MA1[i+1])
                 {
                  if(HI3 > MA1[i+1] && HI2 > MA1[i+1] && LO3 > MA1[i+1] && LO2 > MA1[i+1])
                    {
                     if(MA2[i+1] > MA1[i+1] && MA2[i] < MA1[i])
                       {
                        S_Sell[i+1]=Open[i+1] + Interval*Point;
                        if(Alerts)
                          {
                           if(timealert!=Time[0])
                             {
                              Alert(Symbol()," Cигнал на продажу ");
                              timealert=Time[0];
                             }
                          }
                       }
                    }
                 }
              }
           }

Подскажите что не так.
Уже все возможные варианты перепробовала, но видно не хватает у меня опыта.

 

Да, так и есть. Выдается алерт по последнему найденному сигналу. Все потому, что с текущей свечей сравнивается какой-то timealert, а не время свечи сигнала.

Вместо:

if(timealert!=Time[0])
{
   Alert(Symbol()," Cигнал на продажу ");
   timealert=Time[0];
}

Нужно:

if (i == 0)
   Alert(Symbol()," Cигнал на продажу ");
 
Ihor Herasko #:

Да, так и есть. Выдается алерт по последнему найденному сигналу. Все потому, что с текущей свечей сравнивается какой-то timealert, а не время свечи сигнала. Нужно:


Если я вношу изменения и делаю так как Вы написали:

int i;
     for(i=0; i<BarsToCount; i++) // BarsToCount = 500 (в настройках)
   //for(i=BarsToCount; i>=0; i--)
     {
      MA1[i]=iMA(NULL,0,MA_1,shift_1,method_1,applied_price_1,i);
      MA2[i]=iMA(NULL,0,MA_2,shift_1,method_1,applied_price_1,i);

      OP3 = Open[i+3]; CL3 = Close[i+3]; HI3 = High[i+3]; LO3 = Low[i+3];
      OP2 = Open[i+2]; CL2 = Close[i+2]; HI2 = High[i+2]; LO2 = Low[i+2];
      OP1 = Open[i+1]; CL1 = Close[i+1]; HI1 = High[i+1];  LO1 = Low[i+1];
      
       if(Sistema1)
        {
         if(Open[i+1] > MA1[i+1] && Close[i+1] < MA1[i+1])
           {
            if(OP3 > MA1[i+1] && CL3 > MA1[i+1])
              {
               if(OP2 > MA1[i+1] && CL2 > MA1[i+1])
                 {
                  if(HI3 > MA1[i+1] && HI2 > MA1[i+1] && LO3 > MA1[i+1] && LO2 > MA1[i+1])
                    {
                     if(MA2[i+1] > MA1[i+1] && MA2[i] < MA1[i])
                       {
                        S_Sell[i+1]=Open[i+1] + Interval*Point;
                        if(Alerts)// Если включено в настройках
                          {
                           Alert(Symbol()," Cигнал на продажу ");
                          }
                       }
                    }
                 }
              }
           }
Тогда алерт выдается на каждом тике
 
Ihor Herasko #:

Да, так и есть. Выдается алерт по последнему найденному сигналу. Все потому, что с текущей свечей сравнивается какой-то timealert, а не время свечи сигнала.

Вместо:

Нужно:

Просто у меня сейчас по-моему итак написано

Если (условие 1)
{
если (условие 2)
{
Стрелка + Алерт;
}
}
или я не поняла Вашу мысль (Простите)
 
Natalya Smirnova #:


Если я вношу изменения и делаю так как Вы написали:

Тогда алерт выдается на каждом тике

Вы не весь код, указанный мною, вставили. Там две строки, а Вы вставили только одну.

В новом Вашем коде вместо:

if(Alerts)// Если включено в настройках
{
   Alert(Symbol()," Cигнал на продажу ");
}

нужно:

if (Alerts)// Если включено в настройках
   if (i == 0)
      Alert(Symbol()," Cигнал на продажу ");

ну или так, если нужно покороче:

if (Alerts && i == 0)
   Alert(Symbol()," Cигнал на продажу ");
 
Ihor Herasko #:

Вы не весь код, указанный мною, вставили. Там две строки, а Вы вставили только одну.

В новом Вашем коде вместо:

нужно:

ну или так, если нужно покороче:

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


Спасибо большое за уделенное время!

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