Сравнение последнего значения индикатора со средним - страница 2

 
FiVik:

evillive элементы массива индикатора  считываются от старых к новым, а мне нужно наоборот- брать элементы новые т.е. как в таймсерии.

Нашел функцию ArraySetAsSeries которая переворачивает доступ к массиву, но что-то не получается адекватная цифра.

eevviill а так как вы советуете, полностью вешает терминал, и его невозможно запустить.

Мне как раз понадобилось подвесить терминал так, чтобы его невозможно было запустить. Помощь квалифицированную окажете? 
 
FiVik:

evillive элементы массива индикатора  считываются от старых к новым, а мне нужно наоборот- брать элементы новые т.е. как в таймсерии.

Нашел функцию ArraySetAsSeries которая переворачивает доступ к массиву, но что-то не получается адекватная цифра.

eevviill а так как вы советуете, полностью вешает терминал, и его невозможно запустить.

Я советую так. Дальше только твоя фантазия.

int counter=0;

double value_all=0;

 double mid_value=0;

for(int i=0;i<400;i++)

{

counter++;

value_all+=YOUR_DATA; 

} 
if(counter==0) counter=1;

 mid_value=value_all/counter;
 
tara:
Мне как раз понадобилось подвесить терминал так, чтобы его невозможно было запустить. Помощь квалифицированную окажете? 
for(int i=0;i<400;i++)
{
i--;
} 
 
eevviill не понимаю значения переменной YOUR_DATA. Текущий день? В справочнике такого нет.
 
FiVik:

evillive элементы массива индикатора  считываются от старых к новым, а мне нужно наоборот- брать элементы новые т.е. как в таймсерии.

Нашел функцию ArraySetAsSeries которая переворачивает доступ к массиву, но что-то не получается адекватная цифра.


От порядка слагаемых в сложении результат не зависит, разве не так? Что (1+2+3)/3, что (3+2+1)/3 в результате всё равно 2.
 
FiVik:
eevviill не понимаю значения переменной YOUR_DATA. Текущий день? В справочнике такого нет.
То что складываешь.
 

evillive  вы не правы. В данном случае берутся элементы массива согласно их индентификаторам. И если в массиве таймсерии идентификация элементов происходит от более новых к более старым, то в остальных массивах идентификация элементов начинается от самых старых. И получается не (1+2+3+)/3, а (1000+999+998)/3, или используются другие элементы. Это вычитал из справки. 

В коде привел метод и  evillive и eevviill ,  ошибок компилятор не находит.

//+------------------------------------------------------------------+
//|                                                        Bands.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013"
#property link    "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Aqua
#property indicator_color2 DeepSkyBlue
#property indicator_color3 Red
//---- indicator parameters------------------------------------------
extern int    BandsPeriod=30;
extern int    BandsShift=0;
extern double BandsDeviations=2.618;
extern double MovingAverage=MODE_EMA;
extern double Dig      =4;                           // Количество значащих цифр
extern color Color_Up =DeepSkyBlue;                  // Цвет +
extern color Color_Dn =Tomato;                       // Цвет -
extern color Color_0  =Lime;                         // Цвет 0
string Obj_Name ="Волотильность";                    // Название объекта
color  Color_Day_Percent;                            // Присваивается тип переменных
//---- buffers------------------------------------------------------
double MovingBuffer[];
double UpperBuffer[];
double LowerBuffer[];
double deviationBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators---------------------------------------------------
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,MovingBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,UpperBuffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,LowerBuffer);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,deviationBuffer);
//--------------------------------------------------------------------
   SetIndexDrawBegin(0,BandsPeriod+BandsShift);
   SetIndexDrawBegin(1,BandsPeriod+BandsShift);
   SetIndexDrawBegin(2,BandsPeriod+BandsShift);
//-------------------------------------------------------------------
   return(0);
  }
//+------------------------------------------------------------------+
//| Bollinger Bands                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    i,k,counted_bars=IndicatorCounted();
   double sum,oldval,deviation,newres;
//--------------------------------------------------------------------
   if(Bars<=BandsPeriod) return(0);
//---- initial zero-----------------------------------------------------
   if(counted_bars<1)
      for(i=1;i<=BandsPeriod;i++)
        {
         MovingBuffer[Bars-i]=EMPTY_VALUE;
         UpperBuffer[Bars-i]=EMPTY_VALUE;
         LowerBuffer[Bars-i]=EMPTY_VALUE;
        }
//--------------------------------------------------------------------
   int limit=Bars-counted_bars;
   if(counted_bars>0) limit++;
   for(i=0; i<limit; i++)
      MovingBuffer[i]=iMA(NULL,0,BandsPeriod,BandsShift,MovingAverage,PRICE_CLOSE,i);
//--------------------------------------------------------------------
   i=Bars-BandsPeriod+1;
   if(counted_bars>BandsPeriod-1) i=Bars-counted_bars-1;
   while(i>=0)
     {
      sum=0.0;
      k=i+BandsPeriod-1;                                       //Индекс последнего бара для расчёта
      oldval=MovingBuffer[i];                                  //
      while(k>=i)                                              //Цикл для вычисл. суммы квадратов откл.
        {
         newres=Close[k]-oldval;                               //Отклонение
         sum+=newres*newres;                                   //Сумма квадратов отклонений
         k--;
        }
      deviation=BandsDeviations*MathSqrt(sum/BandsPeriod);     //Среднее отклонение
      UpperBuffer[i]=oldval+deviation;                         //Верхняя линия
      LowerBuffer[i]=oldval-deviation;                         //Нижняя линия
///------------------------------------------------------------------- 
///---Расчет среднего значения девиации
///------------------------------------------------------------------- 
// Averagedeviation=iMAOnArray(deviationBuffer,0,120,0,MODE_SMA,0);
   int counter=0;
   double value_all=0;
   double Averagedeviation=0;
   for(int q=0;i<120;q++)
   {
   counter++;
   value_all+=deviation;
   } 
   if(counter==0) counter=1;
  Averagedeviation=value_all/counter;
 ///-------------------------------------------------------------------
      string Text =DoubleToStr(Averagedeviation, Dig);               // Текст для отображения
      if(NormalizeDouble(deviation,Dig)>Averagedeviation)           // Выбор цвета зависит от динамики
      Color_Day_Percent = Color_Up;                            // Цвет для +
      if(NormalizeDouble(deviation,Dig)<Averagedeviation)           // Выбор цвета зависит от динамики
      Color_Day_Percent = Color_Dn;                            // Цвет для -
      if(NormalizeDouble(deviation,Dig)==Averagedeviation)          // Выбор цвета зависит от динамики
      Color_Day_Percent = Color_0;                             // Цвет для 0
      if(ObjectFind(Obj_Name)==-1)                             // Если объекта нет..
      {
      ObjectCreate(Obj_Name,OBJ_LABEL,0,0,0);                  // Создаём новый объект 
      ObjectSet    (Obj_Name,OBJPROP_CORNER,    1);            // Угол привязки            
      ObjectSet    (Obj_Name,OBJPROP_XDISTANCE,15);            // Координата Х
      ObjectSet    (Obj_Name,OBJPROP_YDISTANCE,15);            // Координата Y
      }
      ObjectSetText(Obj_Name,Text,10,"MS Sans Serif",Color_Day_Percent);// Текстовое описание объекта      
      i--;   
     }
//----------------------------------------------------------------------
   return(0);
  }
int deinit()
   {
   ObjectDelete(Obj_Name);                                      // Удаление объекта при выходе
   return(0);
   }
//+------------------------------------------------------------------+

 

 
evillive  спасибо. Задачу решил. Проблема была в том, что переменная deviation не записывалась в буфер, среднее значение которого высчитывалось.
 
FiVik:
evillive  спасибо. Задачу решил. Проблема была в том, что переменная deviation не записывалась в буфер, среднее значение которого высчитывалось.
Так и запишу. Тебе больше не помагать.
Причина обращения: