[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 632

 
alsu:

Por ejemplo, necesita calcular una media móvil simple con PeriodSMA. Para calcular el SMA, sume los valores de las últimas barras del PeriodSMA y divídalos por el PeriodSMA. Es obvio que para las barras con números Bars-1, Bars-2, ..., Bars-PeriodSMA+1 no funcionará, porque simplemente no tenemos la cantidad necesaria de barras para el cálculo (la barra más a la izquierda tiene el índice Bars-1). Por lo tanto, tenemos que empezar el cálculo del indicador no con la última barra del gráfico, sino con la barra con el índice Bars-PeriodSMA.

¿Por qué escriben este valor y no uno arbitrario? Y es que este desplazamiento del inicio del cálculo nos permite calcular la cantidad máxima de barras sin perjuicio de la corrección del cálculo.

Pero ten en cuenta que este es el caso más sencillo. A veces puede que no quede claro en el código cuántas barras pasadas necesita el programa para el cálculo y de dónde procede exactamente este desplazamiento. Bueno, probablemente deberías preguntarle al desarrollador que escribió el código. Pero en general, hay una manera universal - sólo mira el código, lo que en principio el índice máximo de la barra se puede obtener utilizando los datos del precio y los datos de los búferes de índice durante la operación del programa, por lo general ya en esta etapa se hace evidente...

Ahora todo está en su sitio. Gracias Alexei por tu capacidad de respuesta.
 
skyjet:


Gracias por la aclaración.

Y sólo para aclarar, si añado mecánicamente 0, ¿funcionarán los TP y SL en este tipo de terminal?


Lo harán, por supuesto que lo harán.
Para eso están las variables externas, para establecer cualquier valor.

Pero es más fácil colocar en el módulo de inicialización lo que te han aconsejado.
O de esta forma:
// для терминала с 5 знаками
if (Digits == 3 || Digits == 5) {
   decimal = 10; // Определяет кол-во пунктов в четвертом(втором) знаке
   STOPLOSS *= decimal;
   TAKEPROFIT *= decimal;
   slippage *= decimal; // прочие целочисленные переменные в пунктах
} else decimal = 1;
Las variables se ajustarán automáticamente, y para otras necesidades utilice el multiplicador "decimal"
 
skyjet:


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

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

prorab:

Lo harán, por supuesto.
Para eso están las variables externas, para establecer cualquier valor.

Pero es más fácil aún poner lo que te han aconsejado en el módulo de inicialización.
O de esta forma:
Las variables se ajustarán automáticamente, y para otras necesidades utilice el multiplicador "decimal"

Esta tarea necesita ser aclarada:

  • ¡¡¡Sus parámetros de entrada (STPOLOSS, TAKEPROFIT, etc.) deben ser introducidos con 4\2 dígitos en mente!!!
 

Buenas tardes...

¡¡SOS!! BUENA GENTE, ¡¡¡AYUDA!!! Soy un principiante en programación en general (soy autodidacta), y en MQL en particular. Escribí un indicador simple: RSI + Bandas de Bollinger en una persona. Pero aquí está el problema: si no especifico expresamente la cantidad de elementos del array Buf_std_dev (es decir, la línea de declaración del array tiene el siguiente aspecto: double Buf_std_dev[]), al mostrar este indicador en la ventana del terminal del cliente(CT) obtengo la siguiente imagen:

Explicación de la imagen:

a) en la parte superior se encuentra el RSI, que está disponible en el conjunto de indicadores suministrados con CT, y las Bandas de Bollinger han sido arrastradas a la ventana de este RSI mediante el arrastre de y drop);

b) en la parte inferior está el RSI, que está programado por mí;

El compilador no detecta ningún error ni advertencia.

 

Si, por el contrario, al declarar el array Buf_std_dev, especifico explícitamente el número de elementos que contiene (es decir, la línea de declaración del array tiene el siguiente aspecto: double Buf_std_dev[5502], donde 5502 es el número de barras, que se obtiene mediante la variable Bars), entonces todo vuelve a la normalidad (pues como se ve en la comparación de dos indicadores: todos los valores son iguales):

Me puedes decir qué hacer para guardar la imagen, como en la segunda imagen, pero explícitamente NO establecer el número de elementos en el array Buf_std_dev.

P.S. Gracias de antemano por la respuesta.

 
Mostrar todo el código
 

Código adjunto (sin algunas partes - ¡¡no cabe en 4 MB!!):

....
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:
Mostrar todo el código

Por favor, indique si hay formas de volcar el código de más de 4Mb aquí (¿o volcarlo aquí en partes?) ?
 

Si su Buf_std_dev no es un buffer indicador (uno de los ocho), necesita especificar su tamaño, o cualquier tamaño (si tiene intención de cambiarlo (tamaño) más tarde), al declararlo.

 

Cierto, no es... Si se me permite, dos preguntas más a la vez:

1. Si le asigno un buffer (el array Buf_std_dev) , ¿significa que también se mostrará en la ventana del indicador?

Si no le asigno un buffer, entonces (si entiendo bien) se producirá la siguiente situación: supongamos que he especificado el tamaño de 100 barras. Entonces, cuando aparezcan nuevas barras (es decir, si por ejemplo Bars=101), realizaremos los cálculos sólo para las últimas 100 barras que hayamos especificado (es decir, la barra más antigua -101- se descartará). Entonces, al cargar el historial, el tamaño del array será siempre igual a 100 barras solamente (o algún otro valor, que especificaré al declarar)?

Razón de la queja: