MetaTrader <sup>®</sup> 4 build 157 - страница 6

 
Тут три цикла, и на каждый цикл новый счетчик. Сами счетчики i,k,l в явном виде не объявляются, компилятор это проглатывает норамльно. Но почему же три разных счетчика, когда можно было бы обойтись одним - спросите вы? А вы попробуйте сами.... :)

Ну вот еще. Прямотаки все ломанулись :) И не стыдно ? А где уважение ко времени форумян :) ?
 
Можно обойтись и одним, только int i нужно написать до первого for.
int i - это объявление переменной i, 3 раза объявить одну переменную неудастся и это правильно.

Проблема описываемая раньше была другая - скобки {} не ограничивают область видимости переменной (как это есть в Си).

Т.е. если написать так:
if (a == 0)
{
   int b;
   .......
}
c = b;


То в зависимости от значения а при работе скрипта может возникнуть ошибка, а может и не возникнуть.
(я правда конкретно этот вариант не проверял, смотрел похожий)

В Си компилятор этого недопустит,
обругает что переменная b неописана (и это правильно)

 
to Begun
Да тут можно и по коду догадаться, я же фактически уже все рассказал. :)
Если я поставлю во все три цикла один и тот же счетчик (допусти i), то компилятор выругатеся на попытку повторного объявления переменной i. Которую я даже не объявлял явно.
 
Тут три цикла, и на каждый цикл новый счетчик. Сами счетчики i,k,l в явном виде не объявляются, компилятор это проглатывает норамльно. Но почему же три разных счетчика, когда можно было бы обойтись одним - спросите вы? А вы попробуйте сами.... :)

во-первых, скажите, что пробовать и что получить?
во-вторых, как это в явном виде не объявляются? int i=0;... int k=0;... int l=0;... - это что? явное объявление с инициализацией.
и почему нельзя обойтись одним счётчиком i? посмотрите наш пример индикатора OsMA - три цикла на одном счётчике i
 
Можно обойтись и одним, только int i нужно написать до первого for.
int i - это объявление переменной i, 3 раза объявить одну переменную неудастся и это правильно.

Проблема описываемая раньше была другая - скобки {} не ограничивают область видимости переменной (как это есть в Си).

Т.е. если написать так:
if (a == 0)
{
   int b;
   .......
}
c = b;


То в зависимости от значения а при работе скрипта может возникнуть ошибка, а может и не возникнуть.
(я правда конкретно этот вариант не проверял, смотрел похожий)



Насколько я помню, твой способ, Mak, не помог. Поэтому пришлось делать три счетчика - по одному на каждый цикл.
 
int i - это и есть явное объявление.
Вопрос какова область действия этого объявления.
(как оно в данном случае будет в Си уже не помню)
 
2Rosh:
как не явно ? Явно :)
Только в MQL4 насколько я понял обьявленная переменная в процедуре 'видна' до конца этой процедуры.
Попробуйте так:
for(int i=0; i<limit; i++) ...
for(i=0; i<limit; i++)...
for(i=0; i<limit; i++)...
по идее должно сработать.
 
Вот переписал со всеми рекомендациями и выкладываю (индикатор , правда, не работает)

//+------------------------------------------------------------------+
//|                                                          TDI.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DarkBlue
#property indicator_color2 Red
//---- input parameters
extern int       PeriodTDI=20;
//---- buffers
double TDI_Buffer[];
double Direction_Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,TDI_Buffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Direction_Buffer);
   SetIndexLabel(0,"Trend Direction Index");
   SetIndexLabel(1,"Direction");
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   double MomBuffer[];
   double MomAbsBuffer[];
   double MomSumBuffer[];
   double MomSumAbsBuffer[];
   double MomAbsSumBuffer[];
   double MomAbsSum2Buffer[];
   bool First=true;
   int limit,i;
   int    counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
//   if (First){limit=Bars-PeriodTDI; First=false;} else limit=Bars-counted_bars;
   limit=Bars-PeriodTDI;
   ArraySetAsSeries(MomBuffer,true);
   ArraySetAsSeries(MomAbsBuffer,true);
   ArraySetAsSeries(MomSumBuffer,true);
   ArraySetAsSeries(MomSumAbsBuffer,true);
   ArraySetAsSeries(MomAbsSumBuffer,true);
   ArraySetAsSeries(MomAbsSum2Buffer,true);
   
//---- TODO: add your code here
   for(int i=0; i<limit; i++)
      {
      MomBuffer[i]=Close[i]-Close[i+PeriodTDI];
      MomAbsBuffer[i]=MathAbs(MomBuffer[i]);
      }
   for(int i=0; i<limit; i++)
      {
      MomSumBuffer[i]=iMAOnArray(MomBuffer,Bars,PeriodTDI,0,MODE_SMA,i)*PeriodTDI;
      MomSumAbsBuffer[i]=MathAbs(MomSumBuffer[i]);
      TDI_Buffer[i]=MomSumBuffer[i];
      MomSumAbsBuffer[i]=MomAbsBuffer[i];
      }

//   for(int l=limit; l>=0; l--)
//      {
//      MomAbsSumBuffer[l]=iMAOnArray(MomAbsBuffer,0,PeriodTDI,0,MODE_SMA,l)*PeriodTDI;
//      MomAbsSum2Buffer[l]=iMAOnArray(MomAbsBuffer,0,2*PeriodTDI,0,MODE_SMA,l)*2*PeriodTDI;
//      TDI_Buffer[l]=MomAbsSumBuffer[l]-MomAbsSum2Buffer[l];
//      }
      
//---- done
   
//----
   return(0);
  }
//+------------------------------------------------------------------+



В таком виде компилятор ругается два раза. Надеюсь, получу благодарности, а не упреки в некомпетентности. :)))

 
Правильно, он и должен ругаться 2 раза, на оба for(int i=0; i<limit; i++).
Убери из этих строк int, и ругаться перестанет.
 
Правильно, он и должен ругаться 2 раза, на оба for(int i=0; i<limit; i++).
Убери из этих строк int, и ругаться перестанет.

Елки палки, я при копировании не заметил эти int. прошу прощения. :(
Причина обращения: