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> - объявите на глобальном уровне программы.
Последний, третий цикл
надо запускать по условному оператору, например
Когда какое-то условие выполнено, то запомнить, где ...
Это сократит лишнюю "долбежку" буферов стрелочками и сигнал будет звучать только один раз.
Переменную <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"); }
Если это так, то почему стрелка рисуется один раз, а звук, который сидит в том же условии, проигрывается много раз?
Большое спасибо. Попробовал - долбежка заметно убавилась. Сигналы еще появляются и без стрелок, но несравненно реже.
Но у меня еще одна неясность. Если я правильно понял, стрелки формируются по условию:
Если это так, то почему стрелка рисуется один раз, а звук, который сидит в том же условии, проигрывается много раз?
Уберите PlaySound("alert.wav"); из цикла
***
Если это так, то почему стрелка рисуется один раз, а звук, который сидит в том же условии, проигрывается много раз?
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"); из цикла - вынес за него, но изменений не заметил.
Вообще запутался ...
To Vinin
Убрал PlaySound("news.wav"); из цикла - вынес за него, но изменений не заметил.
Вообще запутался ...
Новый код покажите
Новый код в прикрепленном файле.
Попробуй, я не смотрел
//+------------------------------------------------------------------+ //| 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--) на том же баре.
Дальше разбирайтесь сами. Ничего сложного нет, причина элементарная, с помощью отладочных операторов вы ее поймете.
Ребята, небольшое замечание: - операторные скобки {...} нужны, если операторов несколько.
Один оператор заключать в скобки нет смысла, только загромождаете текст.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Использую индикатор T3MA_ALARM, который стрелками показывает точки изменения направления тренда.
Условие для отображения одной из стрелок выглядит так:
Я решил добавить звуковой сигнал при появлении стрелки и добавил функцию PlaySound:
Однако звук воспроизводится почти при каждом движении цены, т.е. вместо одного сигнала при появлении стрелки слышна серия сигналов,
не зависимо от того появилась стрелка или нет.
Может ли кто-нибудь объяснить, где ошибка и как получить требуемый результат.
Индикатор T3MA_ALARM в прикрепленном файле.
Заранее спасибо.