Estructura sencilla de una orden de entrada. ¿Qué error está informando?

 

Saludos. Estoy aprendiendo a programar en MQL5. Leyendo el manual y comparando con MQL4. Tengo una duda respecto a este código (se trata de algo muy sencillo solo para entender la estructura de una orden de entrada):


void OnTick()
  {

// declaración de variables:

  double ATR, TENDENCIA, TEND_ALZA;

  int ticket;
  ATR= iATR(NULL, PERIOD_M15, 14, 1);
  TENDENCIA=iADX(NULL,0,PERIOD_M15,MODE_MAIN,1)>25;
  TEND_ALZA=iADX(NULL,0,PERIOD_M15,MODE_PLUSDI,1)>iADX(NULL,0,PERIOD_M15,MODE_PLUSDI,2);
//--- condición y entrada

   if (OrdersTotal()<1 && TENDENCIA && TEND_ALZA)
      {
      ticket=OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-50*Point,Ask+50*Point,NULL,0,clrNONE);
      }
  

  }


Una vez compilo el código, me dice error "wrong parameters count", y situa el cursos justo al comienzo de donde comienza a decir "iADX".


¿Alguien puede ayudarme con esto?

 
trader201:

Saludos. Estoy aprendiendo a programar en MQL5. Leyendo el manual y comparando con MQL4. Tengo una duda respecto a este código (se trata de algo muy sencillo solo para entender la estructura de una orden de entrada):


void OnTick()
  {

// declaración de variables:

  double ATR, TENDENCIA, TEND_ALZA;

  int ticket;
  ATR= iATR(NULL, PERIOD_M15, 14, 1);
  TENDENCIA=iADX(NULL,0,PERIOD_M15,MODE_MAIN,1)>25;
  TEND_ALZA=iADX(NULL,0,PERIOD_M15,MODE_PLUSDI,1)>iADX(NULL,0,PERIOD_M15,MODE_PLUSDI,2);
//--- condición y entrada

   if (OrdersTotal()<1 && TENDENCIA && TEND_ALZA)
      {
      ticket=OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-50*Point,Ask+50*Point,NULL,0,clrNONE);
      }
  

  }


Una vez compilo el código, me dice error "wrong parameters count", y situa el cursos justo al comienzo de donde comienza a decir "iADX".


¿Alguien puede ayudarme con esto?

Respondo yo mismo: El error era que me faltaba colocar de que precio (si apertura, cierre, etc...) tomar los datos para calcular este indicador, después de "período".


Saludos.

 
trader201:

Respondo yo mismo: El error era que me faltaba colocar de que precio (si apertura, cierre, etc...) tomar los datos para calcular este indicador, después de "período".


Saludos.

No, el error lo tienes en que usas el puntero al indicador como si fuera el dato directamente. iADX() inicia el puntero pero los datos se extraen con CopyBuffer(), se cargan en una matriz y desde esa matriz se elaboran o analizan para, por ejemplo, compararlos y comprobar tendencia.

El puntero se inicia en OnInit() y CopyBuffer() se llama cada vez que necesitas los datos en OnTick(), OnTimer(), etc.

 
josemiguel1812:

No, el error lo tienes en que usas el puntero al indicador como si fuera el dato directamente. iADX() inicia el puntero pero los datos se extraen con CopyBuffer(), se cargan en una matriz y desde esa matriz se elaboran o analizan para, por ejemplo, compararlos y comprobar tendencia.

El puntero se inicia en OnInit() y CopyBuffer() se llama cada vez que necesitas los datos en OnTick(), OnTimer(), etc.

¿Podrias darme un ejemplo? (Con algo sencillo, para ver la idea). Digamos, como sería el código de indicador que compra cuando ADX tiene valor mayor a 15.



void OnTick()
  {

// declaración de variables:

  double TENDENCIA;

  TENDENCIA=iADX(NULL,0,PERIOD_M15,MODE_MAIN,1)>15;


//--- condición y entrada


   if (OrdersTotal()==0 && TENDENCIA)
      {
      int ticket=OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-50*Point,Ask+50*Point,NULL,0,0, clrNONE);
      }
  

  }

return(0);

 
trader201:

¿Podrias darme un ejemplo? (Con algo sencillo, para ver la idea). Digamos, como sería el código de indicador que compra cuando ADX tiene valor mayor a 15.



void OnTick()
  {

// declaración de variables:

  double TENDENCIA;

  TENDENCIA=iADX(NULL,0,PERIOD_M15,MODE_MAIN,1)>15;


//--- condición y entrada


   if (OrdersTotal()==0 && TENDENCIA)
      {
      int ticket=OrderSend(Symbol(),OP_BUY,0.01,Ask,3,Ask-50*Point,Ask+50*Point,NULL,0,0, clrNONE);
      }
  

  }

return(0);

void OnInit()
{
   /.../
   SetIndexBuffer(0, MAbuffer, INDICATOR_DATA);
   SetIndexBuffer(1, supATRBuffer, INDICATOR_DATA);          
   SetIndexBuffer(2, infATRBuffer, INDICATOR_DATA);           
   
   ArraySetAsSeries(MAbuffer, true);                         
   ArraySetAsSeries(supATRBuffer, true);
   ArraySetAsSeries(infATRBuffer, true);

   /.../
   
   ResetLastError();
   puntATR= iATR(simb, 0, ATRperiodo);
   puntMA= iMA(simb,PERIOD_CURRENT,MAperiodoTrab,0,MODE_SMA,precioAplic); break;
   if(puntATR==INVALID_HANDLE || puntMA==INVALID_HANDLE) infoError(GetLastError(), "Canal ATR "+__FUNCTION__);
   
   /.../
   
}
  
int OnCalculate(const int rangoTotal,
                const int preCalculado,
                const int inicio,          
                const double& precio[])    
{
   int vela, limite, aCopiar;
   double ATR[], atr;
                                                         //comprobando si el número de barras es suficiente para el cálculo
   if(BarsCalculated(puntMA)<rangoTotal || BarsCalculated(puntATR)<rangoTotal || rangoTotal<minRangoTotal) return(0);
   ArraySetAsSeries(ATR,true);
   limite= rangoTotal-preCalculado;                      //inicializa el índice para el cálculo de nueva barra
   if(preCalculado>rangoTotal || preCalculado<=0) limite= rangoTotal-minRangoTotal-1; //inicializa el índice para el cálculo de todas las barras
   aCopiar= limite+1;
   if(CopyBuffer(puntATR, 0, 0, aCopiar, ATR)<=0) return(0);
   if(CopyBuffer(puntMA, 0, 0, aCopiar, MAbuffer)<=0) return(0);

   for(int vela= limite; vela>=0; vela--)
   {
      atr= factorATR*ATR[vela];
      supATRBuffer[vela]= MAbuffer[vela]+atr;
      infATRBuffer[vela]= MAbuffer[vela]-atr;
   }
   return(rangoTotal);
}
 
josemiguel1812:

Gracias josemiguel1812. Me has respondido varias preguntas (y con respuestas no cortas). Muy agradecido.