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

 
Eugen8519:

Así es como se cierra el pedido

Haz lo que escribí arriba...

O bien, publique el código de OnTick()

 
Eugen8519:

Así es como se cierra el pedido

Esta estructura debe ser

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeToStruct(TimeCurrent() , str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
   if(YesStop==false)
     {
      if(EMA0...)
        {
         .....
         OPENORDER("Sell");
        }
   
      if(EMA0...)
        {
         .....
         OPENORDER("Buy");
        }
     }
//---
   if(EMA0...)
     {
      .....
      CLOSEORDER("Sell");
     }

   if(EMA0...) 
     {
      .....
      CLOSEORDER("Buy");
     }
  }
//+------------------------------------------------------------------+
void CLOSEORDER(string ord)
  {
   .....
  }
//---
void OPENORDER(string ord)
  {
   .....
  }
 
Gracias por el consejo, lo comprobaré esta noche e informaré más tarde.
 
MakarFX:

Esta estructura debe ser

Si no me equivoco, se puede escribir de la siguiente manera

   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeCurrent(str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
 
Eugen8519:
Bueno, gracias por el consejo, lo comprobaré esta noche e informaré más tarde.

si se establece UseTimeLimit en la configuración al iniciar el búho, entonces

esta función es mejor en OnInit() en lugar de OnTick()

 
Vitaly Muzichenko:

Si no me equivoco, se puede escribir así

En realidad lo escribo así.

if(TimeHour(time[i])>=Time_Start&&TimeHour(time[i])<TimeFinish)

o incluso más simple

if(Hour()>=Time_Start&&Hour()<TimeFinish)
 

Buenas tardes, ¿podrían decirme cómo promediar correctamente la línea del indicador? La curva básica con periodo Per_1 se dibuja normalmente ( Buffer_1[]), hasta que añado un bloque de promediado simple con Buffer_2[] con periodo de promediado Per_2.

int OnCalculate(parámetros por defecto)

{

int i, j, límite;

if(rates_total <= Per_1)

return(0);

//La última barra calculada será recalculada

limit = rates_total - prev_calculated - Per_1;

if(prev_calculado > 0)

límite++;

//calcular y rellenar los buffers de los indicadores

for(i=0; i < límite; i++)

{

//Calcular la línea principal del indicador

Buffer_1[i] = Fórmula de la curva

double Suma = 0;

for(j = i; j < Per_2 + i; j++)

{

//Calcular la línea de promedio

Suma += Buffer_1[j];

Buffer_2[i] = Suma / Per_2;

}

}

return(rates_total);

}

 
 
Eugen8519:
Ese es el problema, sólo abre y cierra las órdenes starthour->stophour
Y las órdenes abiertas no se cierran después de la hora límite

Porque no se puede negociar después del stophour

Llevo mucho tiempo escribiendo la lógica de la apertura antes del cierre, el arrastre y otros mantenimientos de posición. En la mayoría de los casos es cierto, antes de abrir algo más, hay que comprobar lo que ya está abierto.

Tu lógica es correcta, sólo tienes que intercambiar los bloques:

MqlDateTime str;
void OnTick()
 {
 // Close Positions
 TrailingStop();

 if(условие_закрытия)
  {
   ClosePos();
  }

 // Open Positions
 if(UseTimeLimit)
  {
    TimeCurrent(str);
    if(str.hour > startHour && str.hour < stopHour)
     {
      OpesPos(...);
      ...
     }
  }
// end
}
 

¡Genial! Funciona, ¡gracias!

Razón de la queja: