Discusión sobre el artículo "Traslado de MQL4 a MQL5" - página 4

 
Interesting :

Empecé a dudar mucho de la funcionalidad de este diseño. Por más que intentaba entender la lógica del bloque, no podía (y lo intenté con todas mis fuerzas).....

¿Cuál es la duda? Cuenta correctamente.

//+------------------------------------------------------------------+
//|prueba.mq5
//+------------------------------------------------------------------+
#include <InitMQL4.mqh>
double   close[];
int      total,count;
datetime time[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   count=Bars(_Symbol,_Period);
   total=CopyClose(_Symbol,_Period,0,count,close);
   total=CopyTime(_Symbol,_Period,0,count,time);
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   int N=7;
   int shift=iBarShiftMQL4(_Symbol,_Period,time[N]);
   Print("TIME",time[N],"BAR=",shift," CLOSE=",close[shift]);
  }
//+------------------------------------------------------------------+
int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
//+------------------------------------------------------------------+
[Eliminado]  
DC2008 :

¿Cuál es el problema? Está contando correctamente.

Y ahora el abracadabra


1. En MT4 escribimos esta línea y ejecutamos el código en H4

Print(iBarShift(Symbol(),Period(),1274356800,false)); //fecha 20.05.2010 12:00 pm

Luego hacemos lo mismo con MT5 y la cadena.

int shift=iBarShiftMQL4(_Symbol,_Period,StringToTime("20.05.2010 12:00"),false);

como resultado obtenemos 8.


2. Después hacemos exactamente la misma operación, pero con D1.

Como resultado MT4 devuelve - 1 y MT5 devuelve 0.

Ahora quien me puede decir hasta que punto esta implementación de iBarShiftMQL4 corresponde a lo necesario...

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
 

Prueba este:

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
     {
      if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
      if(time<time1) return(1);
      else return(0);
     }
   else return(-1);
  }
 

De nuevo, ¿has leído sobre la función que estás escribiendo???

en mcl4 está escrito exactamente

double iClose( string symbol, int timeframe, int shift)
Devuelve el valor del precio de cierre de la barra del gráfico correspondiente(símbolo, timeframe) especificado por el parámetro shift. En caso de error, la función devuelve 0. Para obtener más información sobre el error, llame a la función GetLastError().
Para el gráfico actual, la información sobre los precios de cierre se encuentra en la matriz predefinida Close[].

y tienes....

return(-1);

qué están mirando los moderadores...

 

Gracias, CoreWinTT.

Corregidas las funciones: iClose, iLow, iHigh, iOpen, iTime, iVolume. Devuelven 0 en lugar de -1 en caso de error.

 

y cuando estarán en la biblioteca???

para que estuvieran al menos

Porque si lo abres, surge la pregunta, y el significado de lo anterior escrito????.

y también por lo menos recoger las funciones para las que se resuelven todas las preguntas y proceder a estudiar los errores en el resto.

 
bool  SetIndexBuffer(
   int                    index,         // índice del búfer
   double                 buffer[],      // matriz
   ENUM_INDEXBUFFER_TYPE  data_type      // lo que vamos a almacenar
   );

el otro día, alguien sugirió una forma inteligente de crear un entorno μl4

utilizando matrices de

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[])

pero será difícil utilizarlos porque tienen estado const.

No se pueden crear buffers globales

porque deben declararse con la ayuda de

SetIndexBuffer

Asocia el buffer indicador especificado con un array dinámico unidimensional de tipo double declarado globalmente.

pero sólo de tipo double, y los volúmenes y arrays de tipo date-time no pasarán.

Lo único que queda es iniciar estos arrays dentro del módulo mql4.

que es prácticamente igual a reescribir el indicador....

 
CoreWinTT:

¿y cuándo estarán en la biblioteca?

Ya están.
 
está vacío y estaba vacío y sólo un montón de define y nada más....
[Eliminado]  
CoreWinTT:

y cuando estarán en la biblioteca???

para que estuvieran al menos

Porque si lo abres, surge la pregunta, y el significado de lo anterior escrito????.

y también por lo menos recoger las funciones para las que se resuelven todas las preguntas y proceder a estudiar los errores en el resto.

Hay un montón de soluciones sobre este tema en las bibliotecas privadas durante mucho tiempo.

Yo, por ejemplo, he estado usando IsTesting() y cosas similares desde el principio, también todo se ha resuelto con fecha y hora durante mucho tiempo (por supuesto, hay otras soluciones)....

Otra cosa es la presencia de esas "Soluciones desfasadas" en la propia MT5....