Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 943

 

Chicos, por favor ayúdenme en el código para cambiar el TF d1/semana a cualquier otro.

Sé cómo cambiarlo a H1 o minutos.

¿Interesado en cómo cambiar a m30, m15, m5?

//|                                               For__red_r2005.mq4 |
//|                                       Copyright © 2010, PapaYozh |
//|                                                                * |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, PapaYozh"
#property link      "*"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Coral
#property indicator_color2 CornflowerBlue
#property indicator_width1 2
#property indicator_width2 2

// ---- buffers ----
double BuffD[];
double BuffM[];
//+------------------------------------------------------------------+
int init()
{
   SetIndexBuffer(0,BuffD);
   SetIndexEmptyValue(0,EMPTY_VALUE);
   SetIndexStyle(0,DRAW_SECTION,EMPTY,EMPTY);

   SetIndexBuffer(1,BuffM);
   SetIndexEmptyValue(1,EMPTY_VALUE);
   SetIndexStyle(1,DRAW_SECTION,EMPTY,EMPTY);
   
   return(0);
} // init()
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
} // deinit()
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
int start()
{
   int    shift;

   shift = Bars - 1 - IndicatorCounted();
   for ( ; shift>0 ; shift-- )
   {
      if ( TimeDayOfYear(Time[shift]) != TimeDayOfYear(Time[shift-1]) )
      {
         BuffD[shift]   = Close[shift];
         if ( TimeDayOfWeek(Time[shift-1]) == 1 )
            BuffM[shift]   = Close[shift];
         else
            BuffM[shift]   = EMPTY_VALUE;
      }
      else
      {
         BuffD[shift]   = EMPTY_VALUE;
         BuffM[shift]   = EMPTY_VALUE;
      }
   }
   return(0);
} // start()
//+------------------------------------------------------------------+
 
Necesito pausar el indicador por un tiempo, pero la función Sleep(), como se indica en la ayuda, no puede ser llamada desde el indicador personalizado... ¿Hay alguna otra manera?
 
Yevhenii Levchenko:
Necesito pausar el indicador durante algún tiempo, pero la función Sleep(), como se menciona en la ayuda, no puede ser llamada desde el indicador personalizado... ¿Hay otras formas?

salida por condición en OnCalculate() sin calcular los valores del indicador - lo más fácil es el contador de ticks, un poco más complicado es usar un temporizador, funciona en los indicadores

 
Igor Makanu:

salida por condición en OnCalculate() sin calcular los valores del indicador - lo más fácil es el contador de ticks, un poco más complicado es usar un temporizador, funciona en los indicadores

Gracias.

Lo he hecho con temporizador. Esta opción me pareció más fácil...

 
Yevhenii Levchenko:

Gracias.

Lo hice con un temporizador. Esta opción me pareció más fácil...

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[])
  {
//---
   static int TickCount = 0;
   TickCount--;
   if(TickCount>0) return(rates_total);
   TickCount=10;
 
Igor Makanu:

Me había olvidado por completo de las variables estáticas... Gracias :)

¿Y si declaras una variable ordinaria como variable global, será de hecho lo mismo que una variable estática en cierto sentido? En el sentido, ¿estará disponible para cambiar desde todos los lugares del programa?

 

Hola.

¿Pueden decirme si es posible pasar un array dinámico de tipo estructura por referencia a una función?

Por ejemplo, para pasar struct_name_array[] array a Func() para que lo procese y lo llene allí:

struct StructName {int x;
                   int y;} struct_name_array[];

void Func (int &x[],
           int &y[])
        {
        }

¿Cómo se gestiona exactamente la transferencia, si es que es posible? ¿Cómo se formatean los parámetros de la función? No puedo utilizar las guías de C++.

Gracias.

 
Mikhail Sobolev:

Por ejemplo, pasar un array struct_name_array[] a Func() para que lo procese y lo rellene allí:

//+------------------------------------------------------------------+
struct StructName
  {
   int               x;
   int               y;
  }
struct_name_array[];
//+------------------------------------------------------------------+
void OnStart()
  {
   ArrayResize(struct_name_array,5);
   for(int i=0;i<5;i++)
     {
      struct_name_array[i].x = i;
      struct_name_array[i].y = i*100;
     }
   Func(struct_name_array);
   for(int i=0;i<5;i++)
     {
      printf("%s : s[%d].x = %d , s[%d].y = %d",__FUNCTION__,i,struct_name_array[i].x,i,struct_name_array[i].y);
     }
  }
//+------------------------------------------------------------------+
void Func(StructName &s[])
  {
   for(int i=0;i<ArraySize(s);i++)
     {
      printf("%s : s[%d].x = %d , s[%d].y = %d",__FUNCTION__,i,s[i].x,i,s[i].y);
      s[i].x*=33;
      s[i].y*=12;
     }
  }
//+------------------------------------------------------------------+
 

¡Hola!

Me doy cuenta de que ya he molestado a mucha gente aquí con mis estúpidas preguntas, así que por favor, sé indulgente con lo siguiente y sigue explicando lo que está mal aquí:

        if((op1-lo1)>50 && (cl1-lo1)<10)
        {  Alert("VertLine");
        string obj_name="VertLine";
        datetime time=Time[0];
        color col = clrGreen; 
        ObjectCreate(0,obj_name,OBJ_VLINE,0,time,0,0,0);
        ObjectSetInteger(0,obj_name,OBJPROP_COLOR,col);
        }

La alerta se emite, pero no hay línea vertical. ¿Cuál es la razón?

 
novichok2018:

¡Hola!

Me doy cuenta de que ya he molestado a mucha gente aquí con mis estúpidas preguntas, así que por favor, sé indulgente con lo siguiente y sigue explicando lo que está mal aquí:

La alerta se emite, pero no hay línea vertical. ¿Cuál es la razón?

Ya he entendido el motivo, incluso la propia referencia al foro. Creo que entendí que ya había trazado una línea. Para poder trazar otras líneas, tengo que borrar ésta.