Если, вставить только 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+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
(пс. на еврогбп работает отттлично, если есть иные замечания то выскажите)
//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+