# Знающие помогите

Раздел: Язык программирования MQL4
Автор темы: S_l_a_v_a
Создана: 2008-10-21 21:39
Ответов: 8 | Просмотров: 4013
Страница 1 из 1
Источник: https://forexsystemru.com/threads/5632/

---

## S_l_a_v_a — 2008-10-21 21:39

Помогите пожалста!
у меня проблема - не могу "сгладить" .

допустим...
...
Mom=Close-Close[r+1];    
Mom_Flate=iMAOnArray(Mom,Bars,Period_Flate_Mom,0,MODE_EMA,r);
...
тогда при объявлении массива Mom_Flate[] нужно указывать его размер:
...
double Mom_Flate;
...

дак вот как мне написать код для советника если диапазон тестирования (количество баров) больше 1000000 (например за 1 месяц, при периоде 1 мин.)

## Юлия — 2008-10-21 23:49

А вы точно уверены, что есть необходимость хранить этот массив на миллион и нельзя в ходе работы советника обратиться к необходимому бару через цикл? Т.е. ну как-то так:

for r=1 to 1 000 000 do
{
  Mom=Close-Close[r+1];    
  Mom_Flate=iMAOnArray(Mom,Bars,Period_Flate_Mom,0,MODE_EMA,r);
}

пардон, что не си, но и так ясно, я надеюсь...

## FXWizard — 2008-10-22 06:25

а зачем брать такой большой период? разве что для визуального тестинга, но тогда тормозить будет при запуске минут 5 считать будет.

можно индикатор гораздо проще протестировать.
сделать надо рассчет на 50-100 баров, запустить любой советник на тестирование, кинуть индикатор в окно визуализации и смотреть как он себя ведет.

## S_l_a_v_a — 2008-10-23 01:26

Спасибочки НО ВСЕ НЕ ТУДА, или я что-то не понимаю!
задам вопрос по другому: есть кокое-то занченние например:
Mom=Close-Close(-1);
как мне найти сглаженное значение Mom (Сглаживание - это произвести процесс свертки для Mom скользящей средней).

## S_l_a_v_a — 2008-10-23 01:28

...
значение конечно Mom=Hi-Low и т.п. .... короче значения моментума(изменения)!

## FXWizard — 2008-10-23 07:58

вот как реализовано сглаживание по методу Т3 (трижды сглаженая МА)

for(i=0; i<limit; i++)
EMA1_buffer=iMA(NULL,0,Periodo,0,MODE_EMA,PRICE_CLOSE,i);
for(i=0; i<limit; i++)
EMA2_buffer=iMAOnArray(EMA1_buffer,Bars,Periodo,0,MODE_EMA,i);
for(i=0; i<limit; i++)
EMA3_buffer=iMAOnArray(EMA2_buffer,Bars,Periodo,0,MODE_EMA,i);

for(i=0; i<limit-1; i++)
TRIX_Buffer = (EMA3_buffer - EMA3_buffer[i+1]) / EMA3_buffer[i+1] *100;

## S_l_a_v_a — 2008-10-24 01:09

по поводу 
for(i=0; i<limit; i++)
EMA1_buffer=iMA(NULL,0,Periodo,0,MODE_EMA,PRICE_CLOSE,i);
и т.п. у меня почемуто при объявлении массива например: double EMA1_buffer[];
Значения не вычисляются. А если я задам массив: double EMA1_buffer; - значения вычисляются.....
я говорю не про рисование линии а именно про вычесление!
вот и проблема - для большого периода (много баров) приходиться объявлять большой размер массива.

## S_l_a_v_a — 2008-10-24 01:14

double 
      Mom[],
      Mom_Flate[];
   int counted_bars=IndicatorCounted();     
   int r=Bars-counted_bars-1;                            
   while(r>=0)                                          
         {
          Mom=Close-Open;    
          Mom_Flate=iMAOnArray(Mom,Bars,Period_Flate_Mom,0,MODE_EMA,r);
          r--;
         }
Где ошибка? почему он не возращат значения Mom_Flate. а если задать размер массивов то значение есть...

## FXWizard — 2008-10-24 05:37

Ошибка в том, что объявлять массив надо в начале индикатора:

#property copyright "Douglas Lozada"
#property link "http://www.metaquotes.net"
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
//---- input parameters
extern int Periodo = 4;
extern int Signal = 6 ;
//extern int Desplazar = 1;
//---- buffers
double TRIX_Buffer[];
double Signal_Buffer[];
double EMA1_buffer[];
double EMA2_buffer[];
double EMA3_buffer[];

а все вычисления вести надо в секции Start()

int start()
{
int i,limit;
int counted_bars=IndicatorCounted();

//---- check for possible errors
if(counted_bars<0) return(-1);

if(Bars<=Periodo) return(0);
//---- initial zero
if(counted_bars<1)
{
for(i=1;i<=Periodo;i++) TRIX_Buffer=0.0;
for(i=1;i<=Periodo;i++) Signal_Buffer=0.0;
for(i=1;i<=Periodo;i++) EMA1_buffer=0.0;
for(i=1;i<=Periodo;i++) EMA2_buffer=0.0;
for(i=1;i<=Periodo;i++) EMA3_buffer=0.0;
}

//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;

//---- Calculo el EMA1
for(i=0; i<limit; i++)
EMA1_buffer=iMA(NULL,0,Periodo,0,MODE_EMA,PRICE_CLOSE,i);
for(i=0; i<limit; i++)
EMA2_buffer=iMAOnArray(EMA1_buffer,Bars,Periodo,0,MODE_EMA,i);
for(i=0; i<limit; i++)
EMA3_buffer=iMAOnArray(EMA2_buffer,Bars,Periodo,0,MODE_EMA,i);

