Если, вставить только PlaySound или Alert, то он будет трезвонить целый день на каждом
тике по сигналу.
Правильней будет подавать Alert, один раз в заданный промежуток времени (ИМХО).
Если ТаймФрейм меньше заданного промежутка, то 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)
Вот потом поставил полностью как 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() придется удалить.
Поэтому 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() придется удалить (?)
Вот если 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.wav будет указан - то да, может быть глюк из-за совместного открытия файла (и алертом и плейсаундом).. что-то я не въехал, почему Alert() придется удалить (?)
Ну, тогда всё хорошо, а то у меня почемуто Alert() и PlaySound() совместно не хотят работать. )
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
(пс. на еврогбп работает отттлично, если есть иные замечания то выскажите)