dynamic_zone_ma_rsi_adaptive_macd_ver_3.mq5
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «dynamic_zone_ma_rsi_adaptive_macd_ver_3.mq5» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор рассчитывает адаптивный MACD на основе двух RSI-процедур с настраиваемыми параметрами, методов расчёта и ценовых типов. Основная линия формируется как разность двух сглаженных RSI-значений, а сигнал — через выбранный тип скользящей средней. Для определения динамической зоны используется внешняя библиотека dynamicZone.dll, которая вычисляет уровень на основе истории массива MACD.
Индикатор отображает три линии в отдельном окне: основную линию MACD (серебристая пунктирная), сигнальную линию (красная пунктирная) и уровни динамической зоны (зелёные). Тренд определяется по соотношению значения MACD с динамическим уровнем: при превышении уровня вверх линия рисуется одним цветом, при недостижении — другим.
Поддерживается работа на различных таймфреймах с возможностью интерполяции данных при пересчёте с более высокого таймфрейма на текущий. Внутренне используются пользовательские реализации множества типов скользящих средних и вариантов RSI, включая T3 и RSX.
Настройки программы
| Настройка | Описание |
|---|---|
| TimeFrame | Таймфрейм — Таймфрейм, на котором рассчитывается индикатор. При значении -99 включается режим отображения баров. |
| RsiPeriod1 | Период RSI 1 — Период расчёта первого RSI. |
| Speed1 | Скорость 1 — Коэффициент сглаживания (скорость) для первого RSI-процесса. |
| RsiMethod1 | Метод RSI 1 — Метод расчёта первого RSI: стандартный RSI, Wilders RSI, RSX, Cuttler RSI или T3 RSI. |
| RsiPrice1 | Цена RSI 1 — Тип цены для расчёта первого RSI: Close, Open, High, Low, Median, Typical, Weighted и другие варианты. |
| RsiPeriod2 | Период RSI 2 — Период расчёта второго RSI. |
| Speed2 | Скорость 2 — Коэффициент сглаживания (скорость) для второго RSI-процесса. |
| RsiMethod2 | Метод RSI 2 — Метод расчёта второго RSI: стандартный RSI, Wilders RSI, RSX, Cuttler RSI или T3 RSI. |
| RsiPrice2 | Цена RSI 2 — Тип цены для расчёта второго RSI: Close, Open, High, Low, Median, Typical, Weighted и другие варианты. |
| T3Hot | Горячая точка T3 — Параметр горячей точки (hot) для T3-расчёта, используемого в варианте T3 RSI и в функции iT3. |
| T3Original | Оригинальный T3 — Переключатель выбора формулы расчёта альфа-коэффициента T3: оригинальная или альтернативная формула. |
| SignalPeriod | Период сигнала — Период сигнальной скользящей средней. |
| SignalMethod | Метод сигнальной линии — Тип скользящей средней для построения сигнальной линии: SMA, EMA, DEMA, TEMA, SMMA, LWMA и другие. |
| DzLookBackBars | Количество баров динамической зоны — Количество баров истории, используемых для расчёта уровня динамической зоны через функцию dzBuyP из external-библиотеки. |
| Interpolate | Интерполяция — Переключатель включения или отключения линейной интерполяции значений при пересчёте индикатора с другого таймфрейма. |
Поиск по коду файла
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Silver
#property indicator_color2 PaleVioletRed
#property indicator_color3 LimeGreen
#property indicator_color4 LimeGreen
#property indicator_color5 Red
#property indicator_style1 STYLE_DOT
#property indicator_style5 STYLE_DOT
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
#import "dynamicZone.dll"
double dzBuyP(double& sourceArray[],double probabiltyValue, int lookBack, int bars, int i, double precision);
#import
enum enRsiMode
{
rsi_rsi, // Rsi
rsi_wil, // Wilders' rsi
rsi_rsx, // Rsx
rsi_cut, // Cuttler's rsi
rsi_t3 // T3 rsi
};
enum enPrices
{
pr_close, // Close
pr_open, // Open
pr_high, // High
pr_low, // Low
pr_median, // Median
pr_typical, // Typical
pr_weighted, // Weighted
pr_average, // Average (high+low+open+close)/4
pr_medianb, // Average median body (open+close)/2
pr_tbiased, // Trend biased price
pr_haclose, // Heiken ashi close
pr_haopen , // Heiken ashi open
pr_hahigh, // Heiken ashi high
pr_halow, // Heiken ashi low
pr_hamedian, // Heiken ashi median
pr_hatypical, // Heiken ashi typical
pr_haweighted, // Heiken ashi weighted
pr_haaverage, // Heiken ashi average
pr_hamedianb, // Heiken ashi median body
pr_hatbiased // Heiken ashi trend biased price
};
enum enMaTypes
{
ma_sma, // simple moving average - SMA
ma_ema, // exponential moving average - EMA
ma_dsema, // double smoothed exponential moving average - DSEMA
ma_dema, // double exponential moving average - DEMA
ma_tema, // tripple exponential moving average - TEMA
ma_smma, // smoothed moving average - SMMA
ma_lwma, // linear weighted moving average - LWMA
ma_pwma, // parabolic weighted moving average - PWMA
ma_alxma, // Alexander moving average - ALXMA
ma_vwma, // volume weighted moving average - VWMA
ma_hull, // Hull moving average
ma_tma, // triangular moving average
ma_sine, // sine weighted moving average
ma_linr, // linear regression value
ma_ie2, // IE/2
ma_nlma, // non lag moving average
ma_zlma, // zero lag moving average
ma_lead, // leader exponential moving average
ma_ssm, // super smoother
ma_smoo // smoother
};
extern ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT;
extern int RsiPeriod1 = 14;
extern double Speed1 = 1.2;
extern enRsiMode RsiMethod1 = rsi_rsi;
extern enPrices RsiPrice1 = pr_close;
extern int RsiPeriod2 = 34;
extern double Speed2 = 0.8;
extern enRsiMode RsiMethod2 = rsi_rsi;
extern enPrices RsiPrice2 = pr_close;
extern double T3Hot = 0.7;
extern bool T3Original = false;
extern int SignalPeriod = 9;
extern enMaTypes SignalMethod = ma_sma;
extern int DzLookBackBars = 50;
extern bool Interpolate = true;
double macdua[];
double macdub[];
double macd[];
double signal[];
double zerol[];
double trend[];
string indicatorFileName;
bool returnBars;
int init()
{
// код доступен только после оплаты
}
int start()
{
// код доступен только после оплаты
}
double workMaRsi[][2];
double iMaRsi(int price, int rsiPeriod, int rsiMode, double speed, int i, int instanceNo=0)
{
if (ArrayRange(workMaRsi,0)!=Bars) ArrayResize(workMaRsi,Bars); int r = Bars-i-1;
double tprice = getPrice(price,Open,Close,High,Low,i);
if (r<rsiPeriod)
workMaRsi[r][instanceNo] = tprice;
else workMaRsi[r][instanceNo] = workMaRsi[r-1][instanceNo]+(speed*MathAbs(iRsi(tprice,rsiPeriod,rsiMode,i,instanceNo)/100.0-0.5))*(tprice-workMaRsi[r-1][instanceNo]);
return(workMaRsi[r][instanceNo]);
}
string rsiMethodNames[] = {"rsi","Wilders rsi","rsx","Cuttler RSI","T3 rsi"};
string getRsiName(int method)
{
int max = ArraySize(rsiMethodNames)-1;
method=MathMax(MathMin(method,max),0); return(rsiMethodNames[method]);
}
double workRsi[][26];
#define _price 0
#define _change 1
#define _changa 2
double iRsi(double price, double period, int rsiMode, int i, int instanceNo=0)
{
if (ArrayRange(workRsi,0)!=Bars) ArrayResize(workRsi,Bars);
int z = instanceNo*13;
int r = Bars-i-1;
workRsi[r][z+_price] = price;
switch (rsiMode)
{
case 0:
double alpha = 1.0/period;
if (r<period)
{
int k; double sum = 0; for (k=0; k<period && (r-k-1)>=0; k++) sum += MathAbs(workRsi[r-k][z+_price]-workRsi[r-k-1][z+_price]);
workRsi[r][z+_change] = (workRsi[r][z+_price]-workRsi[0][z+_price])/MathMax(k,1);
workRsi[r][z+_changa] = sum/MathMax(k,1);
}
else
{
double change = workRsi[r][z+_price]-workRsi[r-1][z+_price];
workRsi[r][z+_change] = workRsi[r-1][z+_change] + alpha*( change - workRsi[r-1][z+_change]);
workRsi[r][z+_changa] = workRsi[r-1][z+_changa] + alpha*(MathAbs(change) - workRsi[r-1][z+_changa]);
}
if (workRsi[r][z+_changa] != 0)
return(50.0*(workRsi[r][z+_change]/workRsi[r][z+_changa]+1));
else return(50.0);
case 1 :
workRsi[r][z+1] = irSmma(0.5*(MathAbs(workRsi[r][z+_price]-workRsi[r-1][z+_price])+(workRsi[r][z+_price]-workRsi[r-1][z+_price])),0.5*(period-1),Bars-i-1,instanceNo*2+0);
workRsi[r][z+2] = irSmma(0.5*(MathAbs(workRsi[r][z+_price]-workRsi[r-1][z+_price])-(workRsi[r][z+_price]-workRsi[r-1][z+_price])),0.5*(period-1),Bars-i-1,instanceNo*2+1);
if((workRsi[r][z+1] + workRsi[r][z+2]) != 0)
return(100.0 * workRsi[r][z+1]/(workRsi[r][z+1] + workRsi[r][z+2]));
else return(50);
case 2 :
double Kg = (3.0)/(2.0+period), Hg = 1.0-Kg;
if (r<period) { for (k=1; k<13; k++) workRsi[r][k+z] = 0; return(50); }
double mom = workRsi[r][_price+z]-workRsi[r-1][_price+z];
double moa = MathAbs(mom);
for (k=0; k<3; k++)
{
int kk = k*2;
workRsi[r][z+kk+1] = Kg*mom + Hg*workRsi[r-1][z+kk+1];
workRsi[r][z+kk+2] = Kg*workRsi[r][z+kk+1] + Hg*workRsi[r-1][z+kk+2]; mom = 1.5*workRsi[r][z+kk+1] - 0.5 * workRsi[r][z+kk+2];
workRsi[r][z+kk+7] = Kg*moa + Hg*workRsi[r-1][z+kk+7];
workRsi[r][z+kk+8] = Kg*workRsi[r][z+kk+7] + Hg*workRsi[r-1][z+kk+8]; moa = 1.5*workRsi[r][z+kk+7] - 0.5 * workRsi[r][z+kk+8];
}
if (moa != 0)
return(MathMax(MathMin((mom/moa+1.0)*50.0,100.00),0.00));
else return(50);
case 3 :
double sump = 0;
double sumn = 0;
for (k=0; k<period; k++)
{
double diff = workRsi[r-k][z+_price]-workRsi[r-k-1][z+_price];
if (diff > 0) sump += diff;
if (diff < 0) sumn -= diff;
}
if (sumn > 0)
return(100.0-100.0/(1.0+sump/sumn));
else return(50);
case 4 :
double chng = workRsi[r][_price]-workRsi[r-1][_price];
double changn = iT3( chng ,period,T3Hot,T3Original,i,instanceNo*2+0);
double changa = iT3(MathAbs(chng),period,T3Hot,T3Original,i,instanceNo*2+1);
if (changn != 0)
return(MathMin(MathMax(50.0*(changn/MathMax(changa,0.0000001)+1.0),0),100));
else return(50.0);
}
return(0);
}
double workrSmma[][4];
double irSmma(double price, double period, int r, int instanceNo=0)
{
if (ArrayRange(workrSmma,0)!= Bars) ArrayResize(workrSmma,Bars);
if (r<period)
workrSmma[r][instanceNo] = price;
else workrSmma[r][instanceNo] = workrSmma[r-1][instanceNo]+(price-workrSmma[r-1][instanceNo])/period;
return(workrSmma[r][instanceNo]);
}
double workT3[][24];
double workT3Coeffs[][6];
#define _period 0
#define _c1 1
#define _c2 2
#define _c3 3
#define _c4 4
#define _alpha 5
double iT3(double price, double period, double hot, bool original, int i, int instanceNo=0)
{
if (ArrayRange(workT3,0) != Bars) ArrayResize(workT3,Bars);
if (ArrayRange(workT3Coeffs,0) < (instanceNo+1)) ArrayResize(workT3Coeffs,instanceNo+1);
if (workT3Coeffs[instanceNo][_period] != period)
{
workT3Coeffs[instanceNo][_period] = period;
double a = hot;
workT3Coeffs[instanceNo][_c1] = -a*a*a;
workT3Coeffs[instanceNo][_c2] = 3*a*a+3*a*a*a;
workT3Coeffs[instanceNo][_c3] = -6*a*a-3*a-3*a*a*a;
workT3Coeffs[instanceNo][_c4] = 1+3*a+a*a*a+3*a*a;
if (original)
workT3Coeffs[instanceNo][_alpha] = 2.0/(1.0 + period);
else workT3Coeffs[instanceNo][_alpha] = 2.0/(2.0 + (period-1.0)/2.0);
}
int buffer = instanceNo*6;
int r = Bars-i-1;
if (r == 0)
{
workT3[r][0+buffer] = price;
workT3[r][1+buffer] = price;
workT3[r][2+buffer] = price;
workT3[r][3+buffer] = price;
workT3[r][4+buffer] = price;
workT3[r][5+buffer] = price;
}
else
{
workT3[r][0+buffer] = workT3[r-1][0+buffer]+workT3Coeffs[instanceNo][_alpha]*(price -workT3[r-1][0+buffer]);
workT3[r][1+buffer] = workT3[r-1][1+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][0+buffer]-workT3[r-1][1+buffer]);
workT3[r][2+buffer] = workT3[r-1][2+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][1+buffer]-workT3[r-1][2+buffer]);
workT3[r][3+buffer] = workT3[r-1][3+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][2+buffer]-workT3[r-1][3+buffer]);
workT3[r][4+buffer] = workT3[r-1][4+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][3+buffer]-workT3[r-1][4+buffer]);
workT3[r][5+buffer] = workT3[r-1][5+buffer]+workT3Coeffs[instanceNo][_alpha]*(workT3[r][4+buffer]-workT3[r-1][5+buffer]);
}
return(workT3Coeffs[instanceNo][_c1]*workT3[r][5+buffer] +
workT3Coeffs[instanceNo][_c2]*workT3[r][4+buffer] +
workT3Coeffs[instanceNo][_c3]*workT3[r][3+buffer] +
workT3Coeffs[instanceNo][_c4]*workT3[r][2+buffer]);
}
string methodNames[] = {"SMA","EMA","Double smoothed EMA","Double EMA","Tripple EMA","Smoothed MA","Linear weighted MA","Parabolic weighted MA","Alexander MA","Volume weghted MA","Hull MA","Triangular MA","Sine weighted MA","Linear regression","IE/2","NonLag MA","Zero lag EMA","Leader EMA","Super smoother","Smoothed"};
string getAverageName(int method)
{
int max = ArraySize(methodNames)-1;
method=MathMax(MathMin(method,max),0); return(methodNames[method]);
}
#define _maWorkBufferx1 5
#define _maWorkBufferx2 10
#define _maWorkBufferx3 15
#define _maWorkBufferx5 25
double iCustomMa(int mode, double price, double length, int i, int instanceNo=0)
{
int r = Bars-i-1;
length = MathMax(length,1);
switch (mode)
{
case ma_sma : return(iSma(price,length,r,instanceNo));
case ma_ema : return(iEma(price,length,r,instanceNo));
case ma_dsema : return(iDsema(price,length,r,instanceNo));
case ma_dema : return(iDema(price,length,r,instanceNo));
case ma_tema : return(iTema(price,length,r,instanceNo));
case ma_smma : return(iSmma(price,length,r,instanceNo));
case ma_lwma : return(iLwma(price,length,r,instanceNo));
case ma_pwma : return(iLwmp(price,length,r,instanceNo));
case ma_alxma : return(iAlex(price,length,r,instanceNo));
case ma_vwma : return(iWwma(price,length,r,instanceNo));
case ma_hull : return(iHull(price,length,r,instanceNo));
case ma_tma : return(iTma(price,length,r,instanceNo));
case ma_sine : return(iSineWMA(price,length,r,instanceNo));
case ma_linr : return(iLinr(price,length,r,instanceNo));
case ma_ie2 : return(iIe2(price,length,r,instanceNo));
case ma_nlma : return(iNonLagMa(price,length,r,instanceNo));
case ma_zlma : return(iZeroLag(price,length,r,instanceNo));
case ma_lead : return(iLeader(price,length,r,instanceNo));
case ma_ssm : return(iSsm(price,length,r,instanceNo));
case ma_smoo : return(iSmooth(price,length,r,instanceNo));
default : return(0);
}
}
double workSma[][_maWorkBufferx2];
double iSma(double price, int period, int r, int instanceNo=0)
{
if (ArrayRange(workSma,0)!= Bars) ArrayResize(workSma,Bars); instanceNo *= 2;
workSma[r][instanceNo] = price;
if (r>=period)
workSma[r][instanceNo+1] = workSma[r-1][instanceNo+1]+(workSma[r][instanceNo]-workSma[r-period][instanceNo])/period;
else { workSma[r][instanceNo+1] = 0; for(int k=0; k<period && (r-k)>=0; k++) workSma[r][instanceNo+1] += workSma[r-k][instanceNo];
workSma[r][instanceNo+1] /= k; }
return(workSma[r][instanceNo+1]);
}
double workEma[][_maWorkBufferx1];
double iEma(double price, double period, int r, int instanceNo=0)
{
if (ArrayRange(workEma,0)!= Bars) ArrayResize(workEma,Bars);
double alpha = 2.0 / (1.0+period);
workEma[r][instanceNo] = workEma[r-1][instanceNo]+alpha*(price-workEma[r-1][instanceNo]);
return(workEma[r][instanceNo]);
}
double workDsema[][_maWorkBufferx2];
#define _ema1 0
#define _ema2 1
double iDsema(double price, double period, int r, int instanceNo=0)
{
if (ArrayRange(workDsema,0)!= Bars) ArrayResize(workDsema,Bars); instanceNo*=2;
double alpha = 2.0 /(1.0+MathSqrt(period));
workDsema[r][_ema1+instanceNo] = workDsema[r-1][_ema1+instanceNo]+alpha*(price -workDsema[r-1][_ema1+instanceNo]);
workDsema[r][_ema2+instanceNo] = workDsema[r-1][_ema2+instanceNo]+alpha*(workDsema[r][_ema1+instancПоказано первые 50% кода (символов: 25723)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.