Прошу помощи с индикатором.

 
Доброго времени суток!

Написал код (прилагаю ниже) для индикатора все считает верно. Однако только при инициализации, при дальнейшей прорисовке - информация рисуется не верно пробовал использовать start() вместо калькулятора, но все одно и тоже.
 
Sergei Melnikov:
Доброго времени суток!

Написал код (прилагаю ниже) для индикатора все считает верно. Однако только при инициализации, при дальнейшей прорисовке - информация рисуется не верно пробовал использовать start() вместо калькулятора, но все одно и тоже.
//+------------------------------------------------------------------+
//|                                                 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; // Цвет для медвежей свечи
extern bool UseAlert=false;
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 start()
  {
//---
//DemoCheck:
//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));
           }
        }
      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(UseAlert==true)
     {
      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(0);
  }
//+------------------------------------------------------------------+
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • 2023.07.11
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций