Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 931

 
Vitaliy Sendyaev:

¡Buenas tardes!

¿Sabe cómo construir un indicador para el mercado?

Tengo un archivo con extensión .mq5 y algunos archivos de inclusión con extensión .mqh.

Por lo que tengo entendido, no se puede adjuntar el archivo .mqh al archivo .mqh a través de los recursos, ¿debo convertirlo todo en un solo archivo manualmente?

¿Y si hay una nueva versión :? Es una locura +)))

Gracias.

Usted envía el archivo compilado (.ex5) al Mercado. Este archivo ya contendrá todos sus archivos de inclusión.

 
Vladimir Karputov:

Una contrapregunta: "¿Por qué hay que asignar explícitamente un símbolo aquí?

Si utiliza esta función, debe asignar un símbolo a m_symbol en OnInit:

En este caso, si ejecuta el EA en el símbolo "EURUSD.m", "EURUSD.m" se establecerá automáticamente para m_symbol.

Lo que pasa es que el Asesor Experto se cierne sobre un símbolo diferente. Y necesito actualizar las cotizaciones de EURUSD.m

Encontré esta solución pero creo que es incorrecta

void OnTick()
  {   
// Обновляем котировки
    if(!m_symbol.Name("EURUSD.m")) //Обновляем котировки по второму символу
    RefreshRates();
    if(!m_symbol.Name("GBPUSD.m")) //Обновляем котировки по символу где висит советник
    RefreshRates();
 
EgorKim:

Esa es la cuestión, el EA se cierne sobre un símbolo diferente. Y necesito actualizar las cotizaciones de EURUSD.m

He encontrado esta solución pero no creo que sea la correcta

Escribe el símbolo EURUSD.m en InInit para m_symbol. O dime qué haces y cómo lo haces, mientras yo intento jugar a las adivinanzas.
 

¡¡¡Amigos, por favor, aconsejen!!!

¿Cómo puede la función TimeCurrent() pasar los valores de horas y minutos a las variables para que puedan trabajar con estos valores?

O por ejemplo quiero pasar horas y minutos con la cadena (12:15) y pasar 12 y 15 a las variables. ¿Cómo hacerlo?
 
TaywinLannister:

¡¡¡Amigos, por favor, aconsejen!!!

¿Cómo puede la función TimeCurrent() pasar los valores de horas y minutos a las variables para poder trabajar con estos valores?

O por ejemplo quiero pasar la hora y los minutos con la cadena (12:15) y pasar 12 y 15 a las variables. ¿Cómo hacerlo?

TimeToStruct

 
Konstantin Nikitin:

TimeToStruct

Gracias.
 
Hola, he convertido el indicador de Metatrader 4 a Metatrader 5, pero ahora muestra las flechas en lugares equivocados como en Metatrader 4 en el marco de tiempo de un minuto. ¿Me he equivocado en algo o es por las diferentes cotizaciones en el gráfico de minutos de las versiones 4 y 5 del terminal de un broker?
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
#property indicator_color1  clrBlue
#property indicator_color2  clrRed

#property indicator_width1  1 
#property indicator_width2  1 
//+------------------------------------------------------------------+

double     SignalBufferRed[];
double     SignalBufferBlue[];
datetime TimeAlert=0;
ENUM_TIMEFRAMES tf0,tf1,tf2,tf3,tf4,tf5; // Было инт
int S=0;
//+------------------------------------------------------------------+
int OnInit()
  {
  
    SetIndexBuffer(0,SignalBufferBlue);
    SetIndexBuffer(1,SignalBufferRed); 
//--- задать рисование линии 
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_ARROW); 
//--- задание стиля для рисования линии 
   PlotIndexSetInteger(0,PLOT_ARROW,233); 
   //--- задать рисование линии 
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_ARROW); 
//--- задание стиля для рисования линии 
   PlotIndexSetInteger(1,PLOT_ARROW,234); 
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,5); 
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-5); 
   //--- установим в качестве пустого значения 0 
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0); 
   //--- установим в качестве пустого значения 0 
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0); 





   tf0=Period();
   tf1=next_period(tf0+1);
   tf2=next_period(tf1+1);
   tf3=next_period(tf2+1);
   tf4=next_period(tf3+1);
   tf5=next_period(tf4+1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
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[])
  {
   int i,limit;

   limit=rates_total-prev_calculated-1;
   if(rates_total<1) return(0);
   double d=(high[1]-low[1]+high[2]-low[2])/2;
   for(i=limit; i>=0; i--)
     {
      if(S<1 && NormalizeDouble(open[i]-close[i],_Digits)<0 && 
         NormalizeDouble(iOpen(NULL,tf1,iBarShift(NULL,tf1,time[i],false))-iClose(NULL,tf1,iBarShift(NULL,tf1,time[i],false)),_Digits)<0 && 
         NormalizeDouble(iOpen(NULL,tf2,iBarShift(NULL,tf2,time[i],false))-iClose(NULL,tf2,iBarShift(NULL,tf2,time[i],false)),_Digits)<0 && 
         NormalizeDouble(iOpen(NULL,tf3,iBarShift(NULL,tf3,time[i],false))-iClose(NULL,tf3,iBarShift(NULL,tf3,time[i],false)),_Digits)<0 && 
         NormalizeDouble(iOpen(NULL,tf4,iBarShift(NULL,tf4,time[i],false))-iClose(NULL,tf4,iBarShift(NULL,tf4,time[i],false)),_Digits)<0 && 
         NormalizeDouble(iOpen(NULL,tf5,iBarShift(NULL,tf5,time[i],false))-iClose(NULL,tf5,iBarShift(NULL,tf5,time[i],false)),_Digits)<0)
        {
         SignalBufferBlue[i]=low[i]-d;
...
         S=1;
        }
      if(S>-1 && NormalizeDouble(open[i]>close[i],_Digits)>0 && 
         NormalizeDouble(iOpen(NULL,tf1,iBarShift(NULL,tf1,time[i],false))-iClose(NULL,tf1,iBarShift(NULL,tf1,time[i],false)),_Digits)>0 && 
         NormalizeDouble(iOpen(NULL,tf2,iBarShift(NULL,tf2,time[i],false))-iClose(NULL,tf2,iBarShift(NULL,tf2,time[i],false)),_Digits)>0 && 
         NormalizeDouble(iOpen(NULL,tf3,iBarShift(NULL,tf3,time[i],false))-iClose(NULL,tf3,iBarShift(NULL,tf3,time[i],false)),_Digits)>0 && 
         NormalizeDouble(iOpen(NULL,tf4,iBarShift(NULL,tf4,time[i],false))-iClose(NULL,tf4,iBarShift(NULL,tf4,time[i],false)),_Digits)>0 && 
         NormalizeDouble(iOpen(NULL,tf5,iBarShift(NULL,tf5,time[i],false))-iClose(NULL,tf5,iBarShift(NULL,tf5,time[i],false)),_Digits)>0)
        {
         SignalBufferRed[i]=high[i]+d;
...
         S=-1;
        }
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES next_period(int per) // Было инт
  {
   if(per > PERIOD_W1)  return(PERIOD_MN1);  // Былы цифры вместо период_
   if(per > PERIOD_D1)   return(PERIOD_W1);   // Былы цифры вместо период_
   if(per > PERIOD_H4)    return(PERIOD_D1);  // Былы цифры вместо период_
   if(per > PERIOD_H1)     return(PERIOD_H4);  // Былы цифры вместо период_
   if(per > PERIOD_M30)     return(PERIOD_H1);  // Былы цифры вместо период_
   if(per > PERIOD_M15)     return(PERIOD_M30);   // Былы цифры вместо период_
   if(per >  PERIOD_M5)     return(PERIOD_M15);  // Былы цифры вместо период_
   if(per >  PERIOD_M1)     return(PERIOD_M5);  // Былы цифры вместо период_
   if(per == PERIOD_M1)     return(PERIOD_M1);  // Былы цифры вместо период_
   return(Period());
  }
//+------------------------------------------------------------------+
 
Yevgen Butov:
Hola! He convertido el indicador de metatrader 4 a metatrader 5, pero ahora muestra las flechas en los lugares equivocados como en metatrader 4 en un período de minutos. ¿Me he equivocado en algo o es por las diferentes cotizaciones en el gráfico de minutos de las versiones 4 y 5 del terminal de un broker?

Haga una simple prueba en el indicador MQL5 y MQL4 - imprima el tiempo de barra #0:

Print("Bar #0: ",time[0]);

Esto ayudará a entender qué es lo que...

 
Vladimir Karputov:

Haga una simple prueba en el indicador MQL5 y MQL4 - imprima el tiempo de barra #0:

Esto ayudará a entender qué es lo que...

Añadido este texto a OnCalculate, el tiempo de la barra cambia cada minuto ahora, pero ahora no hay flechas en absoluto. ¿Cuál puede ser el error?

ArraySetAsSeries(time,true); 

   ArraySetAsSeries(open,true); 

   ArraySetAsSeries(high,true); 

   ArraySetAsSeries(low,true); 

   ArraySetAsSeries(close,true); 
 
Yevgen Butov:

Añadido este texto a OnCalculate, ahora la hora de la barra cambia cada minuto, pero ahora no hay flechas. ¿Cuál puede ser el error?

No lo has hecho bien. Compara los valores impresos. Compara el tiempo de barra #0 y el tiempo de barra #rates_total-1. Compara tanto allí como allí...