Помогите написать индикатор - страница 3

 
Sergei Melnikov #:
   ArrayResize(SDU,rates_total+LimitsForDeviation*2,10);    ArrayResize(SDD,rates_total+LimitsForDeviation*2,10);    ArrayResize(ProDeviationBuffer,rates_total+LimitsForDeviation*2,10);    ArrayResize(InfoUp,rates_total+LimitsForDeviation*2,10);    ArrayResize(InfoDown,rates_total+LimitsForDeviation*2,10);    ArrayResize(MAUP,rates_total+LimitsForDeviation*2,10);    ArrayResize(MADOWN,rates_total+LimitsForDeviation*2,10);

Вот это вот:

   ArrayResize(SDU,rates_total+LimitsForDeviation*2,10);
   ArrayResize(SDD,rates_total+LimitsForDeviation*2,10);
   ArrayResize(ProDeviationBuffer,rates_total+LimitsForDeviation*2,10);
   ArrayResize(InfoUp,rates_total+LimitsForDeviatio
n*2,10);
   ArrayResize(InfoDown,rates_total+LimitsForDeviation*2,10);
   ArrayResize(MAUP,rates_total+LimitsForDeviation*2,10);
   ArrayResize(MADOWN,rates_total+LimitsForDeviation*2,10);

убрать!

Если нужны буферы для промежуточных расчетов, то и использовать буферы.

Как понимаю, нужно  отображать три буфера, поэтому вот это вот вверху:

#property indicator_buffers 3
#property indicator_plots   3

оставляем.

В Ините, в самом начале указываем общее количество  буферов, для этого используется функция IndicatorBuffers().

В конце инита для каждого вспомогательного буфера вызываем  SetIndexBuffer()... и никаких самостоятельных ресайзов.

Вот статья: https://www.mql5.com/ru/articles/1497. В ней второй пример с буферами для промежуточных расчетов.

 
Dmitry Fedoseev #:

Вот это вот:

убрать!

Если нужны буферы для промежуточных расчетов, то и использовать буферы.

Как понимаю, нужно  отображать три буфера, поэтому вот это вот вверху:

оставляем.

В Ините, в самом начале указываем общее количество  буферов, для этого используется функция IndicatorBuffers().

В конце инита для каждого вспомогательного буфера вызываем  SetIndexBuffer()... и никаких самостоятельных ресайзов.

Вот статья: https://www.mql5.com/ru/articles/1497. В ней второй пример с буферами для промежуточных расчетов.

День добрый! Разобрался я почему не совпадает, проверял каждый буффер за буффером. Оказывается Эксель не считает по стандартной формуле ст.отклонения. 

Однако я его написал и теперь наткнулся на следующую проблему: индикатор не правильно считает (рисует) после инициализации, провожу инициализацию и все просчитано верно, в эксперте который я написал к нему получает верные данные.

Я не смог избавиться от части ArrayResize. 

Можете подсказать в них дело наверно и есть?


//+------------------------------------------------------------------+
//|                                                 PRODeviation.mq4 |
//|                                                          VockCap |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "VockCap"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 3
#property indicator_plots   3
extern double UpLevel=75; // Уровень перекупленности
extern double DownLevel=25; // Уровень перепроданности
extern int LimitsForDeviation=10; // Лимит для Deviation
extern string IS=" --- Indicator Seetings --- ";
extern bool DrawArrows=false; // Рисовать стрелки
extern double Spread=30; // Расстояние от цен для свечей
extern int BArrowCode=200; // Номер стрелки для бычей свечи
extern int SArrowCode=202; // Номер стрелки для медвежей свечи
extern int BullArrowSize=1; // Размер для бычей свечи
extern int BearArraowSize=1; // Размер для медвежей свечи
input color ExtForBullArrow = Gold; // Цвет для бычей свечи
input color ExtForBearArrow = Gold; // Цвет для медвежей свечи
string objectNamePrefix="ProD";
//--- plot ProDeviation
#property indicator_label1  "ProDeviation"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_type3   DRAW_HISTOGRAM
#property indicator_color1  clrBlue
#property indicator_color2  clrGreen
#property indicator_color3  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_style2  STYLE_SOLID
#property indicator_style3  STYLE_SOLID
#property indicator_width1  1
#property indicator_width2  2
#property indicator_width3  2
//--- indicator buffers
double ProDeviationBuffer[];
double SDU[];
double SDD[];
double InfoUp[];
double InfoDown[];
double MAUP[];
double MADOWN[];
double Action[1]= {0};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ProDeviationBuffer);
   SetIndexBuffer(1,SDU);
   SetIndexBuffer(2,SDD);
   SetIndexDrawBegin(0,0);
   SetIndexDrawBegin(1,0);
   SetIndexDrawBegin(2,0);
   SetIndexLabel(0,"ProDeviation");
   SetIndexLabel(1,"Signal Buy");
   SetIndexLabel(2,"Signal Sell");
   Spread=Spread*Point;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
//Limits"
   int limit;
   int counted_bars=IndicatorCounted();
//---- последний посчитанный бар будет пересчитан
   if(counted_bars>0)
      counted_bars--;
   limit=Bars-counted_bars;
//ArrayResize:
//ArrayResize(SDU,limit+LimitsForDeviation*2,10);
//ArrayResize(SDD,limit+LimitsForDeviation*2,10);
//ArrayResize(ProDeviationBuffer,limit+LimitsForDeviation*2,10);
   ArrayResize(InfoUp,limit+LimitsForDeviation*2,10);
   ArrayResize(InfoDown,limit+LimitsForDeviation*2,10);
   ArrayResize(MAUP,limit+LimitsForDeviation*2,10);
   ArrayResize(MADOWN,limit+LimitsForDeviation*2,10);
//Calculating:
   for(int i=0; i<=limit; i++)
     {
      //Disstribution
      double Different=iClose(NULL,0,i)-iClose(NULL,0,i+1);
      if(Different>0)
        {
         InfoUp[i]=Different;
        }
      if(Different<0)
        {
         InfoDown[i]=MathAbs(Different);
        }
     }
   for(int i=0; i<limit; i++)
     {
      double UP=0, Down=0, AverUP=0, AverDown=0, StdU=0, StDD=0;
      //CalculateResult&Counting
      int CountBear=0, CountBull=0, CountBear2=0, CountBull2=0;
      for(int x=i; x<i+LimitsForDeviation; x++)
        {
         if(InfoUp[x]!=0)
           {
            CountBull=CountBull+1;
           }
         if(InfoDown[x]!=0)
           {
            CountBear=CountBear+1;
           }
        }
      for(int x=i; x<i+LimitsForDeviation; x++)
        {
         if(InfoUp[x]!=0)
           {
            UP=UP+InfoUp[x]; //SUM
           }
         if(InfoDown[x]!=0)
           {
            Down=Down+InfoDown[x]; //SUM
           }
        }
      if(CountBull!=0)
        {
         AverUP=UP/CountBull;
         CountBull2=CountBull;
        }
      if(CountBear!=0)
        {
         AverDown=Down/CountBear;
         CountBear2=CountBear;
        }
      for(int ii=i; ii<=i+LimitsForDeviation; ii++)
        {
         if(InfoUp[ii]!=0)
           {
            StdU=StdU+((InfoUp[ii]-AverUP)*(InfoUp[ii]-AverUP));
           }
         if(InfoDown[ii]!=0)
           {
            StDD=StDD+((InfoDown[ii]-AverDown)*(InfoDown[ii]-AverDown));
           }
        }
      for(int ii=i; ii<=i+LimitsForDeviation; ii++)
        {
         if(InfoUp[ii]!=0)
           {
            StdU=StdU+((InfoUp[ii]-AverUP)*(InfoUp[ii]-AverUP));
           }
         if(InfoDown[ii]!=0)
           {
            StDD=StDD+((InfoDown[ii]-AverDown)*(InfoDown[ii]-AverDown));
           }
        }
      double trueStdU=0, trueStdD=0;
      if(CountBull2!=0&&CountBull2!=1)
        {
         trueStdU=MathSqrt(StdU/(CountBull2-1));
        }
      if(CountBear2!=0&&CountBear2!=1)
        {
         trueStdD=MathSqrt(StDD/(CountBear2-1));
        }
      double Y=0;
      if(trueStdU!=0&&trueStdD!=0)
        {
         Y=trueStdU/trueStdD;
        }
      double RSI=100-100/(1+Y);
      if(RSI<DownLevel)
        {
         SDU[i]=RSI;
        }
      if(RSI>UpLevel)
        {
         SDD[i]=RSI;
        }
      ProDeviationBuffer[i]=RSI;
     }
//Arrows:
   for(int i=1; i<limit; i++)
     {
      if(i<limit-1)
        {
         if(DrawArrows==true)
           {
            if(ProDeviationBuffer[i+1]<DownLevel&&ProDeviationBuffer[i+1]!=0)
              {
               if(ProDeviationBuffer[i]>DownLevel)
                 {
                  string curName=StringConcatenate(objectNamePrefix,"UP",iTime(NULL,0,i));
                  bool X=ObjectCreate(0,curName,OBJ_ARROW_UP,0,iTime(NULL,0,i),iLow(NULL,0,i)-Spread);
                  ObjectSetInteger(0,curName,OBJPROP_ARROWCODE,BArrowCode);
                  ObjectSetInteger(0,curName,OBJPROP_WIDTH,BullArrowSize);
                  ObjectSetInteger(0,curName,OBJPROP_COLOR,ExtForBullArrow);
                 }
              }
            if(ProDeviationBuffer[i+1]>UpLevel&&ProDeviationBuffer[i+1]!=0)
              {
               if(ProDeviationBuffer[i]<UpLevel)
                 {
                  string curName=StringConcatenate(objectNamePrefix,"Down",iTime(NULL,0,i));
                  bool X=ObjectCreate(0,curName,OBJ_ARROW_DOWN,0,iTime(NULL,0,i),iHigh(NULL,0,i)+Spread*3);
                  ObjectSetInteger(0,curName,OBJPROP_ARROWCODE,SArrowCode);
                  ObjectSetInteger(0,curName,OBJPROP_WIDTH,BearArraowSize);
                  ObjectSetInteger(0,curName,OBJPROP_COLOR,ExtForBearArrow);
                 }
              }
           }
        }
     }
//Allerts:
   if(ProDeviationBuffer[2]<DownLevel)
     {
      if(ProDeviationBuffer[1]>DownLevel)
        {
         if(Action[0]==0||Action[0]==2)
           {
            Alert("Signal UP | ", iTime(NULL,0,1));
            ArrayFill(Action,0,1,1);
           }
        }
     }
   if(ProDeviationBuffer[2]>UpLevel)
     {
      if(ProDeviationBuffer[1]<UpLevel)
        {
         if(Action[0]==0||Action[0]==1)
           {
            Alert("Signal Down | ", iTime(NULL,0,1));
            ArrayFill(Action,0,1,2);
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Andrey F. Zelinsky #:

три момента:

1. покажите ошибки в его коде.

2. при том, что 99% сливают свои капиталы на финансовых рынках -- работающий на заводе выглядит куда как веселее и успешнее -- ещё и полезным производительным делом занимается.

3. топикстартер на практике осваивает -- это много полезнее курсов.

Все сделал, но теперь наткнулся на следующую проблему: индикатор не правильно считает (рисует) после инициализации, провожу инициализацию и все просчитано верно, в эксперте который я написал к нему получает верные данные.