Группа "Альтернативная школа Юного Спекулянта."

Рейтинг 62



РЕКОМЕНДУЮ




Лучшее от axe44



Крутые памм-счета Комментариев 6
2017-10-24 11:58:58Рейтинг 0

БКС Комментариев 8
2017-08-11 02:57:12Рейтинг 0

торги
2017-01-26 00:01:37Рейтинг 0

HelloDual v3.0 Комментариев 3
2017-11-19 02:21:03Рейтинг 0

Создание советников бесплатно Комментариев 2
2017-07-16 22:54:20Рейтинг 0

Волатильнность. Полный обзор

Здравствуйте, подписчики.

Тут 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 это множитель, который уменьшает влияние максимального показателя для волатильности.

Код свежий и основан на коде от другого индикатора. Поэтому прошу не судить слишком строго, а если есть мысли и идеи, то прошу делиться яниже под топиком в комментариях.

Спасибо всем.
  • +3
  • Просмотров: 1163
  • 28 апреля 2020, 11:42
  • axe44
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Альтернативная школа Юного Спекулянта.", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Снова про обучение.
Следующая запись в группе  
Торговые роботы
19 апреля 2020
29 апреля 2020

Комментарии (1)

+
0
S+ = Vx + Ve * (1-(1+Vz )/(1+VeMax))

S- = Vx — Ve * (1-(-1+Vz )/(1+VeMax))

Уточнённая формула моего индикатора
Редактирован: 1 мая 2020, 12:52
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 1 мая 2020, 12:52

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари