Descargar MetaTrader 5

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

Para añadir comentario, por favor Autorícese o regístrese
trader201
410
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?

trader201
410
trader201  
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.

Jose Miguel Soriano
5052
Jose Miguel Soriano  
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.

trader201
410
trader201  
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);

Jose Miguel Soriano
5052
Jose Miguel Soriano  
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);
}
trader201
410
trader201  
josemiguel1812:

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

Para añadir comentario, por favor Autorícese o regístrese