[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 144

 
iMAG:
Para que quede claro, intenta mirar GetLastError() después del operador de asignación - debe ayudar con el desglose. Al menos, todo funciona bien en el ejemplo anterior. ;)


int init()
{
//----
// i = 0;
double s[10] = {,,3,4,5,6,7,8,9};
int i = 0;

while(i < 10)
{
s[i] = i + 10;
i++;
Print("s[i]: ", DoubleToStr(s[i], 2), " i: ", i, "GetLastError(): ", GetLastError());

Sleep(5000);
}

//----

return(0);
}

Este es un ejemplo: el valor (i + 10) no se asigna. Con esta inicialización, sólo a través de una matriz de órdenes - ¿cuáles son los secretos?


 

Stepan2

Obras

int init()
  {
//----
double s[11];
// i = 0;
int i = 0;

while(i < 10)
{
s[i] = i*10;
i++;
Print("s[i]: ", DoubleToStr(s[i], 2), " i: ", i, "   GetLastError(): ", GetLastError());

Sleep(5000);
}

   return(0);
  }

 
GaryKa:
Me ha arrancado el cerebro... Un kilo de tomates vale menos que los rublos, por lo que los tomates se encarecen? ¿Por qué dicen que son más baratos?


Es decir, un dólar, ya sea en el numerador o en el denominador, siempre es DINERO (incluso en las mayores), el resto son "Bienes".

¿Es así como funciona?

¿Y las cruces? ¿Cómo saber qué dividir por qué al formar una cruz?

Es decir, ¿por qué una moneda está necesariamente en el numerador y la otra en el denominador y no al revés?

 
r772ra:

Stepan2

Obras


¿Qué quiere decir con eso?

¡Esa terminal depende de un AGENTE!

 
Space:


Es decir, un dólar, ya sea en el numerador o en el denominador, es siempre DINERO (incluso en las mayores), el resto es "COMERCIO".

¿Es así como funciona?

¿Y las cruces? ¿Cómo saber qué dividir por qué al formar una cruz?

Es decir, ¿por qué una moneda está necesariamente en el numerador y la otra en el denominador, y no al revés?


El proceso de aprendizaje es el siguiente:

DIVISIÓN - consecutiva, pero en sentido contrario

RUNNING - Guión de acción

 
Stepan2:


¿Qué quiere decir con eso?

¡Que el terminal depende del AGENTE!

No puedo decir nada sobre el corredor, es poco probable que haya algo mal con el corredor.

Y para el código, tal vez me equivoque.

Has declarado un array y lo has llenado

double s[10] = {,,,3,4,5,6,7,8,9}; 

y muestras estos números, si es doble, entonces 1.0, 2.0, etc.

En mi caso

double s[11];

Debe ser un poco más grande para evitar el error (4002).

y se llena en el bucle, así que, sí, no lo consigo ...... sólo a través de una matriz de órdenes .....

 

Por favor, avisadme, he colocado dos MACD (Macd1 y Macd2) en la misma ventana y en la misma escala. Encuentro los máximos y mínimos de cada MACD sólo entre los valores del gráfico visibles en la ventana del indicador. Los pongo en Comment(). Todo funciona, pero las líneas de señal empiezan a dibujarse desde la primera barra, es decir, tengo que esperar a que llenen toda la ventana. ¿Cómo solucionar este problema? ¿Y cómo puedo optimizar mi incómodo código?

  
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Aqua
#property indicator_color4 DarkOrange
#property  indicator_width1  2
#property  indicator_width3  2
//--- buffers
double Macd1Buffer[];
double Signal1Buffer[];
double Macd2Buffer[];
double Signal2Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Macd1Buffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Signal1Buffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Macd2Buffer);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,Signal2Buffer);
   
   IndicatorDigits(Digits);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {   
      double max1=-0.01,min1=0.01,
             max2=-0.01,min2=0.01,
             max_M1=-0.01,min_M1=0.01,
             max_M2=-0.01,min_M2=0.01,
             max_S1=-0.01,min_S1=0.01,
             max_S2=-0.01,min_S2=0.01;
             
       
 
   int bars_counted=WindowBarsPerChart()-1,
       limit;  
       limit=bars_counted;       


      
//---- macd counted in the 1-st buffer
   for(int i=0; i<limit; i++)
   

   { 
     Macd1Buffer[i]=iMA(NULL,0,6,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i);
  
           max_M1=MathMax(Macd1Buffer[i],max_M1);
           min_M1=MathMin(Macd1Buffer[i],min_M1);
  
      Signal1Buffer[i]=iMAOnArray(Macd1Buffer,Bars,5,0,MODE_SMA,i);
 
           max_S1=MathMax(Signal1Buffer[i],max_S1);
           min_S1=MathMin(Signal1Buffer[i],min_S1);         
             
           max1=MathMax(max_M1,max_S1);
           min1=MathMin(min_M1,min_S1);
             
   }          
            
      
//---- done
   //---- macd counted in the 3-st buffer   
   for(i=0; i<limit; i++) 
      
   { 
     
      Macd2Buffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
 
          
           max_M2=MathMax(Macd2Buffer[i],max_M2);
           min_M2=MathMin(Macd2Buffer[i],min_M2);
           
   
      Signal2Buffer[i]=iMAOnArray(Macd2Buffer,Bars,9,0,MODE_SMA,i);

           max_S2=MathMax(Signal2Buffer[i],max_S2);
           min_S2=MathMin(Signal2Buffer[i],min_S2);  
         
           max2=MathMax(max_M2,max_S2);
           min2=MathMin(min_M2,min_S2);    
   }      
      
//---- done 
   
 
      Comment( "\n"," Баров = ",WindowBarsPerChart()-1,
               "\n"," max_M1 = ",max_M1,
               "\n"," min_M1 = ",min_M1,
               "\n"," max_S1 = ",max_S1,
               "\n"," min_S1 = ",min_S1,
               "\n"," max_M2 = ",max_M2,
               "\n"," min_M2 = ",min_M2,
               "\n"," max_S2 = ",max_S2,
               "\n"," min_S2 = ",min_S2,
               "\n"," max1 = ",max1,
               "\n"," min1 = ",min1,    
               "\n"," max2 = ",max2,
               "\n"," min2 = ",min2);
         
             
         
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
MK07:

Por favor, avisadme, he colocado dos MACD (Macd1 y Macd2) en la misma ventana y en la misma escala. Encuentro los máximos y mínimos de cada MACD sólo entre los valores del gráfico visibles en la ventana del indicador. Los pongo en Comment(). Todo funciona, pero las líneas de señal empiezan a dibujarse desde la primera barra, es decir, tengo que esperar a que llenen toda la ventana. ¿Cómo solucionar este problema? ¿Y cómo puedo optimizar mi incómodo código?

Prueba, cada búfer en un bucle separado.
 
r772ra:
Pruébalo, cada buffer en un bucle separado.
Sí.
   for(int i=0; i<limit; i++)
   { 
     Macd1Buffer[i]=iMA(NULL,0,6,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i);
     Macd2Buffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);   
   }          

   for(i=0; i<limit; i++) 
   { 
      Signal1Buffer[i]=iMAOnArray(Macd1Buffer,Bars,5,0,MODE_SMA,i);
      Signal2Buffer[i]=iMAOnArray(Macd2Buffer,Bars,9,0,MODE_SMA,i);
   }      
 

Gracias por los consejos. Todo funciona, pero al instalar el indicador se dibuja de forma extraña (ver gráfico). La sangría (en barras) desde el borde izquierdo de la ventana del gráfico hasta la línea vertical amarilla es siempre SIN PARAR para CUALQUIER número de barras visibles en la ventana y es igual a ocho barras. Una vez que estas ocho barras sobrepasan el límite izquierdo de la ventana, aparecen inmediatamente TODAS las líneas del gráfico y entonces todo es normal. ¿Se puede arreglar y cómo?


#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Aqua
#property indicator_color4 DarkOrange
#property  indicator_width1  2
#property  indicator_width3  2
//--- buffers
double Macd1Buffer[];
double Signal1Buffer[];
double Macd2Buffer[];
double Signal2Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Macd1Buffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,Signal1Buffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Macd2Buffer);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,Signal2Buffer);
   
   IndicatorDigits(Digits);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {   
      double max1=-0.01,min1=0.01,
             max2=-0.01,min2=0.01,
             max_M1=-0.01,min_M1=0.01,
             max_M2=-0.01,min_M2=0.01,
             max_S1=-0.01,min_S1=0.01,
             max_S2=-0.01,min_S2=0.01;
             
       
 
   int bars_counted=WindowBarsPerChart()-1,
       limit;  
       limit=bars_counted;       


      
//---- macd counted in the 1-st buffer
   for(int i=0; i<limit; i++)
   
   { 
     Macd1Buffer[i]=iMA(NULL,0,6,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i);
     Macd2Buffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
      
           max_M1=MathMax(Macd1Buffer[i],max_M1);
           min_M1=MathMin(Macd1Buffer[i],min_M1);
           
           max_M2=MathMax(Macd2Buffer[i],max_M2);
           min_M2=MathMin(Macd2Buffer[i],min_M2);
   }
   
   for( i=0; i<limit; i++)
           
   {
      Signal1Buffer[i]=iMAOnArray(Macd1Buffer,Bars,5,0,MODE_SMA,i);
      Signal2Buffer[i]=iMAOnArray(Macd2Buffer,Bars,9,0,MODE_SMA,i);
      
           
           max_S1=MathMax(Signal1Buffer[i],max_S1);
           min_S1=MathMin(Signal1Buffer[i],min_S1);
           
           max_S2=MathMax(Signal2Buffer[i],max_S2);
           min_S2=MathMin(Signal2Buffer[i],min_S2);         
   }          
           max1=MathMax(max_M1,max_S1);
           min1=MathMin(min_M1,min_S1);
             
           
            
      

//---- done 
   
 
      Comment( "\n"," Баров = ",WindowBarsPerChart()-1,
               "\n"," max_M1 = ",max_M1,
               "\n"," min_M1 = ",min_M1,
               "\n"," max_S1 = ",max_S1,
               "\n"," min_S1 = ",min_S1,
               "\n"," max_M2 = ",max_M2,
               "\n"," min_M2 = ",min_M2,
               "\n"," max_S2 = ",max_S2,
               "\n"," min_S2 = ",min_S2,
               "\n"," max1 = ",max1,
               "\n"," min1 = ",min1,    
               "\n"," max2 = ",max2,
               "\n"," min2 = ",min2);
         
             
         
//----
   return(0);
  }
//+------------------------------------------------------------------+
Razón de la queja: