Как добавить функцию First/Previous?

 

Как добавить функцию First/Previous в уже готовый индикатор. То есть редактировать его.

Все говорят что это

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 OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {

Но всё это не дает результат. Это может помочь в написании а не редактировании.

Подскажите кому не лень как впилить эту функции!??? если можно по подробней.

 

Если сейчас у вас используется первый вариант функции:

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[])
  {

Значит в коде функции могут быть задействованы все массивы из параметров функции:

datetime& time[], double& open[], high[] и пр.

У второго варианта функции только один массив price():

int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {

Все ценовые массивы (open, high, low, close) надо заменить на price. Но возможно используется и массив time, тут надо использовать функцию CopyTime().

 
Dmitry Fedoseev:

Если сейчас у вас используется первый вариант функции:

Значит в коде функции могут быть задействованы все массивы из параметров функции:

У второго варианта функции только один массив price():

Все ценовые массивы (open, high, low, close) надо заменить на price. Но возможно используется и массив time, тут надо использовать функцию CopyTime().

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам

Taras Slobodyanik, 2017.10.15 19:33


указать в параметрах другие символ/период, и будут данные с другого графика

а для расчета по массиву использовать стандартные:
iMAOnArray
iRSIOnArray
...

а этот вариант рабочий??

 
potom:

а этот вариант рабочий??


Смотря что вы делаете, и что вам надо. Если указывать другой символ-таймфрейм, то будет еще несколько заморочек, будет нужно проверять данные на процесс подгрузки, искать бары по времени. Это стоит очень далеко от задачи поставленной в начале. 

 
Dmitry Fedoseev:

Смотря что вы делаете, и что вам надо. Если указывать другой символ-таймфрейм, то будет еще несколько заморочек, будет нужно проверять данные на процесс подгрузки, искать бары по времени. Это стоит очень далеко от задачи поставленной в начале. 

Ну я так и понял, спасибо за помощь
 
Dmitry Fedoseev:

Смотря что вы делаете, и что вам надо. Если указывать другой символ-таймфрейм, то будет еще несколько заморочек, будет нужно проверять данные на процесс подгрузки, искать бары по времени. Это стоит очень далеко от задачи поставленной в начале. 

вот к примеру на стохастикевсе правильно?

//+------------------------------------------------------------------+
//|                                                   Stochastic.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Stochastic Oscillator"
#property strict

#property indicator_separate_window
#property indicator_minimum    0
#property indicator_maximum    100
#property indicator_buffers    2
#property indicator_color1     LightSeaGreen
#property indicator_color2     Red
#property indicator_level1     20.0
#property indicator_level2     80.0
#property indicator_levelcolor clrSilver
#property indicator_levelstyle STYLE_DOT
//--- input parameters
input int InpKPeriod=5; // K Period
input int InpDPeriod=3; // D Period
input int InpSlowing=3; // Slowing
//--- buffers
double ExtMainBuffer[];
double ExtSignalBuffer[];
double ExtHighesBuffer[];
double ExtLowesBuffer[];
//---
int draw_begin1=0;
int draw_begin2=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
//--- 2 additional buffers are used for counting.
   IndicatorBuffers(4);
   SetIndexBuffer(2, ExtHighesBuffer);
   SetIndexBuffer(3, ExtLowesBuffer);
//--- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0, ExtMainBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1, ExtSignalBuffer);
//--- name for DataWindow and indicator subwindow label
   short_name="Sto("+IntegerToString(InpKPeriod)+","+IntegerToString(InpDPeriod)+","+IntegerToString(InpSlowing)+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"Signal");
//---
   draw_begin1=InpKPeriod+InpSlowing;
   draw_begin2=draw_begin1+InpDPeriod;
   SetIndexDrawBegin(0,draw_begin1);
   SetIndexDrawBegin(1,draw_begin2);
//--- initialization done
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Stochastic oscillator                                            |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
  {
   int    i,k,pos;
//--- check for bars count
   if(rates_total<=InpKPeriod+InpDPeriod+InpSlowing)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtMainBuffer,false);
   ArraySetAsSeries(ExtSignalBuffer,false);
   ArraySetAsSeries(ExtHighesBuffer,false);
   ArraySetAsSeries(ExtLowesBuffer,false);
   ArraySetAsSeries(price,false);
   ArraySetAsSeries(price,false);
   ArraySetAsSeries(price,false);
//---
   pos=InpKPeriod-1;
   if(pos+1<prev_calculated)
      pos=prev_calculated-2;
   else
     {
      for(i=0; i<pos; i++)
        {
         ExtLowesBuffer[i]=0.0;
         ExtHighesBuffer[i]=0.0;
        }
     }
//--- calculate HighesBuffer[] and ExtHighesBuffer[]
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1; k<=i; k++)
        {
         if(dmin>price[k])
            dmin=price[k];
         if(dmax<price[k])
            dmax=price[k];
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }
//--- %K line
   pos=InpKPeriod-1+InpSlowing-1;
   if(pos+1<prev_calculated)
      pos=prev_calculated-2;
   else
     {
      for(i=0; i<pos; i++)
         ExtMainBuffer[i]=0.0;
     }
//--- main cycle
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double sumlow=0.0;
      double sumhigh=0.0;
      for(k=(i-InpSlowing+1); k<=i; k++)
        {
         sumlow +=(price[k]-ExtLowesBuffer[k]);
         sumhigh+=(ExtHighesBuffer[k]-ExtLowesBuffer[k]);
        }
      if(sumhigh==0.0)
         ExtMainBuffer[i]=100.0;
      else
         ExtMainBuffer[i]=sumlow/sumhigh*100.0;
     }
//--- signal
   pos=InpDPeriod-1;
   if(pos+1<prev_calculated)
      pos=prev_calculated-2;
   else
     {
      for(i=0; i<pos; i++)
         ExtSignalBuffer[i]=0.0;
     }
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double sum=0.0;
      for(k=0; k<InpDPeriod; k++)
         sum+=ExtMainBuffer[i-k];
      ExtSignalBuffer[i]=sum/InpDPeriod;
     }
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader
MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader
  • www.mql4.com
MQL4: automated forex trading, strategy tester and custom indicators with MetaTrader
 

Для расчета стохастика нужны три цены — мин/макс/закрытие.
Если выбросить из формулы две цены, то это уже будет не стохастик, а МА.

Причина обращения: