Куда тут вставить PlaySound("alert.wav"); ???

 
Покажите, плиз, куда в этом коде надо ( и как правильно) вставить команду на подачу звукового сигнала (?)
(пс. на еврогбп работает отттлично, если есть иные замечания то выскажите)

//+------------------------------------------------------------------+
//|                                       AltrTrend_Signal_v2_2.mq4  |
//|                                       Ramdass - Conversion only  |
//+------------------------------------------------------------------+
#property  copyright "Author - OlegVS, GOODMAN"
 /* 

    Индикатор, подающий сигналы о смене тренда. Зеленый кружочек - бычий тренд, красный - медвежий.

 

 */
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DeepSkyBlue
#property indicator_color2 OrangeRed
 
//---- input parameters
extern int K = 30;
extern double Kstop = 0.5;
extern int Kperiod = 150;
extern int PeriodADX = 14;
extern int CountBars = 100;
 
//---- buffers
double val1[];
double val2[];
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    string short_name;
    //---- indicator line
    IndicatorBuffers(1);
    SetIndexStyle(0,DRAW_ARROW,1,1);// Устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора.
    SetIndexArrow(0,241);
    IndicatorBuffers(2);
    SetIndexStyle(1,DRAW_ARROW,1,1);//1-не знаю,Значки,1-это нач.ширина стрелки,1-нач цвет
    SetIndexArrow(1,242);
    SetIndexBuffer(0,val1);
    SetIndexBuffer(1,val2);
    if(CountBars>=Bars) 
        CountBars=Bars;
    SetIndexDrawBegin(0, Bars - CountBars + PeriodADX );
    SetIndexDrawBegin(1, Bars - CountBars + PeriodADX );
    //----
    return(0);
  }
//+------------------------------------------------------------------+
//| AltrTrend_Signal_v2_2                                            |
//+------------------------------------------------------------------+
int start()
  {   
    int i, shift, counted_bars = IndicatorCounted();//Функция используется для оптимизации вычислений. Функция возвращает количество баров не измененных после последнего вызова индикатора. В большинстве подсчитанные бары не нуждаются в пересчете
    //---- проверка на возможные ошибки
    if(counted_bars<0) return(-1);
    //---- последний посчитанный бар будет пересчитан
    int i1, i2;
    double Range, AvgRange, smin, smax, SsMax, SsMin, SSP, price;
    bool uptrend, old;
    //----
    if(Bars <=PeriodADX  + 1) 
        return(0);
    //---- initial zero
    if(counted_bars < PeriodADX  + 1)
      {
        for(i = 1; i <= PeriodADX ; i++) 
            val1[CountBars - i] = 0.0;
        for(i = 1; i <= PeriodADX ; i++) 
            val2[CountBars-i] = 0.0;
      }
    //----
    for(shift = CountBars - PeriodADX ; shift >= 0; shift--) 
      { 
        SSP = MathCeil(Kperiod / iADX(NULL, 0, PeriodADX , PRICE_CLOSE, MODE_MAIN, 1));
           Range = 0;
           AvgRange = 0;
           for(i1 = shift; i1 <= shift + SSP; i1++)
                {
                  AvgRange = AvgRange + MathAbs(High[i1] - Low[i1]);
                }
           Range = AvgRange / (SSP + 1);
        //----
        SsMax = High[shift]; 
        SsMin = Low[shift]; 
        for(i2 = shift; i2 <= shift + SSP - 1; i2++)
          {
            price = High[i2];
            if(SsMax < price) 
                SsMax = price;
            price = Low[i2];
            if(SsMin >= price)  
                SsMin = price;
          }
        //----
        smin = SsMin + (SsMax - SsMin)*K / 100; 
        smax = SsMax - (SsMax - SsMin)*K / 100; 
           val1[shift] = 0;
           val2[shift] = 0;
           if(Close[shift] < smin)
                {
                  uptrend = false;
                }
           if(Close[shift] > smax)
                {
                  uptrend = true;
                }
        if(uptrend != old && uptrend == true) 
          {
            val1[shift] = Low[shift] - Range*Kstop;
          }
        if(uptrend != old && uptrend == false) 
          {
            val2[shift] = High[shift] + Range*Kstop;
          }
        old = uptrend;
 
      }
    return(0);
  }
//+------------------------------------------------------------------+
 
Если, вставить только PlaySound или Alert, то он будет трезвонить целый день на каждом
тике по сигналу.

Правильней будет подавать Alert, один раз в заданный промежуток времени (ИМХО).
Если ТаймФрейм меньше заданного промежутка, то Alert будет один раз в ТаймФрейм.
//+------------------------------------------------------------------+
//|                                 AltrTrend_Signal_v2_2_alert.mq4  |
//|                                       Ramdass - Conversion only  |
//+------------------------------------------------------------------+
#property  copyright "Author - OlegVS, GOODMAN"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DeepSkyBlue
#property indicator_color2 OrangeRed
#property indicator_width1 1
#property indicator_width2 1
 
//---- input parameters
extern bool Alert_message=true;
extern int  Time_alert_minutes=60; // Алерт будет подаваться один раз в 60 минут.
extern int K = 30;
extern double Kstop = 0.5;
extern int Kperiod = 150;
extern int PeriodADX = 14;
extern int CountBars = 100;
 
//---- buffers
double val1[];
double val2[];

double AlertTime;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    string short_name;
    //---- indicator line
    IndicatorBuffers(1);
    SetIndexStyle(0,DRAW_ARROW);
    SetIndexArrow(0,241);
    IndicatorBuffers(2);
    SetIndexStyle(1,DRAW_ARROW);
    SetIndexArrow(1,242);
    SetIndexBuffer(0,val1);
    SetIndexBuffer(1,val2);
    if(CountBars>=Bars) 
        CountBars=Bars;
    SetIndexDrawBegin(0, Bars - CountBars + PeriodADX );
    SetIndexDrawBegin(1, Bars - CountBars + PeriodADX );
    //----
    return(0);
  }
//+------------------------------------------------------------------+
//| AltrTrend_Signal_v2_2                                            |
//+------------------------------------------------------------------+
int start()
  {   
    int i, shift, counted_bars = IndicatorCounted();
    //---- 
    if(counted_bars<0) return(-1);
    //---- 
    int i1, i2, t_per;
    double Range, AvgRange, smin, smax, SsMax, SsMin, SSP, price;
    bool uptrend, old;
    //----
    if(Bars <=PeriodADX  + 1) 
        return(0);
    //----
    for(shift = CountBars - PeriodADX ; shift >= 0; shift--) 
      { 
        SSP = MathCeil(Kperiod / iADX(NULL, 0, PeriodADX , PRICE_CLOSE, MODE_MAIN, 1));
           Range = 0;
           AvgRange = 0;
           for(i1 = shift; i1 <= shift + SSP; i1++)
                {
                  AvgRange = AvgRange + MathAbs(High[i1] - Low[i1]);
                }
           Range = AvgRange / (SSP + 1);
        //----
        SsMax = High[shift]; 
        SsMin = Low[shift]; 
        for(i2 = shift; i2 <= shift + SSP - 1; i2++)
          {
            price = High[i2];
            if(SsMax < price) 
                SsMax = price;
            price = Low[i2];
            if(SsMin >= price)  
                SsMin = price;
          }
        //----
        smin = SsMin + (SsMax - SsMin)*K / 100; 
        smax = SsMax - (SsMax - SsMin)*K / 100; 
           val1[shift] = 0.0;
           val2[shift] = 0.0;
           if(Close[shift] < smin)
                {
                  uptrend = false;
                }
           if(Close[shift] > smax)
                {
                  uptrend = true;
                }
        if(uptrend != old && uptrend == true) 
          {
            val1[shift] = Low[shift] - Range*Kstop;
          }
        if(uptrend != old && uptrend == false) 
          {
            val2[shift] = High[shift] + Range*Kstop;
          }
        old = uptrend;
 
      }
//---- Alert
     if (Period()<Time_alert_minutes) t_per=Period(); else t_per=Time_alert_minutes; // Если ТФ<Time_alert, Алерт будет подаваться один раз в ТФ.
     if (Alert_message==true && CurTime()>AlertTime && val1[0]!=0.0)
     { 
     Alert(Symbol()," +++  BUY !!! +++");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     }
     
     if (Alert_message==true && CurTime()>AlertTime && val2[0]!=0.0)
     { 
     Alert(Symbol()," +++  SELL !!! +++");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     }      
    return(0);
  }
//+------------------------------------------------------------------+


 
Если я правильно понял что Вы хотите получить звуковой сигнал в момент появления графического сигнала то надо сделать так
if(uptrend != old && uptrend == true) 
          {
            val1[shift] = Low[shift] - Range*Kstop;
            PlaySound("alert.wav");
          }
        if(uptrend != old && uptrend == false) 
          {
            val2[shift] = High[shift] + Range*Kstop;
            PlaySound("alert.wav");
          }


 
Не, Jhonny, туда я уже вставлял - блимкает постоянно, вставил уже по Вашему посту - то же самое, блимкает и блимкает.
Вот потом поставил полностью как Ramdass написал ( сперва пробовал вариант Джонни, т.к. он мне больше понравился :)) - и все нормально.

Вот.

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

Вот тогда куда верно будет PlaySound ставить ? После Alert(Symbol()," +++ BUY\SELL !!! +++"); ? Так ? :)

Вот сейчас как (спасибо Ramdass и Jhonny)

//+------------------------------------------------------------------+
//|                                 AltrTrend_Signal_v2_2_alert.mq4  |
//|                                       Ramdass - Conversion only  |
//+------------------------------------------------------------------+
#property  copyright "Author - OlegVS, GOODMAN"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DeepSkyBlue
#property indicator_color2 OrangeRed
#property indicator_width1 1
#property indicator_width2 1
 
//---- input parameters
extern bool Alert_message=true;
extern int  Time_alert_minutes=60; // Алерт будет подаваться один раз в 60 минут.
extern int K = 30;
extern double Kstop = 0.5;
extern int Kperiod = 150;
extern int PeriodADX = 14;
extern int CountBars = 100;
 
//---- buffers
double val1[];
double val2[];

double AlertTime;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    string short_name;
    //---- indicator line
    IndicatorBuffers(1);
    SetIndexStyle(0,DRAW_ARROW);
    SetIndexArrow(0,241);
    IndicatorBuffers(2);
    SetIndexStyle(1,DRAW_ARROW);
    SetIndexArrow(1,242);
    SetIndexBuffer(0,val1);
    SetIndexBuffer(1,val2);
    if(CountBars>=Bars) 
        CountBars=Bars;
    SetIndexDrawBegin(0, Bars - CountBars + PeriodADX );
    SetIndexDrawBegin(1, Bars - CountBars + PeriodADX );
    //----
    return(0);
  }
//+------------------------------------------------------------------+
//| AltrTrend_Signal_v2_2                                            |
//+------------------------------------------------------------------+
int start()
  {   
    int i, shift, counted_bars = IndicatorCounted();
    //---- 
    if(counted_bars<0) return(-1);
    //---- 
    int i1, i2, t_per;
    double Range, AvgRange, smin, smax, SsMax, SsMin, SSP, price;
    bool uptrend, old;
    //----
    if(Bars <=PeriodADX  + 1) 
        return(0);
    //----
    for(shift = CountBars - PeriodADX ; shift >= 0; shift--) 
      { 
        SSP = MathCeil(Kperiod / iADX(NULL, 0, PeriodADX , PRICE_CLOSE, MODE_MAIN, 1));
           Range = 0;
           AvgRange = 0;
           for(i1 = shift; i1 <= shift + SSP; i1++)
                {
                  AvgRange = AvgRange + MathAbs(High[i1] - Low[i1]);
                }
           Range = AvgRange / (SSP + 1);
        //----
        SsMax = High[shift]; 
        SsMin = Low[shift]; 
        for(i2 = shift; i2 <= shift + SSP - 1; i2++)
          {
            price = High[i2];
            if(SsMax < price) 
                SsMax = price;
            price = Low[i2];
            if(SsMin >= price)  
                SsMin = price;
          }
        //----
        smin = SsMin + (SsMax - SsMin)*K / 100; 
        smax = SsMax - (SsMax - SsMin)*K / 100; 
           val1[shift] = 0.0;
           val2[shift] = 0.0;
           if(Close[shift] < smin)
                {
                  uptrend = false;
                }
           if(Close[shift] > smax)
                {
                  uptrend = true;
                }
        if(uptrend != old && uptrend == true) 
          {
            val1[shift] = Low[shift] - Range*Kstop;
            
          }
        if(uptrend != old && uptrend == false) 
          {
            val2[shift] = High[shift] + Range*Kstop;
            
          }
        old = uptrend;
 
      }
//---- Alert
     if (Period()<Time_alert_minutes) t_per=Period(); else t_per=Time_alert_minutes; // Если ТФ<Time_alert, Алерт будет подаваться один раз в ТФ.
     if (Alert_message==true && CurTime()>AlertTime && val1[0]!=0.0)
     { 
     Alert(Symbol()," +++  BUY !!! +++" , "  //AltrTrend_Signal_v2_2_alert");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     PlaySound("ok.wav");
     }
     
     if (Alert_message==true && CurTime()>AlertTime && val2[0]!=0.0)
     { 
     Alert(Symbol()," +++  SELL !!!   +++" , "  //AltrTrend_Signal_v2_2_alert");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     PlaySound("ok.wav");
     }      
    return(0);
  }
//+------------------------------------------------------------------+


 



Типа на месте ok.wav будет свой звук - еврод-р селл, евродоллр бай и т.д. и для каждой пары будет свой индик ( тока с разными wav-ами)

 
Функция Alert() - воспроизводит только файл "alert.wav" из папки x:\MetaTrader 4\sounds\.
Поэтому Alert() придется удалить.

//---- 
     if (Period()<Time_alert_minutes) t_per=Period(); else t_per=Time_alert_minutes;
     if (Alert_message==true && CurTime()>AlertTime && val1[0]!=0.0)
     { 
     //Alert(Symbol()," +++  BUY !!! +++");
     PlaySound("твой бай.wav");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     }
     
     if (Alert_message==true && CurTime()>AlertTime && val2[0]!=0.0)
     {
     //Alert(Symbol()," +++  SELL !!! +++"); 
     PlaySound("твой сел.wav");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     } 


 
Честно признаться я не долго разбирался в коде, не думал что все стрелочки перерисовываются на каждом баре думал что только последняя, а отсюда было и такое решение вот предлагаю вариант который блимкает при появлении новой стрелочки со временем большим чем у предыдущей. Еще раз скажу в логику расчета не вдавался сделал так и он у меня вроде работает

 datetime uplast=0;
 datetime downlast=0;


int init()
{............................

..................................

............................
}
int start()

{ Comment("");
..............

if(uptrend != old && uptrend == true) 
          {
            val1[shift] = Low[shift] - Range*Kstop;
            if(Time[shift]>uplast){Comment("ПУУУУУК!!!");PlaySound("ok.wav");uplast=Time[shift];}
            
          }
        if(uptrend != old && uptrend == false) 
          {
            val2[shift] = High[shift] + Range*Kstop;
         if(Time[shift]>downlast){Comment("ПИИИИК!!!");PlaySound("ok.wav");downlast=Time[shift];}
          }
........................



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

 
Стоп, не понял, а почему "придется" ?! . .. .. Вроде я и алерт и саунд оставил - все нормально - в окошке - дополнительно можно визуально посмотреть на каком инстр-те какой сиг, и в случае выключенного монитора - еще и ok.wav играет (правда почему-то еще то появления окна МТ4, если говорить про запуски МТ4), вроде вот это было бы неплохо .. (?)

Вот если alert.wav будет указан - то да, может быть глюк из-за совместного открытия файла (и алертом и плейсаундом).. что-то я не въехал, почему Alert() придется удалить (?)
 
Не, вроде оба варианта работают, ( только без comments на экране, и так кажный пиксель на счету ..)

//+------------------------------------------------------------------+
//|                                 AltrTrend_Signal_v2_2_alert.mq4  |
//|                                       Ramdass - Conversion only  |
//+------------------------------------------------------------------+
#property  copyright "Author - OlegVS, GOODMAN"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DeepSkyBlue
#property indicator_color2 OrangeRed
#property indicator_width1 1
#property indicator_width2 1
 
//---- input parameters
extern bool Alert_message=true;
extern int  Time_alert_minutes=60; // Алерт будет подаваться один раз в 60 минут.
extern int K = 30;
extern double Kstop = 0.5;
extern int Kperiod = 150;
extern int PeriodADX = 14;
extern int CountBars = 100;
 
//---- buffers
double val1[];
double val2[];

double AlertTime;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    string short_name;
    //---- indicator line
    IndicatorBuffers(1);
    SetIndexStyle(0,DRAW_ARROW);
    SetIndexArrow(0,241);
    IndicatorBuffers(2);
    SetIndexStyle(1,DRAW_ARROW);
    SetIndexArrow(1,242);
    SetIndexBuffer(0,val1);
    SetIndexBuffer(1,val2);
    if(CountBars>=Bars) 
        CountBars=Bars;
    SetIndexDrawBegin(0, Bars - CountBars + PeriodADX );
    SetIndexDrawBegin(1, Bars - CountBars + PeriodADX );
    //----
    return(0);
  }
//+------------------------------------------------------------------+
//| AltrTrend_Signal_v2_2                                            |
//+------------------------------------------------------------------+
int start()
  {   
    int i, shift, counted_bars = IndicatorCounted();
    //---- 
    if(counted_bars<0) return(-1);
    //---- 
    int i1, i2, t_per;
    double Range, AvgRange, smin, smax, SsMax, SsMin, SSP, price;
    bool uptrend, old;
    //----
    if(Bars <=PeriodADX  + 1) 
        return(0);
    //----
    for(shift = CountBars - PeriodADX ; shift >= 0; shift--) 
      { 
        SSP = MathCeil(Kperiod / iADX(NULL, 0, PeriodADX , PRICE_CLOSE, MODE_MAIN, 1));
           Range = 0;
           AvgRange = 0;
           for(i1 = shift; i1 <= shift + SSP; i1++)
                {
                  AvgRange = AvgRange + MathAbs(High[i1] - Low[i1]);
                }
           Range = AvgRange / (SSP + 1);
        //----
        SsMax = High[shift]; 
        SsMin = Low[shift]; 
        for(i2 = shift; i2 <= shift + SSP - 1; i2++)
          {
            price = High[i2];
            if(SsMax < price) 
                SsMax = price;
            price = Low[i2];
            if(SsMin >= price)  
                SsMin = price;
          }
        //----
        smin = SsMin + (SsMax - SsMin)*K / 100; 
        smax = SsMax - (SsMax - SsMin)*K / 100; 
           val1[shift] = 0.0;
           val2[shift] = 0.0;
           if(Close[shift] < smin)
                {
                  uptrend = false;
                }
           if(Close[shift] > smax)
                {
                  uptrend = true;
                }
        if(uptrend != old && uptrend == true) 
          {
            val1[shift] = Low[shift] - Range*Kstop;
            
          }
        if(uptrend != old && uptrend == false) 
          {
            val2[shift] = High[shift] + Range*Kstop;
            
          }
        old = uptrend;
 
      }
//---- Alert
     if (Period()<Time_alert_minutes) t_per=Period(); else t_per=Time_alert_minutes; // Если ТФ<Time_alert, Алерт будет подаваться один раз в ТФ.
     if (Alert_message==true && CurTime()>AlertTime && val1[0]!=0.0)
     { 
     Alert(Symbol()," +++  BUY !!! +++" , "  //AltrTrend_Signal_v2_2_alert");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     PlaySound("ok.wav");
     }
     
     if (Alert_message==true && CurTime()>AlertTime && val2[0]!=0.0)
     { 
     Alert(Symbol()," +++  SELL !!!   +++" , "  //AltrTrend_Signal_v2_2_alert");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     PlaySound("ok.wav");
     }      
    return(0);
  }
//+------------------------------------------------------------------+


 


Это по Ramdass-у
А вот по Джонни

//+------------------------------------------------------------------+
//|                                       AltrTrend_Signal_v2_2.mq4  |
//|                                       Ramdass - Conversion only  |
//+------------------------------------------------------------------+
#property  copyright "Author - OlegVS, GOODMAN"
 /* 

    Индикатор, подающий сигналы о смене тренда. Зеленый кружочек - бычий тренд, красный - медвежий.

 

 */
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 DeepSkyBlue
#property indicator_color2 OrangeRed
 
//---- input parameters
extern bool Alert_message=true;
extern int  Time_alert_minutes=60; // Алерт будет подаваться один раз в 60 минут.
extern int K = 30;
extern double Kstop = 0.5;
extern int Kperiod = 150;
extern int PeriodADX = 14;
extern int CountBars = 100;
 
//---- buffers
double val1[];
double val2[];
datetime uplast=0;
datetime downlast=0; 
double AlertTime;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
    string short_name;
    //---- indicator line
    IndicatorBuffers(1);
    SetIndexStyle(0,DRAW_ARROW,1,1);// Устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора.
    SetIndexArrow(0,241);
    IndicatorBuffers(2);
    SetIndexStyle(1,DRAW_ARROW,1,1);//1-не знаю,Значки,1-это нач.ширина стрелки,1-нач цвет
    SetIndexArrow(1,242);
    SetIndexBuffer(0,val1);
    SetIndexBuffer(1,val2);
    if(CountBars>=Bars) 
        CountBars=Bars;
    SetIndexDrawBegin(0, Bars - CountBars + PeriodADX );
    SetIndexDrawBegin(1, Bars - CountBars + PeriodADX );
    //----
    return(0);
  }
//+------------------------------------------------------------------+
//| AltrTrend_Signal_v2_2                                            |
//+------------------------------------------------------------------+
int start()
  {   
    int i, t_per, shift, counted_bars = IndicatorCounted();//Функция используется для оптимизации вычислений. Функция возвращает количество баров не измененных после последнего вызова индикатора. В большинстве подсчитанные бары не нуждаются в пересчете
    //---- проверка на возможные ошибки
    if(counted_bars<0) return(-1);
    //---- последний посчитанный бар будет пересчитан
    int i1, i2;
    double Range, AvgRange, smin, smax, SsMax, SsMin, SSP, price;
    bool uptrend, old;
    //----
    if(Bars <=PeriodADX  + 1) 
        return(0);
    //---- initial zero
    if(counted_bars < PeriodADX  + 1)
      {
        for(i = 1; i <= PeriodADX ; i++) 
            val1[CountBars - i] = 0.0;
        for(i = 1; i <= PeriodADX ; i++) 
            val2[CountBars-i] = 0.0;
      }
    //----
    for(shift = CountBars - PeriodADX ; shift >= 0; shift--) 
      { 
        SSP = MathCeil(Kperiod / iADX(NULL, 0, PeriodADX , PRICE_CLOSE, MODE_MAIN, 1));
           Range = 0;
           AvgRange = 0;
           for(i1 = shift; i1 <= shift + SSP; i1++)
                {
                  AvgRange = AvgRange + MathAbs(High[i1] - Low[i1]);
                }
           Range = AvgRange / (SSP + 1);
        //----
        SsMax = High[shift]; 
        SsMin = Low[shift]; 
        for(i2 = shift; i2 <= shift + SSP - 1; i2++)
          {
            price = High[i2];
            if(SsMax < price) 
                SsMax = price;
            price = Low[i2];
            if(SsMin >= price)  
                SsMin = price;
          }
        //----
        smin = SsMin + (SsMax - SsMin)*K / 100; 
        smax = SsMax - (SsMax - SsMin)*K / 100; 
           val1[shift] = 0;
           val2[shift] = 0;
           if(Close[shift] < smin)
                {
                  uptrend = false;
                }
           if(Close[shift] > smax)
                {
                  uptrend = true;
                }
        if(uptrend != old && uptrend == true) 
          {
            val1[shift] = Low[shift] - Range*Kstop;
            if(Time[shift]>uplast){PlaySound("ok.wav");uplast=Time[shift];}
          }
        if(uptrend != old && uptrend == false) 
          {
            val2[shift] = High[shift] + Range*Kstop;
            if(Time[shift]>downlast){PlaySound("ok.wav");downlast=Time[shift];}
          }
        old = uptrend;
 
      }
      //---- Alert
     if (Period()<Time_alert_minutes) t_per=Period(); else t_per=Time_alert_minutes; // Если ТФ<Time_alert, Алерт будет подаваться один раз в ТФ.
     if (Alert_message==true && CurTime()>AlertTime && val1[0]!=0.0)
     { 
     Alert(Symbol()," +++  BUY !!! +++" , "  //AltrTrend_Signal_v2_2_alert");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     
     }
     
     if (Alert_message==true && CurTime()>AlertTime && val2[0]!=0.0)
     { 
     Alert(Symbol()," +++  SELL !!!   +++" , "  //AltrTrend_Signal_v2_2_alert");
     AlertTime=CurTime() + (t_per - MathMod(TimeMinute(CurTime()), t_per))*60;
     
     }      
    return(0);
  }
//+------------------------------------------------------------------+



меняемся оптом... тьфу.. опытом
добавляем SMMA, WMMA, смотрим их отрицания входов из-за ..

 
Стоп, не понял, а почему "придется" ?! . .. .. Вроде я и алерт и саунд оставил - все нормально - в окошке - дополнительно можно визуально посмотреть на каком инстр-те какой сиг, и в случае выключенного монитора - еще и ok.wav играет (правда почему-то еще то появления окна МТ4, если говорить про запуски МТ4), вроде вот это было бы неплохо .. (?)

Вот если alert.wav будет указан - то да, может быть глюк из-за совместного открытия файла (и алертом и плейсаундом).. что-то я не въехал, почему Alert() придется удалить (?)


Ну, тогда всё хорошо, а то у меня почемуто Alert() и PlaySound() совместно не хотят работать. )
Причина обращения: