[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 279

 

Algo falla en mi función que devuelve el valor de los elementos de un mismo array. Describiré todo en orden con respecto a este tema.

Las variables globales son:

extern int i_TF = 0;
int g_maPeriod[3] = {6, 25, 150, 250},             // Периоды обрабатываемых МА
    g_singMa[3] = {1,2,3,4};                     // признаки машек, добавляемые к основному мэйджику

// Идентификаторы сигналов
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

#define CROSS_UP             0                                 // Признак нахождения быстрой средней
                                                               // ..над медленной
#define CROSS_DN             1                                // Признак нахождения медленной..
                                                               // ..средней над быстрой
#define CROSS_NO            -1                                 // Признак равенства двух средних
int crossDir[3];

Funciones utilizadas en este cálculo:

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на двух соседних барах                                        |
//+-------------------------------------------------------------------------------------+
double GetCurAndPrevMA(int maPeriod, double& prevMA)
{
   prevMA = iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 1);
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, 0));
}
//+-------------------------------------------------------------------------------------+
//| Получение положения машек между собой                                               |
//+-------------------------------------------------------------------------------------+
void GetStateMa(int& crossDir[])
{
   double ema365_1;
   double ema365_0 = GetCurAndPrevMA(365, ema365_1);

   Print("g_maPeriod[0] = ", g_maPeriod[0]);
   Print("g_maPeriod[1] = ", g_maPeriod[1]);
   Print("g_maPeriod[2] = ", g_maPeriod[2]);
   Print("g_maPeriod[3] = ", g_maPeriod[3]);
   
   for (int i=0; i<4; i++)
   {
      double ema1;
      double ema0 = GetCurAndPrevMA(g_maPeriod[i], ema1);

      crossDir[i] = CROSS_NO;

      Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
      if (ema1 < ema365_1 && ema0 > ema365_0)
      {
         Print("ema1 < 365_1 ", ema1 ," < ", ema365_1);
         crossDir[i] = CROSS_UP;
      }
      if (ema1 > ema365_1 && ema0 < ema365_0)
      {
         Print("ema1 > 365_1 ", ema1 ," > ", ema365_1);
         crossDir[i] = CROSS_DN;
      }
   }
}

Además, imprimo el valor de los elementos del array devueltos por la funciónGetStateMa(int& crossDir[]):

   Print("crossDir[0] = ", crossDir[0]);
   Print("crossDir[1] = ", crossDir[1]);
   Print("crossDir[2] = ", crossDir[2]);
   Print("crossDir[3] = ", crossDir[3]);

Esto es lo que se devuelve:

2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[3] = 0
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[2] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[1] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: crossDir[0] = -1
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: open #1 buy 0.10 EURUSD at 1.29654 ok
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3129 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.3017 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2886 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: ema1 < 365_1 1.2916 < 1.3225
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[3] = 250
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[2] = 150
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[1] = 25
2013.04.11 15:08:48     2009.01.25 23:46  Base150_New EURUSD,H1: g_maPeriod[0] = 6

El valor de los elementos del arraycrossDir[] se devuelve diferente, aunque todos deberían tener un valor de 1.

Esto puede verse en el desajuste de las expresiones que comparan los periodos Mach 4 y 365. ¿Puede decirme por qué los valores se devuelven incorrectamente?

 
Ekburg:


gracias por concretar, porque el enlace que me enviaron no mencionaba específicamente estas matrices, y no me fijé en la columna de la izquierda porque estaba en el trabajo.

pero nadie se va a tragar todo lo que escupas salvo tú ;)


¿Cómo ha aprendido, si es que lo ha hecho, de las sugerencias? Sólo el autoestudio activo e inquisitivo dará sus frutos. Te he masticado y me has "escupido" un buen consejo. ¡Consigue una niñera que limpie tu desorden!
 
Buenas noches a todos, tengo el indicador B construido a partir del indicador A (a través de iCustom) .Ambos indicadores están en el gráfico.Cuando cambio los parámetros del indicador A , el indicador B no se reconstruye automáticamente, tiene que ser recompilado a la fuerza.¿Por qué el indicador B no se reconstruye automáticamente? Por favor, aconseje cuál es mi error?
 
MK07:
Buenas noches a todos, tengo el indicador B construido a partir del indicador A (a través de iCustom) . Ambos indicadores están en el gráfico. Cuando cambio los parámetros del indicador A , el indicador B no se reconstruye automáticamente, tengo que recompilarlo a la fuerza. ¿Por qué el indicador B no se reconstruye automáticamente? Por favor, díganme mi error.
Usted llama al indicador A (a través de iCustom) con algunas configuraciones específicas que son INDEPENDIENTES de las configuraciones del indicador A. Esto significa que el terminal calcula simultáneamente dos copias independientes del indicador A. El indicador que es llamado desde el exterior (desde otro código) es calculado virtualmente por el terminal.
 
TarasBY:
Usted llama al indicador A (a través de iCustom) con ciertos ajustes, que NO dependen de los ajustes del indicador A. Esto significa que el terminal calcula simultáneamente dos copias independientes del indicador A.

¿Y qué hay que hacer para que el terminal calcule la segunda variante del indicador A?
 
MK07:
¿Qué hay que hacer para que el terminal calcule la segunda versión del indicador A?
Sea más específico sobre la tarea.
 
borilunad:

¿Cómo aprendiste, si es que aprendiste, de las indicaciones? Sólo el autoestudio activo e inquisitivo dará sus frutos. ¡Te he masticado y estás escupiendo buenos consejos! ¡Consigue una niñera que limpie tu desorden!
 

¡Hola!

El valor de la variable Punto debe utilizarse en el EA.

Pero es igual a 0.

Según tengo entendido, esto se debe a los 5 dígitos después del punto decimal en la cotización.

¿Hay alguna forma de determinar este valor?

Gracias.

 
TarasBY:
Por favor, aclare su tarea.

Indicador A - AO normal (My_AO) - el de arriba en la imagen.

Indicador B-histograma(+1/-1) del indicador AO (My_AO) - el del medio en la figura.

Cuando se cambian los parámetros del indicador A (el de abajo en la imagen), el indicador B no cambia aunque se recompile.

He mostrado dos indicadores AO (My_AO) al mismo tiempo sólo para ilustrar lo que ocurre con los indicadores, pero en condiciones reales debería haber un solo AO (My_AO).



El primer código es el indicador A.

Segundo código - indicador B.

//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 3
#property  indicator_color1  Black
#property  indicator_color2  Green
#property  indicator_color3  Red
#property  indicator_width2  2
#property  indicator_width3  2
#property  indicator_level1 0.0

//---- input parameters
extern int FastPeriod =5;
extern int LowPeriod  =34;
//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   //---- drawing settings
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexStyle(2,DRAW_HISTOGRAM);
   IndicatorDigits(Digits+1);
   SetIndexDrawBegin(0,34);
   SetIndexDrawBegin(1,34);
   SetIndexDrawBegin(2,34);
//---- 3 indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer0);
   SetIndexBuffer(1,ExtBuffer1);
   SetIndexBuffer(2,ExtBuffer2);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("My_AO");
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Awesome Oscillator                                               |
//+------------------------------------------------------------------+
int start()
  {
      
  
   int    limit;
   int    counted_bars=IndicatorCounted();
   double prev,current;
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- macd
   for(int i=0; i<limit; i++)
      ExtBuffer0[i]=iMA(NULL,0,FastPeriod,0,MODE_SMA,PRICE_MEDIAN,i)-iMA(NULL,0,LowPeriod,0,MODE_SMA,PRICE_MEDIAN,i);
//---- dispatch values between 2 buffers
   bool up=true;
   for(i=limit-1; i>=0; i--)
     {
      current=ExtBuffer0[i];
      prev=ExtBuffer0[i+1];
      if(current>prev) up=true;
      if(current<prev) up=false;
      if(!up)
        {
         ExtBuffer2[i]=current;
         ExtBuffer1[i]=0.0;
        }
      else
        {
         ExtBuffer1[i]=current;
         ExtBuffer2[i]=0.0;
        }
        
       
     }
//---- done
   return(0);
  }
#property indicator_separate_window
#property indicator_minimum -1.5
#property indicator_maximum 1.5
#property indicator_buffers 2
#property indicator_color1 Green
#property indicator_color2 Red
#property  indicator_width1  2
#property  indicator_width2  2
#property indicator_level1 0.0

//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
      
       
    double UP,DN;     
  
  
    int counted_bars=IndicatorCounted(),
       limit;  
       
    if(counted_bars>0)
      counted_bars--;
   
      limit=Bars-counted_bars;
//----
   for(int i=0;i<limit;i++)
       
      { 
        UP=iCustom(NULL,0,"My_AO",1,i+1);               
        DN=iCustom(NULL,0,"My_AO",2,i+1);    
             
        
       if(UP>0)       
         {ExtMapBuffer1[i+1]=1;
          ExtMapBuffer2[i+1]=0;
         }
         
       if(UP<0)       
         {ExtMapBuffer1[i+1]=-1;
          ExtMapBuffer2[i+1]=0;
         }  
         
                              
       if(DN>0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=1;
         }
              
       if(DN<0)            
         {
          ExtMapBuffer1[i+1]=0;
          ExtMapBuffer2[i+1]=-1;
         }
               
                       
    
    }
//----
   return(0);
 
   }
   
//+------------------------------------------------------------------+    
   
        
        
 
MK07:

Indicador A - indicador AO normal (My_AO) - figura superior.

Indicador B - histograma(+1/-1) del indicador AO (My_AO) - centro en la figura.

Si se cambian los parámetros del indicador A (abajo en la figura), el indicador B no cambia aunque se recompile.

Los dos indicadores AO (My_AO) al mismo tiempo los he mostrado sólo para ilustrar lo que ocurre con los indicadores, pero en la vida real debería haber un solo AO (My_AO).

El primer código es el indicador A.

El segundo código es el indicador B.

Y este orden de cosas es normal (son los principios de la terminal).

Si se quiere cambiar los parámetros del indicador A, se debe hacer el intercambio de información entre los indicadores (puede ser un fichero, variables globales del terminal, RAM): el indicador A pasa los parámetros inicializables durante la inicialización y el indicador B comprueba periódicamente los cambios del indicador A. Cuando detecta cambios, el indicador B también debe inicializarse con los nuevos parámetros (forzar init()).