Помогите разобраться с алертом для индикатора - страница 2

 

Честно говоря я уже пробовал эту переменную. Но вставлял условие в эту часть кода индикатора:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalculateVolume(const int nPosition,
                     const int nRatesCount,
                     const long &SrcBuffer[])
  {
   ExtVolumesBuffer[0]=(double)SrcBuffer[0];
   ExtColorsBuffer[0]=0.0;
//---
   for(int i=nPosition;i<nRatesCount && !IsStopped();i++)
     {
      //--- get some data from src buffer
      double dCurrVolume=(double)SrcBuffer[i];
      double dPrevVolume=(double)SrcBuffer[i-1];
      //--- calculate indicator
      ExtVolumesBuffer[i]=dCurrVolume;
      if(dCurrVolume>dPrevVolume)
         ExtColorsBuffer[i]=0.0;
      else
         ExtColorsBuffer[i]=1.0;
     }
//---
      if(ExtVolumesBuffer[0]>level )
        {
      if(On_Play_Sound) PlaySound(NameFileSound);
      if(On_Alert) Alert("Alert!");
        }
  }
//----  
//+------------------------------------------------------------------+

Компилирую. Сохраняю. Кидаю на график. С условиями level=100. Т.е. получается что сигнал должен сработать при текущем значении тикового Volume в баре>100. Но он срабатывает при каждом изменении текущего Volume на единицу. При текущем  значении volume в баре=80. Т.е. условие не выполняется. Или я не в ту часть кода залез? Но в любом случае спасибо что помогаете вникнуть.


 

 

При сравнении значения данного индикатора сравнивать значение ExtVolumesBuffer[0] некорректно. Так как в данном случае нулевой элемент - это самый первый слева элемент (подробнее Доступ к таймсериям и индикаторам).

Проверить данный индикатор на направление индексации можно так:

//--- starting work
   int start=prev_calculated-1;
//--- correct position
   if(start<1) start=1;
//--- main cycle
   Print("tick_volume AsSeries - ",ArrayGetAsSeries(tick_volume));
   if(InpVolumeType==VOLUME_TICK)
      CalculateVolume(start,rates_total,tick_volume);
   else

 

Сама проверка преодоления условия  будет выглядеть так:

//---
   int i;
   for(i=nPosition;i<nRatesCount && !IsStopped();i++)
     {
      //--- get some data from src buffer
      double dCurrVolume=(double)SrcBuffer[i];
      double dPrevVolume=(double)SrcBuffer[i-1];
      //--- calculate indicator
      ExtVolumesBuffer[i]=dCurrVolume;
      if(dCurrVolume>dPrevVolume)
         ExtColorsBuffer[i]=0.0;
      else
         ExtColorsBuffer[i]=1.0;
     }
//---
   if((int)ExtVolumesBuffer[i-1]>level)
     {
      PlaySound("alert.wav");
      //Print("Внимание!");
      //if(On_Play_Sound) PlaySound(NameFileSound);
      //if(On_Alert) Alert("Alert!");
     }
//---

 Теперь после выполнения условия проверки на каждом тике будет сигнал.

 
Разобрался! Спасибо! Хотя все оказалось несколько сложнее чем я думал. Буду копать дальше. Уверен что тема окажется полезной тем кто захочет по аналогии вставить сигнал в любой другой индикатор на схожих принципах работы.
Причина обращения: