Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай последние события MQL5.community!
sdf3733
95
sdf3733 2016.04.20 18:53 

 Подскажите плиз какая разница м.у этими операторами и в чём она заключается и как она влияет на процесс

for(i=0; i<limit; i++)

 и 

  for ( i = limit; i >= 0; i --)
Artyom Trishkin
68764
Artyom Trishkin 2016.04.20 20:10  
sdf3733:

 Подскажите плиз какая разница м.у этими операторами и в чём она заключается и как она влияет на процесс

for(i=0; i<limit; i++)

 и

 for ( i = limit; i >= 0; i --)

Прямой и обратный цикл.

Если учитывать, что limit в обоих случаях у вас - одна и та же переменная, то во втором случае цикл неверный и приведёт к критической ошибке - выход за пределы массива (если в коде есть #property strict)

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

 for ( i = limit-1; i >= 0; i --)
Yurij Kozhevnikov
4359
Yurij Kozhevnikov 2016.04.21 06:59  

limit - это почти наверняка из индикаторов.

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

sdf3733
95
sdf3733 2016.04.21 16:29  

да, это из индикатора,

пытаюсь сделать так, чтоб расчёты и прорисовка велась из прошлого в настоящее, но не пойму как это сделать

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

просматривая документацию, учебник, не хватает понимания как это сделать

Artyom Trishkin
68764
Artyom Trishkin 2016.04.21 18:33  
sdf3733:

да, это из индикатора,

пытаюсь сделать так, чтоб расчёты и прорисовка велась из прошлого в настоящее, но не пойму как это сделать

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

просматривая документацию, учебник, не хватает понимания как это сделать

Ну вот вам пример. Что рисует - да фигзнает, берёт среднее между OHLC несколько баров назад (в настройках задаётся) и OHLC текущего бара индекса цикла i.

Просто как пример цикла от начала истории до "сейчас"

//+------------------------------------------------------------------+
//|                                                    TestLimit.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "LineOHLC"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//+------------------------------------------------------------------+
//|   input variables                                                |
//+------------------------------------------------------------------+
input int NumCalculatedBars=5;   // Количество баров усреднения
int numCalculatedBars;
//--- indicator buffers
double         Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer);
   numCalculatedBars=(NumCalculatedBars<1)?1:NumCalculatedBars;
//---
   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[])
  {
//---
   if(rates_total<numCalculatedBars) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>1) {
      limit=rates_total-numCalculatedBars-1;
      }
   //--- цикл от начала истории до "сейчас"
   for(int i=limit; i>=0; i--) {
      Buffer[i]=(GetValueHistory(i,numCalculatedBars,open,high,low,close)+(open[i]+high[i]+low[i]+close[i])*0.25)*0.5;
      }
   Comment("\nlimit=",limit);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
double GetValueHistory(int i, int shift, const double &open[], const double &high[], const double &low[], const double &close[]) {
   return((open[i+shift]+high[i+shift]+low[i+shift]+close[i+shift])*0.25);  // возвращаем OHLC i+сдвиг (Зачем? да фиг знает...)
}
//+------------------------------------------------------------------+
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий