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

 
alsu:

Например, вам надо рассчитать простое скользящее среднее с периодом PeriodSMA. Для расчета SМА необходимо сложить значения последних PeriodSMA баров и поделить на PeriodSMA. Очевидно, что для баров с номерами Bars-1, Bars-2, ..., Bars-PeriodSMA+1 это сделать не получится, т.к. нужного количества баров для расчета у нас просто нет (крайний левый бар имеет индекс Bars-1). Поэтому мы вынуждены начать расчет индикатора не с последнего бара на графике, а с того, для которого имеются все необходимые для расчета данные, т.е. с бара с индексом Bars-PeriodSMA.

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

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

Теперь все встало на свои места. Спасибо Алексей за Вашу отзывчивость!
 
skyjet:


Спасибо за разъяснения!

И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?


Будут, конечно.
Для того они и нужны, внешние переменные, чтобы задавать любые значения.

Но проще все-таки разместить в модуле инициализации то, что вам посоветовали.
Или в такой форме:
// для терминала с 5 знаками
if (Digits == 3 || Digits == 5) {
   decimal = 10; // Определяет кол-во пунктов в четвертом(втором) знаке
   STOPLOSS *= decimal;
   TAKEPROFIT *= decimal;
   slippage *= decimal; // прочие целочисленные переменные в пунктах
} else decimal = 1;
переменные будут скорректированы автоматически, а для прочих нужд пользуйтесь множителем " decimal "
 
skyjet:


Спасибо за разъяснения!

И просто чтобы уточнить, если я механическим путем добавлю 0, то TP и SL будут работать в данном типе терминалов?

prorab:

Будут, конечно.
Для того они и нужны, внешние переменные, чтобы задавать любые значения.

Но проще все-таки разместить в модуле инициализации то, что вам посоветовали.
Или в такой форме:
переменные будут скорректированы автоматически, а для прочих нужд пользуйтесь множителем " decimal "

Данная задача требует уточнения:

  • Ваши вводимые параметры (STPOLOSS, TAKEPROFIT и т.д.) должны быть введены с учётом 4\2-ёх знаков!!!
 

Доброго времени суток…

SOS!!! ЛЮДИ ДОБРЫЕ, ПОМОГИТЕ!!! Уже просто съезжает крыша… Я – новичок в программировании вообще (обучаюсь самостоятельно), ну и на MQL – в частности. Написал несложный индикатор: RSI + Ленты Боллинджера в "одном лице" (ниже приведен код индикатора полностью). Но вот беда: если при объявлении массива Buf_std_dev я явно НЕ указываю количество элементов в нем (т.е. строка с объявлением массива выглядит так: double Buf_std_dev[]), то при отображении этого индикатора в окне клиентского терминала (КТ), получаю следующую картину:

Пояснения к рисунку:

а) вверху расположен RSI, к-й имеется в наборе индикаторов, поставляемых вместе с КТ, а Ленты Боллинджера перетянуты в окно этого RSI методом drag and drop);

б) внизу расположен RSI, к-й запрограммирован мной;

При этом компилятор никаких ошибок или предупреждений не выявляет.

 

Если же я при объявлении массива Buf_std_dev явно указываю количество элементов в нем (т.е. строка с объявлением массива выглядит так: double Buf_std_dev[5502], где 5502 – это число баров, к-е получено с помощью переменной Bars), тогда все становится на свои места (ибо как видно из сравнения двух индикаторов: все значения одинаковы):

Подскажите, что надо сделать, чтобы сохранить изображение, как на втором рисунке, но при этом явно НЕ задавать количество элементов в массиве Buf_std_dev.

P.S. Заранее благодарю за ответ.

 
Покажите весь код
 

Код прилагаю (без некоторых частей - не влазит в 4 Мб!!):

....
double Buf_rsi[];                                                       //открываем индикаторный массив для значений RSI+
double Buf_ma[];                                                        //открываем индикаторный массив для значений скользящей средней по RSI+
double Buf_up_line[];                                                   //открываем индикаторный массив для значений ВЛБ по RSI+
double Buf_down_line[];                                                 //открываем индикаторный массив для значений НЛБ по RSI+
double Buf_std_dev[5498];                                               //открываем массив для хранения данных по стандартному отклонению  

string timeframe[9];                                                    //объявляем массив для значений таймфреймов
extern int Период_RSI=14;                                               //внешняя переменная: период RSI+
extern int Применить_к=PRICE_CLOSE;                                     //внешняя переменная: цена, для к-й рассчитывается RSI+
extern int Сдвиг=0;                                                     //внешняя переменная: сдвиг относительно текущего графика RSI+
extern double Сигма=2.0;                                                //внешняя переменная: количество стандартных отклонений для расчета лент Боллинджера по RSI+
extern int МА=21;                                                       //внешняя переменная: период скользящей средней для расчета лент Боллинджера по RSI+
....
   if(Bars<=Период_RSI) return(0);                                      //если баров на графике меньше, чем период RSI+, то выходим
//+-------------------------------------------------------------------------------------- 9 --
   int counted_bars=IndicatorCounted();                                 //количество посчитанных баров
   int i;                                                               //техническая переменные: счетчики

   int limit=Bars-counted_bars;                                         //индекс первого непосчитанного по массиву Buf_ma (т.к. этот массив НЕ является массивом таймсерией)
   if(counted_bars<0)limit--;                                           //если значение переменной counted_bars больше 0, то увеличиваем на 1 значение переменной limit
//+-------------------------------- Рассчет линий индикатора ---------------------------- 10 --
   for(i=0;i<=limit;i++)Buf_rsi[i]=iRSI(NULL,0,Период_RSI,Применить_к,i);//рассчет значения RSI+ на i-ом баре      
   for(i=0;i<=limit;i++)                                                //цикл по рассчету линий на основе RSI+     
       {                                                                //начало for
        Buf_std_dev[i]=iStdDevOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i);//рассчитываем стандатное отклонение по массиву RSI+
        Buf_ma[i]=iMAOnArray(Buf_rsi,Bars,МА,Сдвиг,MODE_SMA,i);         //рассчет значения MA по RSI+ на i-ом баре
        Buf_up_line[i]=Buf_ma[i]+Сигма*Buf_std_dev[i];                  //рассчет значения ВЛБ по RSI+
        Buf_down_line[i]=Buf_ma[i]-Сигма*Buf_std_dev[i];                //рассчет значения НЛБ по RSI+
       }                                                                //конец for
   for(i=0;i<=Bars;i++)                                                 //цикл по подсчету количества данных внутри ЛБ
      {                                                                 //начало for
       int sum;                                                         //техническая переменные: сумма данных, к-е находятся внутри ЛБ 
       if(Buf_rsi[i]>Buf_down_line[i]&&Buf_rsi[i]<Buf_up_line[i])sum++; //если значение RSI+ > НЛБ и значение RSI+ < НЛБ, то переменная sum увеличиваестся на 1 (т.о.)
      }                                                                 //конец for
//+------------------------------------------------------------------------------------- 11 --
 
FAQ:
Покажите весь код

Подскажите пожалуйста, если есть способы, как сбросить сюда код размером более 4 Мб (или сбрасывать его сюда по частям?) ?
 

Если ваш Buf_std_dev не является индикаторным буфером (одним из восьми), то при его объявлении вам нужно указать его размер, или любой размер (если вы в дальнейшем собираетесь его изменять (размер)).

 

Точно, не является... Если можно, тогда сразу еще 2 вопроса:

1. Если я ему (массиву Buf_std_dev ) присвою буфер (как и остальным четырем), то это значит, что он будет также отображаться в окне индикатора?

2. А если я не буду присваивать ему буфер, то (если я правильно понимаю) будет иметь место следующая ситуация: допустим, что я указал размер в 100 баров. Тогда при появлении новых баров (т.е. если например Bars=101), будут произведены рассчеты только для указанных при объявлении 100 последних баров (т.е. самый старый бар - 101 - будет отброшен). Таким образом при подгрузке истории размер массива всегда будет составлять лишь 100 баров (или какое-то другое значение, к-е я укажу при объявлении)?

Причина обращения: