Здравствуйте, подписчики.
Тут
zakaz.opentraders.ru/54245.html я заказывал индикатор, и не мне пришлось сделать две вещи: объяснять его полезность, и потом с чужой помощь собирать даьше самому… Не то что бы Андрей не помогал, просто он был занят тогда…
Для этого индикатора в настройках нужно указать название символа индекса доллара.
Вот сам код индикатора
//+------------------------------------------------------------------+
//| Клюква.mq4 |
//| Алексей Корольков . |
//| https://www.mql5.com/ru/users/alekkar |
//+------------------------------------------------------------------+
#property copyright "2020 Алексей Корольков ."
#property link "https://www.mql5.com/ru/users/alekkar"
#property description "Клюква"
#property strict
#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 LightSeaGreen
#property indicator_color3 LightSeaGreen
//--- indicator parameters
input int InpBandsPeriod=20; // Bands Period
input int InpBandsShift=0; // Bands Shift
input double InpBandsDeviations=2.0; // Bands Deviations
input string SimbolUSD="USDIDX..";
//--- buffers
double ExtMovingBuffer[];
double ExtUpperBuffer[];
double ExtLowerBuffer[];
double ExtStdDevBuffer[];
double Drv,DrvIn,min,max,minIn,maxIn,xx,xIn,natr,natrIn,ma1,ma2,bid1,bid2,R1,R2,R01,R02;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit(void)
{
//--- 1 additional buffer used for counting.
IndicatorBuffers(4);
IndicatorDigits(Digits);
//--- middle line
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMovingBuffer);
SetIndexShift(0,InpBandsShift);
SetIndexLabel(0,"Bands SMA");
//--- upper band
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtUpperBuffer);
SetIndexShift(1,InpBandsShift);
SetIndexLabel(1,"Bands Upper");
//--- lower band
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,ExtLowerBuffer);
SetIndexShift(2,InpBandsShift);
SetIndexLabel(2,"Bands Lower");
//--- work buffer
SetIndexBuffer(3,ExtStdDevBuffer);
//--- check for input parameter
if(InpBandsPeriod<=0)
{
Print("Wrong input parameter Bands Period=",InpBandsPeriod);
return(INIT_FAILED);
}
//---
SetIndexDrawBegin(0,InpBandsPeriod+InpBandsShift);
SetIndexDrawBegin(1,InpBandsPeriod+InpBandsShift);
SetIndexDrawBegin(2,InpBandsPeriod+InpBandsShift);
//--- initialization done
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Bollinger Bands |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int i,pos;
//---
if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)
return(0);
//--- counting from 0 to rates_total
ArraySetAsSeries(ExtMovingBuffer,false);
ArraySetAsSeries(ExtUpperBuffer,false);
ArraySetAsSeries(ExtLowerBuffer,false);
ArraySetAsSeries(ExtStdDevBuffer,false);
ArraySetAsSeries(close,false);
//--- initial zero
if(prev_calculated<1)
{
for(i=0; i<InpBandsPeriod; i++)
{
ExtMovingBuffer[i]=EMPTY_VALUE;
ExtUpperBuffer[i]=EMPTY_VALUE;
ExtLowerBuffer[i]=EMPTY_VALUE;
}
}
//--- определение АТР
for(i=InpBandsPeriod-1; i>=0; i--)
{
xx=High[i]-Low[i];
Drv+=xx;
if(min>xx) min=xx;
if(max<xx) max=xx;
xIn=iHigh(SimbolUSD,NULL,i)-iLow(SimbolUSD,NULL,i);
DrvIn+=xIn;
if(minIn>xIn) minIn=xIn;
if(maxIn<xIn) maxIn=xIn;
}
Drv/=InpBandsPeriod;
DrvIn/=InpBandsPeriod;
natr=((Drv-min)/(max-min))*100; //тут определяем пройденное значение атр инструментом на графике
natrIn=((DrvIn-minIn)/(maxIn-minIn))*100; //тут определяем пройденное значение атр инструментом на индексе доллара
//средние АТР
ma1=iMA(NULL,0,InpBandsPeriod,0,2,1,0);
ma2=iMA(SimbolUSD,0,InpBandsPeriod,0,2,1,0);
//определяем знак АТР
bid1=MarketInfo(NULL,MODE_BID);
bid2=MarketInfo(SimbolUSD,MODE_BID);
if (bid1-ma1<0) Drv=Drv*(-1); // если цена падает значит минус
if (bid2-ma2<0) DrvIn=DrvIn*(-1); // если цена падает значит минус
// а теперь сама она родная
//где Drv инструмент графика,а DrvIn индекс доллара
//расчёт индекса волатильности для инструмента
R01 = (1-(1+Drv)/(1+max))*100;//используем для движения вверх
R02 = (1-(1-Drv)/(1+max))*100;//используем для движения вниз
//расчёт индекса волатильности для доллара
R1 = (1-(1+DrvIn)/(1+maxIn))*100;//
R2 = (1-(1-DrvIn)/(1+maxIn))*100;//используем для движения вниз
// далее сам расчёт
//--- начальный расчет
if(prev_calculated>1)
pos=prev_calculated-1;
else
pos=0;
//--- главный цикл
for(i=pos; i<rates_total && !IsStopped(); i++)
{
//--- средняя линия
ExtMovingBuffer[i]=SimpleMA(i,InpBandsPeriod,close);
//--- рассчитайте и запишите со стандартным отклонением
ExtStdDevBuffer[i]=StdDev_Func(i,close,ExtMovingBuffer,InpBandsPeriod); // тут наверно смогу разместить код
//--- верхняя линия указывает зону перекупленности
ExtUpperBuffer[i]=ExtMovingBuffer[i]+(max+min)*(R01+R1)/2; //Print("Drv ",Drv,",DrvIn",DrvIn,", R1", R1,", R2 ", R2);
//--- нижняя линия указывает зону перепроданности
ExtLowerBuffer[i]=ExtMovingBuffer[i]-(max+min)*(R02+R2)/2;
//---
}
//---- OnCalculate done. Return new prev_calculated.
return(rates_total);
}
//+------------------------------------------------------------------+
//| Calculate Standard Deviation |
//+------------------------------------------------------------------+
double StdDev_Func(int position,const double &price[],const double &MAprice[],int period)
{
//--- variables
double StdDev_dTmp=0.0;
//--- check for position
if(position>=period)
{
//--- calcualte StdDev
for(int i=0; i<period; i++)
StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2);
StdDev_dTmp=MathSqrt(StdDev_dTmp/period);
}
//--- return calculated value
return(StdDev_dTmp);
}
//+------------------------------------------------------------------+
Этот код индикатора подходит для обратных пар таких как usdcad usdchf usdjpy
//+------------------------------------------------------------------+
//| Клюква реверс.mq4 |
//| Алексей Корольков . |
//| https://www.mql5.com/ru/users/alekkar |
//+------------------------------------------------------------------+
#property copyright "2020 Алексей Корольков ."
#property link "https://www.mql5.com/ru/users/alekkar"
#property description "Клюква"
#property strict
#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 LightSeaGreen
#property indicator_color3 LightSeaGreen
//--- indicator parameters
input int InpBandsPeriod=20; // Bands Period
input int InpBandsShift=0; // Bands Shift
input double InpBandsDeviations=2.0; // Bands Deviations
input string SimbolUSD="USDIDX..";
//--- buffers
double ExtMovingBuffer[];
double ExtUpperBuffer[];
double ExtLowerBuffer[];
double ExtStdDevBuffer[];
double Drv,DrvIn,min,max,minIn,maxIn,xx,xIn,natr,natrIn,ma1,ma2,bid1,bid2,R1,R2,R01,R02;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit(void)
{
//--- 1 additional buffer used for counting.
IndicatorBuffers(4);
IndicatorDigits(Digits);
//--- middle line
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMovingBuffer);
SetIndexShift(0,InpBandsShift);
SetIndexLabel(0,"Bands SMA");
//--- upper band
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,ExtUpperBuffer);
SetIndexShift(1,InpBandsShift);
SetIndexLabel(1,"Bands Upper");
//--- lower band
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,ExtLowerBuffer);
SetIndexShift(2,InpBandsShift);
SetIndexLabel(2,"Bands Lower");
//--- work buffer
SetIndexBuffer(3,ExtStdDevBuffer);
//--- check for input parameter
if(InpBandsPeriod<=0)
{
Print("Wrong input parameter Bands Period=",InpBandsPeriod);
return(INIT_FAILED);
}
//---
SetIndexDrawBegin(0,InpBandsPeriod+InpBandsShift);
SetIndexDrawBegin(1,InpBandsPeriod+InpBandsShift);
SetIndexDrawBegin(2,InpBandsPeriod+InpBandsShift);
//--- initialization done
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Bollinger Bands |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int i,pos;
//---
if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)
return(0);
//--- counting from 0 to rates_total
ArraySetAsSeries(ExtMovingBuffer,false);
ArraySetAsSeries(ExtUpperBuffer,false);
ArraySetAsSeries(ExtLowerBuffer,false);
ArraySetAsSeries(ExtStdDevBuffer,false);
ArraySetAsSeries(close,false);
//--- initial zero
if(prev_calculated<1)
{
for(i=0; i<InpBandsPeriod; i++)
{
ExtMovingBuffer[i]=EMPTY_VALUE;
ExtUpperBuffer[i]=EMPTY_VALUE;
ExtLowerBuffer[i]=EMPTY_VALUE;
}
}
//--- определение АТР
for(i=InpBandsPeriod-1; i>=0; i--)
{
xx=High[i]-Low[i];
Drv+=xx;
if(min>xx) min=xx;
if(max<xx) max=xx;
xIn=iHigh(SimbolUSD,NULL,i)-iLow(SimbolUSD,NULL,i);
DrvIn+=xIn;
if(minIn>xIn) minIn=xIn;
if(maxIn<xIn) maxIn=xIn;
}
Drv/=InpBandsPeriod;
DrvIn/=InpBandsPeriod;
natr=((Drv-min)/(max-min))*100; //тут определяем пройденное значение атр инструментом на графике
natrIn=((DrvIn-minIn)/(maxIn-minIn))*100; //тут определяем пройденное значение атр инструментом на индексе доллара
//средние АТР
ma1=iMA(NULL,0,InpBandsPeriod,0,2,1,0);
ma2=iMA(SimbolUSD,0,InpBandsPeriod,0,2,1,0);
//определяем знак АТР
bid1=MarketInfo(NULL,MODE_BID);
bid2=MarketInfo(SimbolUSD,MODE_BID);
if (bid1-ma1<0) Drv=Drv*(-1); // если цена падает значит минус
if (bid2-ma2<0) DrvIn=DrvIn*(-1); // если цена падает значит минус
// а теперь сама она родная
//где Drv инструмент графика,а DrvIn индекс доллара
//расчёт индекса волатильности для инструмента
R01 = (1-(1+Drv)/(1+max))*100;//используем для движения вверх
R02 = (1-(1-Drv)/(1+max))*100;//используем для движения вниз
//расчёт индекса волатильности для доллара
R1 = (1-(1+DrvIn)/(1+maxIn))*100;//
R2 = (1-(1-DrvIn)/(1+maxIn))*100;//используем для движения вниз
// далее сам расчёт
//--- начальный расчет
if(prev_calculated>1)
pos=prev_calculated-1;
else
pos=0;
//--- главный цикл
for(i=pos; i<rates_total && !IsStopped(); i++)
{
//--- средняя линия
ExtMovingBuffer[i]=SimpleMA(i,InpBandsPeriod,close);
//--- рассчитайте и запишите со стандартным отклонением
ExtStdDevBuffer[i]=StdDev_Func(i,close,ExtMovingBuffer,InpBandsPeriod); // тут наверно смогу разместить код
//--- верхняя линия указывает зону перекупленности
ExtUpperBuffer[i]=ExtMovingBuffer[i]+(max+min)*(R01+R2)/2; //Print("Drv ",Drv,",DrvIn",DrvIn,", R1", R1,", R2 ", R2);
//--- нижняя линия указывает зону перепроданности
ExtLowerBuffer[i]=ExtMovingBuffer[i]-(max+min)*(R02+R1)/2;
//---
}
//---- OnCalculate done. Return new prev_calculated.
return(rates_total);
}
//+------------------------------------------------------------------+
//| Calculate Standard Deviation |
//+------------------------------------------------------------------+
double StdDev_Func(int position,const double &price[],const double &MAprice[],int period)
{
//--- variables
double StdDev_dTmp=0.0;
//--- check for position
if(position>=period)
{
//--- calcualte StdDev
for(int i=0; i<period; i++)
StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2);
StdDev_dTmp=MathSqrt(StdDev_dTmp/period);
}
//--- return calculated value
return(StdDev_dTmp);
}
//+------------------------------------------------------------------+
Для тех кто не понял что нужно сделать, если нету у брокер индекса доллара, то показываю код
//--- верхняя линия указывает зону перекупленности
ExtUpperBuffer[i]=ExtMovingBuffer[i]+(max+min)*R01*0.8; //Print("Drv ",Drv,",DrvIn",DrvIn,", R1", R1,", R2 ", R2);
//--- нижняя линия указывает зону перепроданности
ExtLowerBuffer[i]=ExtMovingBuffer[i]-(max+min)*R02*0.8;
//---
*0.8 это множитель, который уменьшает влияние максимального показателя для волатильности.
Код свежий и основан на коде от другого индикатора. Поэтому прошу не судить слишком строго, а если есть мысли и идеи, то прошу делиться яниже под топиком в комментариях.
Спасибо всем.
Комментарии (1)
S- = Vx — Ve * (1-(-1+Vz )/(1+VeMax))
Уточнённая формула моего индикатора Редактирован: 1 мая 2020, 12:52
13 axe44 Автор Сообщений: 1149 - Алек
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий