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

  • Автор темы Автор темы S_l_a_v_a
  • Дата начала Дата начала

S_l_a_v_a

Активный участник
Помогите пожалста!
у меня проблема - не могу "сгладить" .

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

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

Юлия

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

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

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

FXWizard

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

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

S_l_a_v_a

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

S_l_a_v_a

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

FXWizard

Гуру форума
вот как реализовано сглаживание по методу Т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

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

S_l_a_v_a

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

FXWizard

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

#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[Bars-i]=0.0;
for(i=1;i<=Periodo;i++) Signal_Buffer[Bars-i]=0.0;
for(i=1;i<=Periodo;i++) EMA1_buffer[Bars-i]=0.0;
for(i=1;i<=Periodo;i++) EMA2_buffer[Bars-i]=0.0;
for(i=1;i<=Periodo;i++) EMA3_buffer[Bars-i]=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);
 
Верх