Группа "Стол заказов MQL"

Рейтинг 2091



РЕКОМЕНДУЮ




Лучшее от 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

Волатильность

Здравствуйте.

Уважаемые программисты, прошу сделать простой индикатор.

Это очень интересный индикатор.

Нужно взять два актива: первый — индекс доллара, а второй это инструмент графика.

Потом нужно взять процентное изменение двух активов в значении АТР.

Формула расчёта процентнтного изменения АТР:


atr = iATR(NULL,TF1,ATR,0); // задаём переменную атр 
    double min = iATR(NULL,TF1,ATR,ATR); // задаём минимальную переменную атр 
    double max = iATR(NULL,TF1,ATR,ATR); // задаём максимальную переменную атр (на первом этапе они равны)
    int k=ATR-1; 
      while(k>=0) //тут в цикле определяем минимальное значение атр и максимальное значение атр
        { 
         double price=iATR(NULL,TF1,ATR,k); 
         if(min>price) min=price;
         if(max<price) max=price;
         k--; 
        }
//Atr_Procent
    natr=((atr-min)/(max-min))*100; //тут определяем пройденное значение атр инструментом
   


Далее определяем знак ± пройденного АТР инструмента с помощью простых средних. Если цена растёт, то знак +, а если падает -. И присваиваем эти знаки инструментам

Потом по простой формуле расчёта стоимости инструмента определяем коффициент перекупленности или перепроданности.

R = (1-(1+natr1)/(1+natr2))*100;
где natr1 инструмент графика,
а natr2 индекс доллара

То есть если базовый индекс доллара падает, а инструмент растёт, то значение R будет равно (1-(1+natr1)/(1-natr2))*100, так как natr2 уже со знаком минус. И будет меньше 0. Если происходит обратная ситуация то значение R будет больше нуля.

Значение R в процентах отображает оставшийся максимальный путь инструмента по отношению к базовой карзине валют.

Спасибо.
  • +2
  • Просмотров: 1488
  • 20 апреля 2020, 12:50
  • axe44
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Доработать советник для mt 4
Следующая запись в группе  
Модификация универсального советника Uni
19 апреля 2020
20 апреля 2020

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

+
0
В основном большинство торговцев определят оставшиеся движение по АТР только самого графика не учитывая волатильность самого доллара. Я же предлагаю исправить эту ситуацию.
avatar

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

  • 20 апреля 2020, 12:54
+
0
По возможности прошу нанести на график уровень где будет окончание движения, формула простая (max*((max-min)*R))+min и даёт определение движение в пунктах в пределах движение АТР, то есть это непостоянная и постоянно смещается. Ещё раз Спасибо.
Редактирован: 20 апреля 2020, 13:10
avatar

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

  • 20 апреля 2020, 13:03
+
0
вы откуда это взяли? можно глянуть первоисточник?
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 20 апреля 2020, 20:46
+
0
А почему на Вы?
Всё моё.
Тут только одна ошибка в последней формулке.
Если бред на твой взгляд, так и скажи.
avatar

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

  • 20 апреля 2020, 20:56
+
0
Если бред на твой взгляд, так и скажи


прочитал. не зашло.
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 20 апреля 2020, 22:49
+
0
Сама формула существует давно под названием Левелрейдж. Я только немного упростил. Сама формула из первоисточника youtu.be/Yj64snfTv-Q
avatar

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

  • 20 апреля 2020, 21:00
+
+1
А вот это уже любопытно.
avatar

  24  ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 20 апреля 2020, 22:45
+
0
попробуй все наглядно показать на скринах
avatar

  34  AM2 Сообщений: 15901 - Андрей

  • 20 апреля 2020, 22:54
+
0


Периоды Ма и АТР совпадают и равны 20. Цена ниже МА, поэтому от скользящей средней МА отнимаем максимальный показатель АТР и рисуем на графике уровень. Если цена была бы выше средней МА, то значение АТР нужно было бы прибавить к МА.
Уровень должен постоянно перерисовываться с каждым новым баром.

Максимально упростил. Усложню сам.
avatar

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

  • 21 апреля 2020, 06:05
+
0
Может быть это чем поможет
//+------------------------------------------------------------------+
//|                                                     LWMA_ATR.mq4 |
//|                               Copyright © Sovpel Alexander, 2009 |
//+------------------------------------------------------------------+
#property copyright "Copyright © Sovpel Alexander, 2009"
#property link      "E-mail: Sovpel-Alexander@yandex.ru"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
//---- input parameters
extern int AtrPeriod    =15;
extern int Multiplier   =3;
extern int Text_Corner  =0;
extern color Text_Color =DeepSkyBlue;
//---- buffers
double AtrBuffer[];
double TempBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 1 additional buffer used for counting.
   IndicatorBuffers(2);
//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,AtrBuffer);
   SetIndexBuffer(1,TempBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="LWMA_ATR("+AtrPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
//----
   SetIndexDrawBegin(0,AtrPeriod);
//----
   ObjectCreate("ATR_0",OBJ_LABEL,0,TimeCurrent(),0,0);
   ObjectSet("ATR_0", OBJPROP_XDISTANCE, 5);
   ObjectSet("ATR_0", OBJPROP_YDISTANCE, 15);
   
   ObjectCreate("ATR_1",OBJ_LABEL,0,TimeCurrent(),0,0);
   ObjectSet("ATR_1", OBJPROP_XDISTANCE, 5);
   ObjectSet("ATR_1", OBJPROP_YDISTANCE, 33);
   
   return(0);
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
int start()
  {
   int i,counted_bars=IndicatorCounted();
//----
   if(Bars<=AtrPeriod) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=AtrPeriod;i++) AtrBuffer[Bars-i]=0.0;
//----
   i=Bars-counted_bars-1;
   while(i>=0)
     {
      double high=High[i];
      double low =Low[i];
      if(i==Bars-1) TempBuffer[i]=high-low;
      else
        {
         double prevclose=Close[i+1];
         TempBuffer[i]=(MathMax(high,prevclose)-MathMin(low,prevclose)) * 100000;
        }
      i--;
     }
//----
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   for(i=0; i<limit; i++)
      AtrBuffer[i]=iMAOnArray(TempBuffer,Bars,AtrPeriod,0,MODE_LWMA,i);
//----
   if(Multiplier != 1) int Percentage = Multiplier * 100;
//---- 
   ObjectSet("ATR_0", OBJPROP_CORNER, Text_Corner);
   ObjectSetText("ATR_0","Линейно-взвешенная волатильность рынка "+DoubleToStr(AtrBuffer[0],0)+" pips", 10, "Tahoma", Text_Color);
//---- 
   ObjectSet("ATR_1", OBJPROP_CORNER, Text_Corner);
   ObjectSetText("ATR_1","Адаптивный стоп-приказ ( "+Percentage+"% of ATR )     "+DoubleToStr(AtrBuffer[0] * Multiplier,0)+" pips", 10, "Tahoma", Text_Color);
//---- 
   return(0);
  }
//----
int deinit()
  {
   ObjectDelete("ATR_0");
   ObjectDelete("ATR_1");
   return(0);
  }
//+------------------------------------------------------------------+
avatar

  12  Slava78 Сообщений: 598

  • 21 апреля 2020, 10:03
+
0
Спасибо.
Я пока в отпуске не дома и в пути в Минск отдыхать.
Приеду домой, обязательно воспользуюсь кодом.
Спасибо.
avatar

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

  • 21 апреля 2020, 10:21
+
0
К сожалению не подходит.
Нужно отображение в том же окне что и цена от средней линии того же периода значения АТР как болинджир бандс. Но этот индикатор что то не поддаётся моему пониманию.
avatar

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

  • 26 апреля 2020, 11:36
+
0
//+------------------------------------------------------------------+
//|                                                   ATR уровни.mq4 |
//|                                                   Agshin Poladov |
//|                                         akwin.poladov1@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Agshin Poladov"
#property link      "akwin.poladov1@gmail.com"
#property strict
#property indicator_chart_window



extern int ATRPeriod = 10;

double rates_d1[][6];
double H1, H2, H3, H4, H4t, H5, L5, L4, L4t, L3, L2, L1, halfatr, fullatr;
int timeshift=0, timeshifts=0, beginner=0;
int periods;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
 
   
   ObjectDelete("H4atr line");
   ObjectDelete("L4atr line");
   ObjectDelete("L4atr label");
   ObjectDelete("H4atr label");
   ObjectDelete("H4tatr line");
   ObjectDelete("L4tatr line");
   ObjectDelete("L4tatr label");
   ObjectDelete("H4tatr label");   
   
  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   //if (counted_bars<1) return(0);
   
   
   switch (Period())
   {
      case PERIOD_M1:  {timeshifts=60; beginner=Hour()*60;} break;
      case PERIOD_M5:  {timeshifts=300; beginner=Hour()*12;} break;
      case PERIOD_M15: {timeshifts=900; beginner=Hour()*4;} break;
      case PERIOD_M30: {timeshifts=1800; beginner=Hour()*2;} break;
      case PERIOD_H1:  {timeshifts=3600; beginner=Hour()*1;} break;
      case PERIOD_H4:  {timeshifts=14400; beginner=Hour()*0.25;} break;
      case PERIOD_D1:  {timeshifts=86400; beginner=Hour()*0;} break;
    }   

   timeshift=timeshifts*24;
   
   if(Period() > 86400)
      {
         Print("Error - Chart period is greater than 1 day.");
         return(-1); // then exit
      }   


   
   ArrayCopyRates(rates_d1, Symbol(), PERIOD_D1);



   //beginner=Hour();
   
            fullatr = iATR(Symbol(), PERIOD_D1, ATRPeriod, 1);
            
            L4 = rates_d1[1][3] - fullatr;   
            H4 = rates_d1[1][2] + fullatr;
            L4t = rates_d1[0][3] - fullatr;   
            H4t = rates_d1[0][2] + fullatr;
            halfatr = fullatr * 0.5;   
         
            H1 = H4+1.5*fullatr;
            H2 = H4+fullatr;
            H3 = H4+halfatr;
            L3 = L4-halfatr;
            L2 = L4-fullatr;
            L1 = L4-1.5*fullatr;
         
   
   
   if (ObjectFind("H4atr Line") != 0) 
     {
      ObjectCreate("H4atr line",OBJ_HLINE,0,Time[0],H4);
      ObjectSet("H4atr line",OBJPROP_COLOR,Yellow);
      ObjectSet("H4atr line",OBJPROP_WIDTH,1);
     }
     else
     {
     ObjectMove("H4atr line", 0,Time[0],H4);
     }


   if (ObjectFind("L4atr Line") != 0) 
     {
      ObjectCreate("L4atr line",OBJ_HLINE,0,Time[0],L4);
      ObjectSet("L4atr line",OBJPROP_COLOR,Yellow);
      ObjectSet("L4atr line",OBJPROP_WIDTH,1);
     }
     else
     {
     ObjectMove("L4atr line", 0,Time[0],L4);
     }

   if (ObjectFind("H4tatr Line") != 0) 
     {
      ObjectCreate("H4tatr line",OBJ_HLINE,0,Time[0],H4t);
      ObjectSet("H4tatr line",OBJPROP_COLOR,Yellow);
      ObjectSet("H4tatr line",OBJPROP_WIDTH,1);
     }
     else
     {
     ObjectMove("H4tatr line", 0,Time[0],H4t);
     }


   if (ObjectFind("L4tatr Line") != 0) 
     {
      ObjectCreate("L4tatr line",OBJ_HLINE,0,Time[0],L4t);
      ObjectSet("L4tatr line",OBJPROP_COLOR,Yellow);
      ObjectSet("L4tatr line",OBJPROP_WIDTH,1);
     }
     else
     {
     ObjectMove("L4tatr line", 0,Time[0],L4t);
     }

if(ObjectFind("H4atr label") != 0)
      {
      ObjectCreate("H4atr label", OBJ_TEXT, 0, Time[0]+timeshift, H4);
      ObjectSetText("H4atr label", "ATR(y) res: " + DoubleToStr(H4,4), 8, "Verdana", Yellow);
      }
      else
      {
      ObjectMove("H4atr label", 0, Time[0]+timeshift, H4);
      } 

if(ObjectFind("L4atr label") != 0)
      {
      ObjectCreate("L4atr label", OBJ_TEXT, 0, Time[0]+timeshift, L4);
      ObjectSetText("L4atr label", "ATR(y) sup: " + DoubleToStr(L4,4), 8, "Verdana", Yellow);
      }
      else
      {
      ObjectMove("L4atr label", 0, Time[0]+timeshift, L4);
      } 

if(ObjectFind("H4tatr label") != 0)
      {
      ObjectCreate("H4tatr label", OBJ_TEXT, 0, Time[0]+timeshift, H4t);
      ObjectSetText("H4tatr label", "ATR(t) res: " + DoubleToStr(H4t,4), 8, "Verdana", Yellow);
      }
      else
      {
      ObjectMove("H4tatr label", 0, Time[0]+timeshift, H4t);
      } 

if(ObjectFind("L4tatr label") != 0)
      {
      ObjectCreate("L4tatr label", OBJ_TEXT, 0, Time[0]+timeshift, L4t);
      ObjectSetText("L4tatr label", "ATR(t) sup: " + DoubleToStr(L4t,4), 8, "Verdana", Yellow);
      }
      else
      {
      ObjectMove("L4tatr label", 0, Time[0]+timeshift, L4t);
      } 

   return(0);
  }
//+------------------------------------------------------------------+
avatar

  12  Slava78 Сообщений: 598

  • 26 апреля 2020, 17:14
+
0
Я почти закончил прект. Нужно две вещи: узнать цену бид другого графика по отношению к средней линии другого графика. Может даже знаю как, но уверенности мало, нужно узнать цену Макс и Мин другого графика текущего бара.

Вот. И немного удачи
avatar

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

  • 26 апреля 2020, 17:41
+
0
Типа этого?
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trade(string symb=NULL)
  {
   double bid1=MarketInfo(Symbol1,MODE_BID);
   double bid2=MarketInfo(Symbol2,MODE_BID);
   double ask1=MarketInfo(Symbol1,MODE_ASK);
   double ask2=MarketInfo(Symbol2,MODE_ASK);
   double pp1= MarketInfo(Symbol1,MODE_POINT);
   double pp2= MarketInfo(Symbol2,MODE_POINT);
   
   double ma1=iMA(Symbol1,0,MAPeriod,0,1,0,1);
   double ma2=iMA(Symbol2,0,MAPeriod,0,1,0,1);
   
   if(((bid1-ma1)/pp1)+((bid2-ma2)/pp2)<-Delta && CountTrades(symb)<1)
     {
      PutOrder(0,ask1,Symbol1);
      PutOrder(0,ask2,Symbol2);
      //ModifyOrders(symb);
     }
   if(((bid1-ma1)/pp1)+((bid2-ma2)/pp2)>Delta && CountTrades(symb)<1)
     {
      PutOrder(1,bid1,Symbol1);
      PutOrder(1,bid2,Symbol2);
      //ModifyOrders(symb);
     }
  }
avatar

  12  Slava78 Сообщений: 598

  • 26 апреля 2020, 19:50
+
0
Другой график- это привязка к другой валютной паре?
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trade()
  {
   double bid1=MarketInfo(Symbol1,MODE_BID);
   double bid2=MarketInfo(Symbol2,MODE_BID);
   double ask1=MarketInfo(Symbol1,MODE_ASK);
   double ask2=MarketInfo(Symbol2,MODE_ASK);
   double pp1= MarketInfo(Symbol1,MODE_POINT);
   double pp2= MarketInfo(Symbol2,MODE_POINT);
   
   double ma1=iMA(Symbol1,0,MAPeriod,0,1,0,0);
   double ma2=iMA(Symbol2,0,MAPeriod,0,1,0,0);
   
   if(MathAbs((bid1-ma1)/pp1)-MathAbs((bid2-ma2)/pp2)<=-Delta)
     {
      PutOrder(0,ask1,Symbol1);
      PutOrder(0,ask2,Symbol2);
      //ModifyOrders(symb);
     }
   if(MathAbs((bid1-ma1)/pp1)-MathAbs((bid2-ma2)/pp2)>=Delta)
     {
      PutOrder(1,bid1,Symbol1);
      PutOrder(1,bid2,Symbol2);
      //ModifyOrders(symb);
     }
  }
avatar

  12  Slava78 Сообщений: 598

  • 26 апреля 2020, 19:53
+
0
avatar

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

  • 26 апреля 2020, 21:26
+
0
//+------------------------------------------------------------------+
//|                                                       Клюква.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;
//+------------------------------------------------------------------+
//| 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 индекс доллара
 R1 = (1-(1+Drv)/(1+DrvIn))*100;//используем для движения вверх
 R2 = (1/(1-(1+Drv)/(1+DrvIn)))*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]+Drv*R1; Print("Drv ",Drv,",DrvIn",DrvIn,", R1", R1,", R2 ", R2);
      //--- нижняя линия
      ExtLowerBuffer[i]=ExtMovingBuffer[i]-Drv*R1; // где то тут ошибка
      //---
     }
//---- 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);
  }
//+------------------------------------------------------------------+
avatar

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

  • 26 апреля 2020, 22:20
+
0
*hi*  Исправил все ошибки. *friends*  *drinks*  спасибо за помощь
*war*  рулит :D 
Сам код:
//+------------------------------------------------------------------+
//|                                                       Клюква.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);
  }
//+------------------------------------------------------------------+


Наиболее точно указывает концы зон перекупленности и перепроданности на часовом графике валютных пар.
Для обратных котировок таких как usdchf usdcad usdjpy нужно менять формулу расчёта индекса доллара. Может быть потом сделаю.
Для расчёта синтетических пар индикатор бесполезен.
Повторюсь, что хорошо показывает только на часовом графике. Для остальных временных промежутков нужно что-то думать своё… *wall* 
Индекс доллара у каждого брокера свой, поэтому его нужно вписывать в индикатор. А так индикаторо норм 8-)  Хотя есть над чем работать.
*neo*  всем до встреч!!!
avatar

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

  • 27 апреля 2020, 07:13

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