Вопрос по функции PlaySound

 

Использую индикатор  T3MA_ALARM, который стрелками показывает точки изменения направления тренда.

Условие для отображения одной из стрелок выглядит так:

if(y0[i+shift]-y1[i+1+shift]<0 && y1[i+1+shift]-y2[i+2+shift]>0){BufferDn[i+1]=High[i+1]+st*Point;}

Я решил добавить звуковой сигнал при появлении стрелки и добавил функцию  PlaySound:

if(y0[i+shift]-y1[i+1+shift]<0 && y1[i+1+shift]-y2[i+2+shift]>0)

         {

            BufferDn[i+1]=High[i+1]+st*Point;

            PlaySound("alert.wav");

         }  

Однако звук воспроизводится почти при каждом движении цены, т.е. вместо одного сигнала при появлении стрелки слышна серия сигналов,

не зависимо от того появилась стрелка или нет.

Может ли кто-нибудь объяснить, где ошибка и как получить требуемый результат.

Индикатор T3MA_ALARM в прикрепленном файле.

Заранее спасибо. 

Файлы:
 
Последний, третий цикл
for(i=limit1; i>=0; i--) 

надо запускать по условному оператору, например

if (last_Alert != Bars) 
for(i=limit1; i>=0; i--)

Когда какое-то условие выполнено, то запомнить, где ...
{
BufferDn[i+1]=High[i+1]+st*Point; // или BufferUp ...
PlaySound("alert.wav");
last_Alert = Bars;
} 

Это сократит лишнюю "долбежку" буферов стрелочками и сигнал будет звучать только один раз.
Переменную <last_Alert> - объявите на глобальном уровне программы.
 
prorab:
Последний, третий цикл

надо запускать по условному оператору, например


Когда какое-то условие выполнено, то запомнить, где ...
Это сократит лишнюю "долбежку" буферов стрелочками и сигнал будет звучать только один раз.
Переменную <last_Alert> - объявите на глобальном уровне программы.


Большое спасибо. Попробовал - долбежка заметно убавилась. Сигналы еще появляются и без стрелок, но несравненно реже. 

Но у меня еще одна неясность. Если я правильно понял, стрелки формируются по условию:

 if(y0[i+shift]-y1[i+1+shift]<0 && y1[i+1+shift]-y2[i+2+shift]>0)
            {
               BufferDn[i+1]=High[i+1]+st*Point;
               PlaySound("alert.wav");
            }

Если это так, то почему стрелка рисуется один раз, а звук, который сидит в том же условии, проигрывается много раз?

 
genmish:


Большое спасибо. Попробовал - долбежка заметно убавилась. Сигналы еще появляются и без стрелок, но несравненно реже. 

Но у меня еще одна неясность. Если я правильно понял, стрелки формируются по условию:

Если это так, то почему стрелка рисуется один раз, а звук, который сидит в том же условии, проигрывается много раз?


Уберите PlaySound("alert.wav"); из цикла
 
genmish:

***

Если это так, то почему стрелка рисуется один раз, а звук, который сидит в том же условии, проигрывается много раз?

Еще раз, внимательно (!), прочитайте мой пост.
if(y0[i+shift]-y1[i+1+shift]<0 && y1[i+1+shift]-y2[i+2+shift]>0)
{
 BufferDn[i+1]=High[i+1]+st*Point;
 PlaySound("alert.wav");
 last_Alert = Bars;
}

... эта глобальная переменная (и условный оператор) - закрывает/прекращает дальнейшее  исполнение цикла на текущем баре.

После однократного выполнения условия, естественно.

 

Нет, из вашего поста все ясно - это стандартный прием для однократного исполнения.

Но если убрать из условия PlaySound и   last_Alert  , то стрелки рисуются в основном там же. Для них ничего не поменялось.

Вопрос мой в том, почему last_Alert влияет только на звук? Или я чего-то не понимаю.

Если две функции сидят в одном условии, значит и выполняться должны все время вместе ,

а не так, чтоб одна выполнялась 2 раза а другая 22 раза.  Я должен слышать звук в момент, когда появляется стрелка

и если стрелки нет, то и звука не должно быть, правильно? 

А после добавления last_Alert количество ненужных срабатываний звука очень сильно сократилось,

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

описывается, а не в этом условии?

Прошу прощения за тугодумство, но хотелось бы понять, а не в слепую.

Спасибо. 

 

To Vinin

Убрал PlaySound("news.wav"); из цикла - вынес за него, но изменений не заметил.

Вообще запутался ...

 
genmish:

To Vinin

Убрал PlaySound("news.wav"); из цикла - вынес за него, но изменений не заметил.

Вообще запутался ...


Новый код покажите
 
Новый код в прикрепленном файле.
Файлы:
 
genmish:
Новый код в прикрепленном файле.


Попробуй, я не смотрел

//+------------------------------------------------------------------+
//|                                                   T3MA_ALARM.mq4 |
//|                                     Copyright © 2011, Martingeil |
//|                                                    fx.09@mail.ru | 
//+------------------------------------------------------------------+
//исправленный Martingeil, теперь можно в тестере увидеть его стрелки.
#property copyright "Copyright © 2011, Martingeil"
#property link      "fx.09@mail.ru"

//---- indicator settings
#property  indicator_chart_window
#property  indicator_buffers 2
#property  indicator_color1  Blue
#property  indicator_color2  Red
//---- indicator parameters
extern int  period = 7; //12
extern int  shift  = 0; //сдвиг по бару
//---- indicator buffers
double BufferUp[],BufferDn[];
int q,last_Alert,st=5;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_ARROW,2);
   SetIndexArrow(0,233);
   SetIndexStyle(1,DRAW_ARROW,2);
   SetIndexArrow(1,234);   
   
   SetIndexBuffer(0,BufferUp);//стрелка синяя верх
   SetIndexBuffer(1,BufferDn);//стрелка красная вниз
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("T3MA-ALARM ("+period+")");
//---- initialization done
if(Digits==3 || Digits==5) q=10; 
st=st*q;
return(0);}

int deinit()
{
ObjectDelete("low");
ObjectDelete("high");  
}  
//+----------------------------------------------------------------------+
//| Moving Average of Oscillator                                         |
//+----------------------------------------------------------------------+
int start()
  {
   bool bPlay=false;
   //---- ArraySetAsSeries --------------------------------------------------  
   double Ma[500],MaOn[500];
   double y0[500],y1[500],y2[500];
   int    i,limit=ArraySize(Ma), s; 
   ArraySetAsSeries(Ma,true);
   //---- IndicatorCounted --------------------------------------------------
   int    counted_bars=IndicatorCounted();
   int    limit1=Bars-counted_bars;
   if (limit1>1){limit1=Bars-period-1;} 
   //---- EMA --------------------------------------------------------------- 
   for(i=limit1; i>=0; i--)  Ma[i]  =iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,i);
   for(i=limit1; i>=0; i--)  MaOn[i]=iMAOnArray(Ma,limit,period,0,MODE_EMA,i); 
   
   if (last_Alert != Bars)
     {
       for(i=limit1; i>=0; i--)
         {   
           y0[i+shift]=MaOn[i+shift];
           y1[i+1+shift]=MaOn[i+1+shift];
           y2[i+2+shift]=MaOn[i+2+shift];
           
           if(y0[i+shift]-y1[i+1+shift]<0 && y1[i+1+shift]-y2[i+2+shift]>0)
             {
               BufferDn[i+1]=High[i+1]+st*Point;
    //           PlaySound("alert.wav");
               last_Alert = Bars;
            }
          if(y0[i+shift]-y1[i+1+shift]>0 && y1[i+1+shift]-y2[i+2+shift]<0)
          {
               BufferUp[i+1]=Low[i+1]-st*Point;
    //           PlaySound("news.wav");
               last_Alert = Bars;
         } 
   //---- Signal Trend Up || Dn ---------------------------------------------   
          if(y0[i]-y1[i+1]>0) Comment ("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
      "   SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n BUY TREND ",DoubleToStr(Close[i],Digits));
      
          else if(y0[i]-y1[i+1]<0) Comment ("\n SWAPLONG = ",MarketInfo(Symbol(),MODE_SWAPLONG),
      "   SWAPSHORT = ",MarketInfo(Symbol(),MODE_SWAPSHORT),"\n SELL TREND ",DoubleToStr(Close[i],Digits)); 
      } 
     PlaySound("alert.wav");
}

   if(BufferDn[0]>0 || BufferUp[0]|>0)  PlaySound("alert.wav");



//---- done
return(0);}
//+---------------------------------------------------------------------+
 
Геннадий, я исправил несколько ошибок, добавил то, что вы просили и пару операторов для отладки.
last_Alert, в принципе, достаточно сделать статической переменной.
Эта переменная не влияет на звук, она просто запрещает запускать третий цикл for(i=limit1; i>=0; i--) на том же баре.
Дальше разбирайтесь сами. Ничего сложного нет, причина элементарная, с помощью отладочных операторов  вы ее поймете.

Ребята, небольшое замечание: - операторные скобки {...} нужны, если операторов несколько.
Один оператор заключать в скобки нет смысла, только загромождаете текст.
Файлы:
Причина обращения: