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

 
Sergei Melnikov #:
Прошу прощения, русский не родной. Может хоть кто нибудь по теме писать? 
Ничего конкретного, один флууд.

По теме есть что ответить ? 

Вы не написали, что не выходит. Код делает то что написано.

 
Valeriy Yastremskiy #:

Вы не написали, что не выходит. Код делает то что написано.

У меня при нахождении среднего числа, иногда ( в случайном порядке ), появляются числа с е. Грубо говоря 4-0.5е или 6-1е и тд.  
 
Выкладывайте код полностью. А так даже не понятно, с какой стороны отсчет баров... МТ4 или МТ5.
 
Sergei Melnikov #:
У меня при нахождении среднего числа, иногда ( в случайном порядке ), появляются числа с е. Грубо говоря 4-0.5е или 6-1е и тд.  

если в расчётах, то это нормально -- в Print() используйте:

DoubleToString(value, _Digits) или нужную точность


 
Dmitry Fedoseev #:
Выкладывайте код полностью. А так даже не понятно, с какой стороны отсчет баров... МТ4 или МТ5.
//+------------------------------------------------------------------+
//|                                                 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;
//--- 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[];
//+------------------------------------------------------------------+
//| 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");
//---
   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[])
  {
//---
//DemoCheck:
//ArrayResize:
   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);
//Calculating:
   for(int i=0; i<rates_total; 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<rates_total; i++)
     {
      double UP=0, Down=0, AverUP=0, AverDown=0, StdU=0, StDD=0;
      //CalculateResult&Counting
      for(int x=i; x<=i+LimitsForDeviation; x++)
        {
         UP=UP+InfoUp[x]; //SUM       
         Down=Down+InfoDown[x]; //SUM
        }
      AverUP=UP/LimitsForDeviation;
      AverDown=Down/LimitsForDeviation;
      for(int ii=i; ii<=i+LimitsForDeviation; ii++)
        {
         StdU+=(InfoUp[ii]-AverUP)*(InfoUp[ii]-AverUP);
         StDD+=(InfoDown[ii]-AverDown)*(InfoDown[ii]-AverDown);
        }
      double trueStdU=MathSqrt(StdU/(LimitsForDeviation-1));
      double trueStdD=MathSqrt(StDD/(LimitsForDeviation-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;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Andrey F. Zelinsky #:
DoubleToString(value, _Digits)


Тогда вылетает 0, но это не возможно.

 
Sergei Melnikov #:


Тогда вылетает 0, но это не возможно.

задайте точность 16 -- и не будет 0 -- ну, или число тогда предельно мало.

если ожидаете помощь -- то кроме кода сделайте скрин и на нём покажите что не так -- ваши пояснения общие -- на уровне догадок

 
Andrey F. Zelinsky #:

задайте точность 16 -- и не будет 0 -- ну, или число тогда предельно мало.

если ожидаете помощь -- то кроме кода сделайте скрин и на нём покажите что не так -- ваши пояснения общие -- на уровне догадок

Я делаю индикатор, исходя из таблицы в экселе получаются довольно интересные входы и выходы. Но у меня все ровно результаты разнятся с ней, где то больше где то меньше, но понять в чем дело не могу. 

Делаю исходя из стандартного отклонения, но у меня не получается реализовать его на мт4. Все где то перегибы.

Ссылка на Гугл таблицу.

https://docs.google.com/spreadsheets/d/e/2PACX-1vQm3XbMWXGCveRaZyaoZVFok3phCh0mUHajBSpXFj7prsHHNl-sWzBcYf8h0m4nIA/pubhtml

 
Sergei Melnikov #:

Я делаю индикатор, исходя из таблицы в экселе получаются довольно интересные входы и выходы. Но у меня все ровно результаты разнятся с ней, где то больше где то меньше, но понять в чем дело не могу. 

Делаю исходя из стандартного отклонения, но у меня не получается реализовать его на мт4. Все где то перегибы.

Ссылка на Гугл таблицу.

https://docs.google.com/spreadsheets/d/e/2PACX-1vQm3XbMWXGCveRaZyaoZVFok3phCh0mUHajBSpXFj7prsHHNl-sWzBcYf8h0m4nIA/pubhtml

надо делать пошагово -- как у вас в таблице -- один буфер, один столбец -- создали буфер (столбец "изменение") -- посчитали, сверили с таблицей -- если правильно, то добавили следующий буфер, посчитали, сравнили.

вы сейчас сделали какой-то алгоритм, который непонятно что считает и вы не знаете как его проверить.

 
//ArrayResize:
   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 затратная операция -- ей лучше без надобности не злоупотреблять -- буфера не хватает? зачем его расширять?

      double Different=iClose(NULL,0,i)-iClose(NULL,0,i+1);

-- здесь надо close[i]-close[i+1] -- используйте ценовые массивы в OnCalculate()