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

 
Galim_V:

Así es como se modifica

hay muchos errores en el código, en

if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))

es mejor normalizar los precios, entonces funcionarán, luego el servidor dará un error de "precios erróneos", es deseable normalizarStopLoss_SELL

y lo más probable es que tenga que comprobar si el StopLoss es igual a cero - no es deseable comparar números reales para que sean iguales, debe tratar de comparar números reales a > o <

 
Jessy111:

Ayúdenme a arreglar un error en el indicador, no dibuja el máximo y el mínimo del día cuando está en la última vela de la hora.

He esbozado el indicador, a tu código no le gusta trabajar con cadenas, yo lo escribiría más sencillo, aquí tienes un ejemplo. Aunque si su tarea es tener en cuenta el desfase horario del servidor, entonces se necesita el camino inverso.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "HighDay"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "LowDay"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

static int LastDay=-1,daystart;
static double dhigh,dlow;
//--- indicator buffers
double         H[],L[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,H);
   SetIndexBuffer(1,L);
   IndicatorDigits(_Digits);
   LastDay=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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,j,limit;
   if(prev_calculated==0)
     {
      limit=rates_total-1;
      LastDay=-1;
      daystart=limit;
      dhigh = high[limit];
      dlow  = low[limit];
// расчет истории      
      for(i=limit; i>=0 && !IsStopped(); i--)
        {
         if(LastDay!=TimeDay(time[i]))
           {
            LastDay=TimeDay(time[i]);
            j=daystart;
            daystart=i;
            while(j>daystart)
              {
               H[j]=dhigh;
               L[j]=dlow;
               j--;
              }
            dhigh = high[i];
            dlow  = low[i];
           }
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
        }
// рисуем текущий день при первом запуске
      i=daystart;
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
   else
     {
// рисуем текущий день на каждом тике
      i=0;
      dhigh = high[0];
      dlow  = low[0];
      while(TimeDay(time[0])==TimeDay(time[i]))
        {
         dhigh= fmax(dhigh,high[i]);
         dlow =  fmin(dlow,low[i]);
         i++;
        }
      while(i>=0)
        {
         H[i]=dhigh;
         L[i]=dlow;
         i--;
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

Mi ejemplo tampoco es un ejemplo, lo escribí rápido, creo que no debería haber contado desde el final de la historia hasta el principio en la primera ejecución, sino desde la barra cero hasta la historia, el código habría sido más corto y habría sido capaz de calcular el día actual más rápido - el ciclo habría sido más corto,

Pero lo he comprobado en el tester, parece que funciona sin problemas, que sea así, es tarde, tengo sueño... Hice un mal ejemplo (((

 
Igor Makanu:

hay muchos errores en el código, en

es mejor normalizar los precios, entonces funcionarán, luego el servidor dará un error de "precios erróneos", es deseable normalizarStopLoss_SELL

Y lo más probable es que tenga que comprobar si el StopLoss es igual a cero, y no es deseable comparar números reales para que sean iguales, debe intentar comparar números reales a > o <

Así es. Acabo de mostrar un lugar en el código, por qué no modifica las órdenes de mercado: solicitar un stop del mercado dará 0.

 
Igor Makanu:

Aquí tienes un indicador esbozado, no me gusta tu código con cadenas, yo lo escribiría más sencillo, aquí tienes un ejemplo. Aunque si su tarea es tener en cuenta el desfase horario del servidor, entonces tiene que hacerlo de otra manera.

Mi ejemplo tampoco es un ejemplo, lo escribí rápido, creo que no debería haber contado desde el final de la historia hasta el principio en la primera ejecución, sino desde la barra cero hasta la historia, el código habría sido más corto y habría sido capaz de calcular el día actual más rápido - el ciclo habría sido más corto,

Pero lo he comprobado en el tester, parece que funciona sin problemas, que sea así, es tarde, tengo sueño... Mal ejemplo hecho (((

No es mi código, lo encontré en Internet, no sé escribir indicadores. :)

Por si sirve de algo un mal ejemplo, me ha gustado mucho tu indicador, funciona en el Probador de Estrategias y en gráficos reales.

Muchas gracias por la rápida ayuda.

¿Puedo pedirte también que elimines las líneas que dibujan el canal? Las he marcado con flechas rojas en la captura de pantalla.

Y si no es mucha molestia, por favor, añade la función de desactivar/activar la formación de líneas en el día actual. Los he marcado en la captura de pantalla con flechas azules. https://prnt.sc/kuuj3e

Gracias de antemano.

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
 

¡Hola querida!

Por favor, indíquenos cómo ejecutar el procedimiento OnInit();

después de cambiar las variables del Asesor Experto?

Cuando se coloca el Asesor Experto en el gráfico, hay OnInit(); pero cuando se cambian las variables, ¡no hay OnInit!

¿Cómo identificar el evento de cambio de variable del Asesor Experto?

Por favor, ayuda con consejos, o más bien con código, ¿cómo hacerlo?

 
Игорь:

¡Hola querida!

Por favor, indíquenos cómo ejecutar el procedimiento OnInit();

después de cambiar las variables del Asesor Experto?

Cuando se coloca el Asesor Experto en el gráfico, hay OnInit(); pero cuando se cambian las variables, ¡no hay OnInit!

¿Cómo identificar el evento de cambio de variable del Asesor Experto?

Por favor, ayuda con consejos, o más bien con código, ¿cómo hacerlo?

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input int var1 = 1;
//+------------------------------------------------------------------+
int OnInit()
  {
      Print("Вызов OnInit(), var1=",var1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+

Experimenta con este código, lee el mensaje en el registro del EA (cambia el TF, introduce la variable, reinicia el terminal sin cerrar el EA...)

y la segunda opción es describir en el ámbito global la variable con el modificador static

#property strict

input int var1=1;
static bool FirstRun=true;
//+------------------------------------------------------------------+
int OnInit()
  {
   Print("Вызов OnInit(), var1=",var1);
// раскоментируйте FirstRun=true; если нужно контролировать вызов OnInit()
//   FirstRun=true;     
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(FirstRun)
     {
      Print("Это первый запуск эксперта");
      FirstRun=false;
     }
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Experimente con dicho código, lea el mensaje en el registro del Asesor Experto (cambie el TF, introduzca la variable, recargue el terminal sin cerrar el Asesor Experto...)

y la segunda opción es describir en el ámbito global la variable con el modificador static

En el ámbito global con el modificador static????? Esto es una especie de perversión.

 
Alexey Viktorov:

A nivel global con el modificador estático ????? Esto es una especie de perversión.

Pero según mi experiencia, cuando se actualizan a menudo las compilaciones de MT4, es mejor escribirlas según el C++ clásico, que escuchar la respuesta "escribir el código correctamente" cuando se comunica con los desarrolladores



ZS: Recuerdo por qué empecé a escribir el modificador estático globalmente, si quiero asegurarme de que no voy a "perder" el valor de la variable durante la ejecución del programa MQL. Antes (hace unos 5 años) la directiva precompiladora #property strict no existía y al habilitar los archivos (#include o library - ya no lo recuerdo) "perdí mi variable" una vez, ya que los nombres de las variables coincidían con el nombre de la variable.Pero si escribiera un modificador estático el compilador mostraría un error de compilación en ese caso también.

El compilador actual es MT4, bastante manejable y fiable, y con la directiva #property strict, quizás no necesite esas precauciones, pero escribo static por costumbre cuando no quiero "perder un valor" de una variable

ZZZY: este modificador no afecta a la velocidad de ejecución del programa MQL, y es conveniente para mí para abrir mi código después de algún tiempo, y habiendo visto estática voy a saber exactamente, que esta variable tiene un valor, que es importante "no perder" durante la ejecución del programa

 
Igor Makanu:

Pero según mi experiencia, cuando se actualizan a menudo las compilaciones de MT4, es mejor escribirlas según el C++ clásico, que escuchar la respuesta "escribir el código correctamente" cuando se comunica con los desarrolladores



ZS: Recuerdo por qué empecé a escribir el modificador estático globalmente, si quiero asegurarme de que no voy a "perder" el valor de la variable durante la ejecución del programa MQL. Antes (hace unos 5 años) la directiva precompiladora #property strict no existía y al habilitar los archivos (#include o library - ya no lo recuerdo) "perdí mi variable" una vez, ya que los nombres de las variables coincidían con el nombre de la variable.Pero si escribiera un modificador estático el compilador mostraría un error de compilación en ese caso también.

El compilador actual de MT4 es bastante práctico y fiable, y con la directiva #property strict, quizás no necesite tales precauciones, pero escribo static por costumbre cuando no quiero "perder un valor" de una variable

ZZZY: este modificador no afecta a la velocidad de ejecución del programa MQL, y es conveniente para mí para abrir mi código después de algún tiempo, y habiendo visto estática voy a saber exactamente, que esta variable tiene un valor, que es importante "no perder" durante la ejecución del programa

El compilador generará una advertencia si los nombres de las variables coinciden con los del archivo de inclusión. Para mí, una advertencia es igual a un error y reacciono a ellos de la misma manera. Y las variables globales de nivel con modificador estático son iguales al aceite.

Pero... Si te gusta escribir así, nadie te lo puede prohibir.

 
Alexey Viktorov:

Pero... Pero... si te gusta escribirlo así, nadie te lo puede prohibir.

Tengo dudas acerca de mi singularidad en este asunto... No soy el único, buscando en la carpeta de MQL5 he encontrado este tipo de declaraciones con modificador estático a nivel global en varios códigos fuente de la entrega de MT5

Incluso en el artículo "BOSQUE DE DECISIONES ALEATORIAS EN EL RESUMEN" en el código fuente encontré una declaración a nivel global: static datetime last_time=0;

así que escribí como me parece que asignar y será, no lo hago 100% de las variables a nivel global que describe como estática

Dios protege a los necesitados, dijo la monja... ))))