//+------------------------------------------------------------------+
//| Envelopes.mq4 |
//| Copyright © 2005, MetaQuotes Software Corp. |
//| https://www.metaquotes.net// |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link "https://www.metaquotes.net//"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- indicator parameters
extern int MA_Period=14;
extern int MA_Shift=0;
extern int MA_Method=0;
extern int Applied_Price=0;
extern double Deviation=0.1;
//---- indicator buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
int draw_begin;
string short_name;
//---- drawing settings
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexShift(0,MA_Shift);
SetIndexShift(1,MA_Shift);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
if(MA_Period<2) MA_Period=14;
draw_begin=MA_Period-1;
//---- indicator short name
IndicatorShortName("Env("+MA_Period+")");
SetIndexLabel(0,"Env("+MA_Period+")Upper");
SetIndexLabel(1,"Env("+MA_Period+")Lower");
SetIndexDrawBegin(0,draw_begin);
SetIndexDrawBegin(1,draw_begin);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexBuffer(1,ExtMapBuffer2);
if(Deviation<0.1) Deviation=0.1;
if(Deviation>100.0) Deviation=100.0;
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit;
if(Bars<=MA_Period) return(0);
ExtCountedBars=IndicatorCounted();
//---- check for possible errors
if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
if (ExtCountedBars>0) ExtCountedBars--;
limit=Bars-ExtCountedBars;
//---- EnvelopesM counted in the buffers
for(int i=0; i<limit; i++)
{
ExtMapBuffer1[i] = (1+Deviation/100)*iMA(NULL,0,MA_Period,0,MA_Method,Applied_Price,i);
ExtMapBuffer2[i] = (1-Deviation/100)*iMA(NULL,0,MA_Period,0,MA_Method,Applied_Price,i);
}
//---- done
return(0);
}
//+------------------------------------------------------------------+
А чем встроенный - iEnvelopes(...) - не устраивает? )))
double iEnvelopes( string symbol, int timeframe, int ma_period, int ma_method, int ma_shift, int applied_price, double deviation, int mode, int shift)
Расчет индикатора Envelopes.
Параметры:
symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
ma_period - Период усреднения основной линии индикатора.
ma_method - Метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average).
ma_shift - Сдвиг индикатора относительно ценового графика.
applied_price - Используемая цена. Может быть любой из ценовых констант.
deviation - Отклонение от основной линии в процентах.
mode - Индекс линии индикатора. Может быть любым из значений идентификаторов линий индикаторов.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).
Пример:
double val=iEnvelopes(NULL, 0, 13,MODE_SMA,10,PRICE_CLOSE,0.2,MODE_UPPER,0);
===
Видите ли, если вам не нужно динамически менять входные параметры (например, период МА) из вашего кода, то по быстродействию лучше всего использовать встроенные МТ индикаторы.
Ежели вы меняете в процессе работы вашего индикатора параметры вызываемого из него индюка, то тогда последний надо внедрять в ваш код. Иначе полные тормоза.
А чем встроенный - iEnvelopes(...) - не устраивает? )))
double iEnvelopes( string symbol, int timeframe, int ma_period, int ma_method, int ma_shift, int applied_price, double deviation, int mode, int shift)
Расчет индикатора Envelopes.
Параметры:
symbol - Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe - Период. Может быть одним из периодов графика. 0 означает период текущего графика.
ma_period - Период усреднения основной линии индикатора.
ma_method - Метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average).
ma_shift - Сдвиг индикатора относительно ценового графика.
applied_price - Используемая цена. Может быть любой из ценовых констант.
deviation - Отклонение от основной линии в процентах.
mode - Индекс линии индикатора. Может быть любым из значений идентификаторов линий индикаторов.
shift - Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).
Пример:
double val=iEnvelopes(NULL, 0, 13,MODE_SMA,10,PRICE_CLOSE,0.2,MODE_UPPER,0);
===
Видите ли, если вам не нужно динамически менять входные параметры (например, период МА) из вашего кода, то по быстродействию лучше всего использовать встроенные МТ индикаторы.
Ежели вы меняете в процессе работы вашего индикатора параметры вызываемого из него индюка, то тогда последний надо внедрять в ваш код. Иначе полные тормоза.
Спасибо! Как-то руки к этому индикатору не доходили-о всех индикаторах и для чего они нужны не знаю. Принцип в том что идут три ЕМА, МА... линии центральная и две отклоненные по оси Х в процентном соотношении.
Добавил ЕМА к Envelopes получилось три линии.
===
Видите ли, если вам не нужно динамически менять входные параметры (например, период МА) из вашего кода, то по быстродействию лучше всего использовать встроенные МТ индикаторы.
Ежели вы меняете в процессе работы вашего индикатора параметры вызываемого из него индюка, то тогда последний надо внедрять в ваш код. Иначе полные тормоза.Не совсем понял. Если один рас подобрал параметры под график? как лучше сделать?
ок. Например, нужно сделать адаптируемый под волатильность конверт. Пишется индикатор, где вычисляется текущая волатильность (например, по ATR) и в зависимость от нее ставится период МА конверта. Т.е. входной параметр конверта становится динамическим. Так вот, если просто передавать этот меняющийся параметр в iEnvelopes из кода, то будут тормоза, т.к. при каждом изменении параметра конверт будет пересчитываться по всей истории. Если же внедрить код конверта в код этого адаптивного индикатора, то проблема снимается. Но! Тогда нужно также внедрять и код МА, т.к. там, кроме МА и процентного ее сдвига нет ничего. Это понятно?
А если вы не используете такие динамические параметры, то используйте встроенный iEnvelopes. Это будет самый быстрый вариант.
ок. Например, нужно сделать адаптируемый под волатильность конверт. Пишется индикатор, где вычисляется текущая волатильность (например, по ATR) и в зависимость от нее ставится период МА конверта. Т.е. входной параметр конверта становится динамическим. Так вот, если просто передавать этот меняющийся параметр в iEnvelopes из кода, то будут тормоза, т.к. при каждом изменении параметра конверт будет пересчитываться по всей истории. Если же внедрить код конверта в код этого адаптивного индикатора, то проблема снимается. Но! Тогда нужно также внедрять и код МА, т.к. там, кроме МА и процентного ее сдвига нет ничего. Это понятно?
А если вы не используете такие динамические параметры, то используйте встроенный iEnvelopes. Это будет самый быстрый вариант.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте! Помогите сделать конверт с МА !
Что, где нужно поменять или добавить
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 MediumTurquoise
#property indicator_color3 MediumTurquoise
//---- indicator parameters
extern int MA_Period=13;
extern int MA_Shift=0;
extern int MA_Method=0;
extern int UP=0; //---верхняя линия
extern int Doun=0; //---нижняя линия
//---- indicator buffers
double ExtMapBuffer[], ExtMapBuffer_1[], ExtMapBuffer_2[];
//----
int ExtCountedBars=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
int draw_begin;
string short_name;
//---- drawing settings
SetIndexStyle(0,DRAW_LINE);
SetIndexShift(0,MA_Shift);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
if(MA_Period<2) MA_Period=13;
draw_begin=MA_Period-1;
//---- indicator short name
switch(MA_Method)
{
case 1 : short_name="EMA("; draw_begin=0; break;
case 2 : short_name="SMMA("; break;
case 3 : short_name="LWMA("; break;
default :
MA_Method=0;
short_name="SMA(";
}
IndicatorShortName(short_name+MA_Period+")");
SetIndexDrawBegin(0,draw_begin);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer);
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
if(Bars<=MA_Period) return(0);
ExtCountedBars=IndicatorCounted();
//---- check for possible errors
if (ExtCountedBars<0) return(-1);
//---- last counted bar will be recounted
if (ExtCountedBars>0) ExtCountedBars--;
//----
switch(MA_Method)
{
case 0 : sma(); break;
case 1 : ema(); break;
case 2 : smma(); break;
case 3 : lwma();
}
//---- done
return(0);
}
//+------------------------------------------------------------------+
//| Simple Moving Average |
//+------------------------------------------------------------------+
void sma()
{
double sum=0;
int i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
if(pos<MA_Period) pos=MA_Period;
for(i=1;i<MA_Period;i++,pos--)
sum+=Close[pos];
//---- main calculation loop
while(pos>=0)
{
sum+=Close[pos];
ExtMapBuffer[pos]=sum/MA_Period;
sum-=Close[pos+MA_Period-1];
pos--;
}
//---- zero initial bars
if(ExtCountedBars<1)
for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
}
//+------------------------------------------------------------------+
//| Exponential Moving Average |
//+------------------------------------------------------------------+
void ema()
{
double pr=2.0/(MA_Period+1);
int pos=Bars-2;
if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
//---- main calculation loop
while(pos>=0)
{
if(pos==Bars-2) ExtMapBuffer[pos+1]=Close[pos+1];
ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
pos--;
}
}
//+------------------------------------------------------------------+
//| Smoothed Moving Average |
//+------------------------------------------------------------------+
void smma()
{
double sum=0;
int i,k,pos=Bars-ExtCountedBars+1;
//---- main calculation loop
pos=Bars-MA_Period;
if(pos>Bars-ExtCountedBars) pos=Bars-ExtCountedBars;
while(pos>=0)
{
if(pos==Bars-MA_Period)
{
//---- initial accumulation
for(i=0,k=pos;i<MA_Period;i++,k++)
{
sum+=Close[k];
//---- zero initial bars
ExtMapBuffer[k]=0;
}
}
else sum=ExtMapBuffer[pos+1]*(MA_Period-1)+Close[pos];
ExtMapBuffer[pos]=sum/MA_Period;
pos--;
}
}
//+------------------------------------------------------------------+
//| Linear Weighted Moving Average |
//+------------------------------------------------------------------+
void lwma()
{
double sum=0.0,lsum=0.0;
double price;
int i,weight=0,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
if(pos<MA_Period) pos=MA_Period;
for(i=1;i<=MA_Period;i++,pos--)
{
price=Close[pos];
sum+=price*i;
lsum+=price;
weight+=i;
}
//---- main calculation loop
pos++;
i=pos+MA_Period;
while(pos>=0)
{
ExtMapBuffer[pos]=sum/weight;
if(pos==0) break;
pos--;
i--;
price=Close[pos];
sum=sum-lsum+price*MA_Period;
lsum-=Close[i];
lsum+=price;
}
//---- zero initial bars
if(ExtCountedBars<1)
for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
}
//+------------------------------------------------------------------+