Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 318

 
muzzletop:
Por la tarde. Tengo un EA, funciona bien en el probador de estrategias (abre órdenes y todo). Pero cuando lo pongo en un gráfico, no pasa nada. El EA no funciona. También noté una cruz junto al nombre del EA en el gráfico. ¿Cómo solucionarlo?


Cuando pones el EA en el gráfico se abre una ventana con parámetros, hay diferentes pestañas - en la primera "General" tienes que poner un tick delante de "Permitir al EA operar".

Si el EA ya está en el gráfico y se muestra con una cruz - en la barra de herramientas, haga clic en el botón "EAs" (cubo amarillo en un sombrero con un círculo rojo y un cuadrado blanco dentro del círculo).

 

Buenas tardes. Ayúdame a tratar un problema extraño.

La cuestión es: estoy escribiendo un indicador multitiempo, es decir, un indicador que, estando abierto en cualquier momento, calculará y dará señales para todos los demás momentos también.

La base del indicador es el RSI.

En init() cuando se cambia el marco de tiempo, se pone un array separado en correspondencia de la línea del indicador. Para cada uno de ellos se muestra la línea, cuando se está en tal o cual momento, pero los cálculos para otros momentos no van (función iRSI es estúpidamente persiguiendo ceros en el cálculo). Es decir, se calcula la hora actual, pero no se calculan otras horas.

Pego el código:

#property indicator_separate_window
#property indicator_minimum 20
#property indicator_maximum 80

#property indicator_level1 20          // уровень RSI
#property indicator_level2 42          // уровень RSI
#property indicator_level3 50          // уровень RSI
#property indicator_level4 58          // уровень RSI
#property indicator_level5 80          // уровень RSI

#property indicator_levelcolor White   // цвет уровней 

#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_width1 2           // толщина RSI

//--- buffers
double   RSI_M1[];               // буферы под RSI
double   RSI_M5[];
double   RSI_M15[];
double   RSI_M30[];
double   RSI_H1[];
double   RSI_H4[];
double   RSI_D1[];
double   RSI_W1[];
double   RSI_MN[];

int         RSI_per           = 12;                // период RSI
int         RSIPriceType      =  PRICE_CLOSE;      // покакой цене считать RSI
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- indicators
   IndicatorShortName("test");
   
   switch(Period()) {
      case PERIOD_M1:
          SetIndexBuffer(0, RSI_M1);
          break;
      case PERIOD_M5:
          SetIndexBuffer(0, RSI_M5);
          break;
      case PERIOD_M15:
          SetIndexBuffer(0, RSI_M15);
          break;
      case PERIOD_M30:
          SetIndexBuffer(0, RSI_M30);
          break;
      case PERIOD_H1:
          SetIndexBuffer(0, RSI_H1);
          break;
      case PERIOD_H4:
          SetIndexBuffer(0, RSI_H4);
          break;
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          break;
      case PERIOD_W1:
          SetIndexBuffer(0, RSI_W1);
          break;
      case PERIOD_MN1:
          SetIndexBuffer(0, RSI_MN);
          break;
   }   
   
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexLabel(0,"RSI(" + RSI_per + ")");
//----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int   shift, _Bars;
   static int  _counted_bars_W1 = 0,
               _counted_bars_D1 = 0;
   //--------------------------------------------------------------------
   _Bars = iBars(NULL, PERIOD_W1);
   shift = _Bars - _counted_bars_W1 - 1;   // Индекс первого непосчитанного
   _counted_bars_W1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_W1[shift]       = iRSI(NULL, PERIOD_W1, RSI_per, RSIPriceType, shift);
      Print(RSI_W1[shift]);
      shift--;
   }
   //------------------------------------------
   _Bars = iBars(NULL, PERIOD_D1);
   shift = _Bars - _counted_bars_D1 - 1;   // Индекс первого непосчитанного
   _counted_bars_D1 = _Bars - 1;
   
   while(shift >= 0) {                // Цикл по непосчитанным барам
      RSI_D1[shift]       = iRSI(NULL, PERIOD_D1, RSI_per, RSIPriceType, shift);
      shift--;
   }
   //------------------------------------------   
   return(0);
  }
//+------------------------------------------------------------------+

Lo que es interesante, si dejamos sólo un array para la línea indicadora y calculamos sólo W1 en cualquier momento, todo se calcula y dibuja correctamente en cualquier(!) momento.
¿Cuál es el truco? ¿Es imposible tomar diferentes matrices para la línea del indicador durante la inicialización, dependiendo del tiempo?

 
satorifx:

Buenas tardes. Ayúdame a tratar un problema extraño.

La cuestión es: estoy escribiendo un indicador multitiempo, es decir, un indicador que, estando abierto en cualquier momento, calculará y dará señales para todos los demás momentos también.

La base del indicador es el RSI.

En init() cuando se cambia el marco de tiempo, se pone un array separado en correspondencia de la línea del indicador. Para cada uno de ellos se muestra la línea, cuando se está en tal o cual momento, pero los cálculos para otros momentos no van (función iRSI es estúpidamente persiguiendo ceros en el cálculo). Es decir, se calcula la hora actual, pero no se calculan otras horas.

Pego el código:

Lo que es interesante, si dejamos sólo un array para la línea indicadora y calculamos sólo W1 en cualquier momento, todo se calcula y dibuja correctamente en cualquier(!) momento.
¿Cuál es el truco? ¿Es imposible tomar diferentes matrices para la línea del indicador durante la inicialización, dependiendo del tiempo?

Sólo se leen W1 y D1. ¿Qué quieres? Acaba con los demás.
 
borilunad:
Sólo se leen W1 y D1. ¿Qué quieres? Acaba con los demás.

Esa no es la cuestión. He dado los cálculos sólo para D1 y W1, para que el código no sea demasiado largo. Nota: en cada tick de cada marco temporal se imprimen los valores calculados de W1. Así, si se abre cualquier hora excepto W1, se imprimen ceros. Si funciona para el W1, funcionará para los demás.
 
satorifx:

No se trata de eso. He dado los cálculos sólo para D1 y W1, para no hacer el código demasiado largo. Tenga en cuenta: en cada tic en cualquier marco temporal se imprimen los valores calculados de W1. Así, si se abre cualquier hora excepto W1, se imprimen ceros. Si funciona para W1, funcionará para todos los demás.
¡Correcto! Tenemos que abrir el gráfico semanal para mostrarlo en otros gráficos.
 
borilunad:
¡Correcto! Para que se vea en otros gráficos, hay que abrir también el gráfico semanal.


Para ser sincero, no he entendido esta afirmación.
Y no es necesario mostrar nada más. Si ejecuta el código, verá que ya muestra lo que quiero: en D1 muestra el gráfico RSI D1 y en W1 - el gráfico RSI W1, pero al mismo tiempo, si D1 está abierto, entonces los RSI para W1 son todos cero, y si W1 está abierto, entonces los cálculos para D1 son cero. La pregunta es por qué ocurre esto y cómo solucionarlo.

 

El problema es que el array de índices se inicializa y redimensiona al tamaño adecuado.
Así que cuando abro D1 - RSI_D1[] se convierte en un índice, y todo está bien con él, pero otros arrays permanecen en estado embrionario.
Lo probé así: declaré todos los arrays de esta manera:

double   RSI_W1[]    =  {0};
He cambiado el interruptor en init() así:
      case PERIOD_D1:
          SetIndexBuffer(0, RSI_D1);
          ArrayResize(RSI_W1, iBars(NULL, PERIOD_W1));
          break;

Sin embargo, en ArrayResize GetLastError da un error:

EURUSD,Diario: no se puede redimensionar la matriz

EURUSD,Daily: algún error de matriz

De todos modos, ¿quién puede decirme cómo resolver este problema?

 
satorifx:

El problema es que el array de índices se inicializa y redimensiona al tamaño adecuado.
Así que cuando abro D1 - RSI_D1[] se convierte en indexado, y todo está bien con él, pero otros arrays permanecen en estado embrionario.
Lo intenté de esta manera: declaré todos los arrays de esta manera:

He cambiado el interruptor en init() así:

Sin embargo, en ArrayResize GetLastError da un error:

EURUSD,Diario: no se puede redimensionar la matriz

EURUSD,Daily: algún error de matriz

De todos modos, ¿quién puede decirme cómo resolver este problema?

Si el array es dinámico, asegúrate de que cuando escribas valores en él, aumentas el tamaño del array para acomodar los nuevos datos. ArrayResize()
 
artmedia70:
Si la matriz es dinámica, asegúrese de aumentar el tamaño de la matriz para acomodar los nuevos datos al escribir valores en ella. ArrayResize()

Lo escribí arriba:
Pero ArrayResize GetLastError da un error:

EURUSD,Daily: no se puede redimensionar el array

EURUSD,Daily: algún error de array
 
satorifx:
Esto es lo que he escrito más arriba:
Sin embargo en ArrayResize GetLastError da un error:

EURUSD,Diario: no se puede redimensionar la matriz

EURUSD,Diario: algún error de matriz
satorifx:


Para ser sincero, no entendí esa afirmación.
Y no es necesario mostrar nada más. Si ejecuta mi código, verá que ya muestra todo lo necesario: el RSI D1 muestra el gráfico en D1 y el RSI W1 en W1, pero al mismo tiempo, si D1 está abierto, entonces el RSI para W1 son todos cero, y si W1 está abierto, entonces el RSI para D1 son todos cero. La pregunta es por qué ocurre esto y cómo solucionarlo.

¡Porque el buffer está solo y se muestra uno a uno en su llamada!

#property indicator_buffers 1
¿De verdad crees que no tengo nada mejor que hacer que descargar tus "códigos" y probarlos? Te estoy ayudando con consejos. Y si algo va mal, ¡está todo ahí arriba para ti! ¡¿O es que la pereza nació antes que tú?!