[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 173

 
Ctmcn:

Подскажите, что означает ошибка при компиляции советника:

'\end_of_program' - unbalanced left parenthesis


Несбалансированная левая скобка.
 
Roll:

Несбалансированная левая скобка.

Упс... Нашел. СПАСИБО.
 

Возник такой вопрос -

Ордера открываются как BUY/SELL STOP. Некоторые становятся рыночными, остальные удаляются.

Для последних N-рыночных ордеров (открытых и закрытых) необходимо узнать были они Buy или Sell.

Первая мысль - перебрать все ордера из OrdersHistoryTotal() и OrdersTotal(), отсортировать их по

времени закрытия, а потом по OP_BUY и OP_SELL. Но это долго и будет дико тормозить процессор.

- Может есть какой-нибудь другой, более простой вариант?

Спасибо!

 

Добрый день.

Может кто-нибудь помочь?

Написал свой первый простенький индикатор - должен считать усредненную волатильность за 2, 3,4,и 5 прошедших дней.

Индикатор имеет шесть буферов,

SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,VolatBuffer0);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,VolatBuffer1);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   SetIndexBuffer(2,VolatBuffer2);
   SetIndexStyle(3,DRAW_HISTOGRAM);
   SetIndexBuffer(3,VolatBuffer3);
   SetIndexStyle(4,DRAW_HISTOGRAM);
   SetIndexBuffer(4,VolatBuffer4);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexBuffer(5,VolatBuffer5);

в своем окне на графике нормально рисует всего пять вертикальных линий по величине волатильности за 0 день, за 1 день, средняя. за 2дня, за 3дня и за 4дня.

Средняя волатильность по сумме 5 предыдущих дней рисуется ломаной линией за 50 дневных свечей - столько задано.

содержимое буферов рассчитывается так: усреднение за пять дней - в цикле (рисовать линию за 50 дней), остальные усредненные данные - вне цикла.

while(i>=0)
   {
    
   int day0= (High[i] - Low[i])/Point;
   int day1= (High[i+1] - Low[i+1])/Point;
   int day2= (High[i+2] - Low[i+2])/Point;
   int day3= (High[i+3] - Low[i+3])/Point;
   int day4= (High[i+4] - Low[i+4])/Point;
   int day5= (High[i+5] - Low[i+5])/Point;

        int D5_av = (day1+ day2+ day3+ day4+ day5) / 5;
       VolatBuffer5[i]=D5_av;
      i--;
        }
        day0= (High[0] - Low[0])/Point;
   day1= (High[1] - Low[1])/Point;
   day2= (High[2] - Low[2])/Point;
   day3= (High[3] - Low[3])/Point;
   day4= (High[4] - Low[4])/Point;
        
        int D4_av = (day1+ day2+ day3+ day4)/4;
        int D3_av = (day1+ day2+ day3)/3;
        int D2_av = (day1+ day2)/2;
        int D1_av = day1/1;
        int D0_av = day0/1;
        
        VolatBuffer0[0]=D0_av;
      VolatBuffer1[1]=D1_av;
      VolatBuffer2[2]=D2_av;
      VolatBuffer3[3]=D3_av;
      VolatBuffer4[4]=D4_av;
Comment("Волатильность. За 5 дн.= "+VolatBuffer5[5]+" За 4 дн.= "+VolatBuffer4[4]+" За 3 дн.= "+VolatBuffer3[3]+" За 2 дн.= "+VolatBuffer2[2]+" Вчера= "+VolatBuffer1[1]+" Сегодня= "+VolatBuffer0[0]);

Строка Coment в индикаторе, в которую внесено содержимое буферов, выдает на экран абсурд:

усреднение за 5 дней - за эти дни не было волатильности больше 194 пунктов и правильные результаты остальных дней.

Coment = " Волатильность. За 5 дн.= 219.000000 За 4 дн.= 171.0000000 За 3 дн.= 189.00000 За 2 дн.= 187.00000 Вчера= 194.00000 Сегодня= 5 "

Нулевой день "Сегодня" четко увеличивается с ростом волатильности текущего дня

При вызове данных буферов в советник

int Volat0= iCustom(Symbol(), 1440, "Volat_Average_Gist",0,0);
      int Volat1= iCustom(Symbol(), 1440, "Volat_Average_Gist",1,0);
      int Volat2= iCustom(Symbol(), 1440, "Volat_Average_Gist",2,0);
      int Volat3= iCustom(Symbol(), 1440, "Volat_Average_Gist",3,0);
      int Volat4= iCustom(Symbol(), 1440, "Volat_Average_Gist",4,0);
      int Volat5= iCustom(Symbol(), 1440, "Volat_Average_Gist",5,0);

строка Print тестера Выдает другой абсурд - не верный,отличающийся от строки Coment, но похожий на правду, усредненный результат за 5 дней и правильную волатильность сегодняшнего "Нулевого" дня.

Остальное дает фиксированным абсурдным числом.

Print тестера выдает Волатильность За 5 дн.= 181 За 4 дн.= 2147483647 За 3 дн.= 2147483647 За 2 дн.= 2147483647 Вчера= 2147483647 Сегодня= 5

Несколько дней не могу понять - почему в советник вызываются не те данные, что содержатся в пяти буферах индикатора кроме буфера "Нулевого" дня?

 

Попробуйте заменить

VolatBuffer1[1]=D1_av;

на

VolatBuffer1[0]=D1_av;

ну и все остальные буфера также.

 
Roger:

Попробуйте заменить

VolatBuffer1[1]=D1_av;

на

VolatBuffer1[0]=D1_av;

ну и все остальные буфера также.

Спасибо!

Сработало. В советник стали приходить нормальные данные.

Кроме этого получился интересный эффект - в строке "Coment" самого индикатора

стал прописываться тот абсурд, который был в строке Print советника, только 219 за 5 дней осталось как и было.

При этом в советник вместо 219 приходит 181 как надо

Coment" выдает Волатильность За 5 дн.= 219.000000 За 4 дн.= 2147483647 За 3 дн.= 2147483647 За 2 дн.= 2147483647 Вчера= 2147483647 Сегодня= 5

 
Roger:

Попробуйте заменить

VolatBuffer1[1]=D1_av;

на

VolatBuffer1[0]=D1_av;

ну и все остальные буфера также.

Нашел и еще один эффект. В окне индикатора все вертикальные линии стали рисоваться друг на друге

и самое большое значение закрывает все другие. Для советника это не существенно.

 
Vekker:

Добрый день.

Может кто-нибудь помочь?

Написал свой первый простенький индикатор - должен считать усредненную волатильность за 2, 3,4,и 5 прошедших дней.

Можно все значительно упростить, используя ATR:

iATR(NULL, PERIOD_D1, Number_Of_Days, 1)
 
Roll:
Два скрипта:

Вопрос больше не как написать код, а на уровне идеи - можно ли избежать множественных циклов,

которые грузят процессор. Например, была мысль отслеживать количество открытых STOP-ордеров - если оно уменьшилось на один, но ордер не был удален => открылся рыночный =>

время его открытия и тип поместить в массив. Что-то типа того.

Любые идеи приветствуются.

Спасибо!

 
chief2000:

Можно все значительно упростить, используя ATR:



Спасибо! Попробую
Причина обращения: