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

 
GSB:

¿Qué tipo de toma? Se puede llamar al mismo indicador con parámetros completamente diferentes



Si en el propio indicador
extern int       periodAMA=10;
en la EA
extern int periodAMA_1= 8; 
extern int periodAMA_2=13; 

¿cómo reconoce el código del indicador los parámetros transmitidos y sus nombres son diferentes?

Pero todo es como tú dices. Lo he vuelto a comprobar con el script)

 
Forexman77:
Si en el propio indicador en el Asesor Experto

¿cómo reconoce el código del indicador los parámetros transmitidos y los nombres son diferentes?

Pero todo es como tú dices. Comprobado de nuevo con el script)


La(s) variable(s) en el programa que llama puede(n) ser nombrada(s) como quiera(n) y su nombre no está relacionado con el nombre de la variable en el indicador, son variables diferentes, y son llamadas desde diferentes hilos de la terminal.

El indicador es llamado en base a su nombre, los parámetros son pasados por él durante cada llamada desde la 4ª posición y luego los parámetros de iCustom().

Si se declara la variable per1=9; y iCustom() está en la posición 4, el indicador se calculará con un periodo de 9, si se establece otra variable, su valor se utilizará durante el cálculo. La variable que se pasará (su referencia) como primer parámetro del indicador - en el cuarto lugar iCustom() del segundo y así sucesivamente.



 
GSB:

La(s) variable(s) en el programa que llama puede(n) llamarse como quiera, su nombre no está relacionado con el nombre de la variable en el indicador, son variables diferentes, y son llamadas desde diferentes hilos de la terminal.

Se llama al indicador por su nombre, se le pasan los parámetros en cada llamada desde la 4ª posición y luego los parámetros de iCustom().

Si se declara la variable per1=9 y se coloca iCustom() en 4, el indicador se calculará con un periodo de 9; si se establece otra variable, su valor se utilizará durante el cálculo y esto se aplica a todos los parámetros del indicador, lo principal es establecerlos en el orden correcto, como en el propio indicador. La variable que se pasará (su referencia) como primer parámetro del indicador - el cuarto iCustom() del segundo y así sucesivamente.



Lo tengo. En el libro de texto, parece que se llama transferir los valores citados.
 

Pensé que no debía ensuciar el foro y tener un tema aparte, pero realmente espero una opinión constructiva sobre mi problema, no voy a avanzar sin ella :(.
He intentado escribir varios indicadores, todo parece estar bien, ahora he importado todo a mi EA usando la función iCustom(). El código en el Asesor Experto:

double ma=iCustom(NULL,0,"TestMA",0,1);

El indicador en sí (lo escribí para probarlo)

//+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle(0,DRAW_LINE,EMPTY,1,clrRed);
   SetIndexBuffer(0,ExtMapBuffer1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    int counted_bars=IndicatorCounted(),
       limit;
 
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars;
     
   for(int i=0;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i,20,close);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
  double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=0 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+

A continuación, lo de EMPTY_VALUE al hacer la prueba.

Es decir, cuando empezamos a probar, tenemos la fecha de inicio del EA y todo lo anterior a esa fecha iCustom nos da valores correctos de los indicadores, todo lo posterior a eso se prueba - VALOR_VACÍO. :(
Ya estoy cansado a google y foro, escriben sobre "no mirar al futuro", pero no veo eso en el código. ¿Dónde soy un tonto?)

 
Semionn:

Pensé que no debía ensuciar el foro y tener un tema aparte, pero realmente espero una opinión constructiva sobre mi problema, no voy a avanzar sin ella :(.
He intentado escribir varios indicadores, todo parece estar bien, ahora he importado todo a mi EA usando la función iCustom(). El código en el Asesor Experto:

El indicador en sí (lo escribí para probarlo)

A continuación, lo de EMPTY_VALUE al hacer la prueba.

Es decir, cuando empezamos a probar, tenemos la fecha de inicio del EA y todo lo anterior a esa fecha iCustom da los valores correctos del indicador, todo lo posterior se prueba directamente - EMPTY_VALUE. :(
Ya estoy cansado a google y foro, escriben sobre "no mirar al futuro", pero no veo eso en el código. ¿Dónde soy un tonto?)

El error parece estar en el código del Asesor Experto, ¿por qué no usas un depurador? Establecer puntos de control, ver los valores de las variables, y ver si el indicador se llama, lo que es antes y después de su fecha
 
GSB:
El error parece estar en el código del Asesor Experto, ¿por qué no usas un depurador? Establecer puntos de control, ver los valores de las variables, y ver si el indicador se llama, lo que es antes y después de su fecha

El depurador sólo se puede utilizar en el modo de cuenta de demostración, no en las pruebas, además de que escribí - el indicador se llama, funciona y devuelve los valores, incluso correcta, pero sólo antes de la fecha especificada (fecha de inicio de la prueba). Salgo con los valores de las variables en el EA, por eso digo que todo está bien al principio, y luego EMPTY_VALUE
 
Semionn:

El depurador sólo se puede utilizar en el modo de cuenta de demostración, no en las pruebas, además de que escribí - el indicador se llama, funciona y devuelve los valores, incluso correcta, pero sólo hasta la fecha especificada (fecha de inicio de la prueba). Salgo con los valores de las variables en el EA, por eso digo que todo está bien al principio, y luego EMPTY_VALUE


¿Has leído con atención cómo seguir las nuevas barras en los indicadores personalizados?

[QUOTE]El primer parámetro rates_total contiene el número de barras de que dispone el indicador para el cálculo y corresponde al número de barras disponibles en el gráfico.

Observe la conexión entre el valor devuelto por OnCalculate() y el segundo parámetro de entrada prev_calculado. El parámetro prev_calculado en la llamada a la función contiene un valor devuelto por OnCalculate() en la llamada anterior. Esto permite economizar los algoritmos de cálculo del indicador personalizado para evitar cálculos repetidos para aquellas barras que no han cambiado desde la anterior llamada a esta función.

Para ello, suele bastar con devolver el valor del parámetro rates_total, que contiene el número de barras de la llamada a la función actual. Si desde la última llamada de OnCalculate() los datos del precio han cambiado (se ha bombeado un historial más profundo o se han llenado los espacios en blanco del historial), entonces el valor del parámetro de entrada prev_calculado será puesto a cero por el terminal. [/QUOTE]

 

Hay que encontrar la media de los momentos de un día en 20 días y luego encontrar la media de los momentos de 20 días en cinco días.

Encontrar la media de 20 días no fue un problema. Pero no sé cómo obtenerla media decinco díasa partir de esta media .

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--- input parameters
extern int       Period_MA_1=1;
extern int       p          =20;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double momentum20;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
    
   for(int i=0;i<limit;i++)
   {
      momentum20=0;
      ArrayInitialize(val20,0);      
      for(int k=p;k>=0;k--)
      {
      ArrayResize(val20,p);
      val20[k]=Close[i+k]-Close[i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return(0);
  }
 
Forexman77:

Tienes que encontrar la media de los momentos de un día en 20 días y luego encontrar la media de los momentos de 20 días en cinco días.

Encontrar la media de 20 días no fue un problema. Pero no sé cómo obtenerla media de cinco díasa partir de esta media .



//+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 Lime
#property  indicator_color2 Yellow
#property  indicator_color3 Red

//--- input parameters
extern int       Period_MA_1=1;
extern int       p2          =20;
extern int       p3          =5;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(),
   i,limit1,limit2,limit3;
   limit1=Bars-counted_bars-1;
   limit2=limit1;
   limit3=limit2;
   if(limit1>0) 
     {
      limit1=Bars-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for(i=limit1;i>=0;i--) ExtMapBuffer1[i]=iMomentum(NULL, 0, Period_MA_1, PRICE_CLOSE, i);
   for(i=limit2;i>=0;i--) ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer1, 0, p2, 0, MODE_SMA,i);
   for(i=limit3;i>=0;i--) ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer2, 0, p3, 0, MODE_SMA,i);

   return(0);
  }
//+------------------------------------------------------------------+
 

Ayuda

int OnInit()
{
   EventSetTimer(60);
   Print(GetLastError());

   return(INIT_SUCCEEDED);
}

El temporizador no funciona, devuelve las faltas y el error 4051

¿O no debería funcionar en el probador?

Razón de la queja: